java bean的生命周期,java bean作用域
00-1010 1.bean的作用域1.1 Watch case 1.2作用域的定义1.3 Bean的六个作用域1.4如何设置Bean的作用域 @ scope(可配置Bean factory . scope _ prototype)@ scope(" prototype ")注:2。bean的生命周期2.1 bean的执行过程2.2 bean的生命周期2.3生命周期演示代码配置测试运行主代码xml检查结果
目录
00-1010现在有一个公共Bean。
@ component public class UserBean { @ Bean public User User 1(){ User User=new User();user . setid(1);User.setName(张三);user . setage(18);返回用户;}}现在有一个用户1执行了修改后的操作。
@ controller public class UserControllerA { @ auto wired private User User 1;公共用户get User 1(){ User User=User 1;system . out . println( user 1修改前的3360 user 1);User.setName(王五);返回用户;}}现在有用户2,正在阅读。
@ controller public class UserControllerB { @ auto wired private User User 1;公共用户get User 1(){ User User=User 1;返回用户;}}打印用户1和用户2的公共Bean的值。
public static void main(String[]args){ application context context=new classpathmlaplicationcontext( spring . XML );UserControllerA UserControllerA=context . getbean( UserControllerA ,UserControllerA . class);user user=usercontrollera . get user 1();System.out.println(用户1修改后的 3360 用户);UserControllerB UserControllerB=context . get bean( UserControllerB ,UserControllerB . class);用户user 1=usercontrollerb . get user 1();System.out.println (3360 user1被user2读取);}运行结果
原因:
默认情况下,Spring Bean的范围是singleton singleton模式。每个人都使用相同的对象。
00-1010之前提到的作用域是指程序中定义的某个变量的某个区域,称为作用域。这里的Bean范围是不同的。
Bean的范围是指Spring的整个框架中: Bean的某个行为模式,
例如,singleton singleton范围意味着整个Spring中只有一个Bean,并且是全局共享的。然后,当其他人修改这个值时,另一个人会读取修改后的值。
00-1010当Spring容器初始化一个Bean的实例时,它也指定了该实例的范围。
Spring有六个范围。
Singleton:单实例范围prototype:原型范围(多实例范围)请求:请求范围会话:回复范围ap
plication: 全局作用域websocket
: HTTP WebSocket 作用域3~6 这四种是 Spring MVC 中的值.
1.4 如何设置 Bean 的作用域
@Scope 既可以用于方法注解, 也可以用于类注解
① @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
② @Scope(prototype)
注意事项:
如果是 @Bean + @Scope , 这里的@Scope 就不能写成类注解的方式了.
2. Bean 的生命周期
2.1 Bean 的执行流程
启动 Spring 容器加载 Spring 配置文件加载 Spring 配置文件中的 Bean, 或根据配置文件中的组件根路径, 进行 Bean 对象的扫描(扫描@Controller…)Bean 注册到 Spring 中执行完毕,执行销毁操作
2.2 Bean 生命周期
Bean 的生命周期分为 5 大部分:
实例化 Bean (为Bean分配内存空间)
设置属性 (Bean 进行初始化注入)
Bean 初始化 (一系列准备工作)
① 各种通知 (xxxAware
)
② 执行初始化前置方法 BeanPostProcessor
③ 执行 @PostConstruct
初始化方法
④ 执行 init-mehtod
初始化方法
⑤ 执行初始化后置方法 BeanPostProcessor
使用 Bean
销毁 Bean
① 执行销毁前方法 @PreDestory
② 如果有接口 DisposableBean
, 执行实现方法③ 执行销毁前的方法 destory-method
2.3 生命周期演示代码
主要代码
package com.wwzz.util;import org.springframework.beans.factory.BeanNameAware;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;@Componentpublic class BeanLifeComponent implements BeanNameAware { @Override public void setBeanName(String s) { System.out.println("执行通知: BeanNameAware " + s); } @PostConstruct public void postConstruct(){ System.out.println("执行 @PostConstruct"); } public void init() { System.out.println("执行 init-method"); } @PreDestroy public void preDestroy(){ System.out.println("执行 @PreDestroy"); } public void destroy() { System.out.println("执行 destroy"); }}
xml 的配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置 Spring 扫描的根路径(此根路径下的所有 Spring 存对象的注解才能生效) --> <content:component-scan base-package="com.wwzz"></content:component-scan> <beans> <bean id="beanLifeComponent" class="com.wwzz.util.BeanLifeComponent" init-method="init" destroy-method="destroy"></bean> </beans></beans><?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置 Spring 扫描的根路径(此根路径下的所有 Spring 存对象的注解才能生效) --> <content:component-scan base-package="com.wwzz"></content:component-scan> <beans> <bean id="beanLifeComponent" class="com.wwzz.util.BeanLifeComponent" init-method="init" destroy-method="destroy"></bean> </beans></beans>
测试运行
public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); BeanLifeComponent beanLifeComponent = context.getBean("beanLifeComponent",BeanLifeComponent.class); context.destroy(); }
查看结果
到此这篇关于Java深入讲解Bean作用域与生命周期的文章就介绍到这了,更多相关Bean作用域与生命周期内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。