网站建设销售人才简历,铜川做网站的公司电话,wordpress手游,wordpress 取消标签一、Bean 的生命周期
Spring 其实就是一个管理 Bean 对象的工厂#xff0c;它负责对象的创建#xff0c;对象的销毁等
所谓的生命周期就是#xff1a;对象从创建开始到最终销毁的整个过程
什么时候创建 Bean 对象#xff1f;创建 Bean 对象的前后会调用什么方法#xf…一、Bean 的生命周期
Spring 其实就是一个管理 Bean 对象的工厂它负责对象的创建对象的销毁等
所谓的生命周期就是对象从创建开始到最终销毁的整个过程
什么时候创建 Bean 对象创建 Bean 对象的前后会调用什么方法Bean 对象什么时候销毁Bean 对象的销毁前后调用什么方法 为什么需要知道 Bean 的生命周期
其实生命周期的本质是在哪个时间节点上调用了哪个类的哪个方法
我们需要充分的了解在这个生命线上都有哪些特殊的时间节点
只有我们知道了特殊的时间节点都在哪到时我们才可以确定代码写到哪
我们可能需要在某个特殊的时间点上执行一段特定的代码这段代码就可以放到这个节点上当生命线走到这里的时候自然会被调用 二、Bean 生命周期之 5 步
Bean 生命周期的管理可以参考Spring的源码AbstractAutowireCapableBeanFactory 类的 doCreateBean() 方法 Bean 生命周期可以粗略的划分为五大步 第一步实例化Bean 第二步Bean属性赋值 第三步初始化Bean 第四步使用Bean 第五步销毁Bean package org.qiu.spring.bean;/*** Bean 的生命周期粗略的五步* 第一步实例化 Bean调用无参数构造方法* 第二步Bean 属性赋值调用 setter 方法* 第三步初始化 Bean调用 Bean 的 init 方法这个 init 方法需要自己写自己配* 第四步使用 Bean* 第五步销毁 Bean调用 Bean 的 destroy 方法这个 destroy 方法需要自己写自己配** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-10:45* since 1.0*/
public class User {private String name;public void setName(String name) {System.out.println(第二步给对象的属性赋值);this.name name;}public User() {System.out.println(第一步无参数构造方法执行);}public void initBean(){System.out.println(第三步初始化 Bean);}public void destroyBean(){System.out.println(第五步销毁 Bean);}
}
!-- 需要手动指定初始化方法和销毁方法 --
bean iduser classorg.qiu.spring.bean.User init-methodinitBean destroy-methoddestroyBeanproperty namename value张三/
/bean
Test
public void testBeanLifecycleFive(){ApplicationContext application new ClassPathXmlApplicationContext(spring.xml);User user application.getBean(user, User.class);System.out.println(第四步使用 Bean user);// 必须手动关闭 Spring 容器这样 Spring 容器才会销毁 BeanClassPathXmlApplicationContext context (ClassPathXmlApplicationContext) application;context.close();
}
运行结果 需要注意的 第一只有正常关闭 Spring 容器bean 的销毁方法才会被调用 第二ClassPathXmlApplicationContext 类才有 close() 方法 第三配置文件中的 init-method 指定初始化方法。destroy-method 指定销毁方法 三、Bean 生命周期之 7 步
在以上的5步中第3步是初始化 Bean如果你还想在初始化前和初始化后添加代码可以加入“Bean后处理器”
如果加上Bean后处理器的话Bean的生命周期就是7步了 编写一个类实现 BeanPostProcessor 类并且重写 before 和 after 方法
package org.qiu.spring.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-11:11* since 1.0*/
public class LogBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(第三步Bean后处理器的before方法执行即将开始初始化);return bean;}/*** param bean 刚创建的 Bean 对象* param beanName Bean 的名字* return* throws BeansException*/Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(第五步Bean后处理器的after方法执行已完成初始化);return bean;}
}
!-- 配置 Bean 后处理器作用于整个配置文件中所有的 Bean --
bean classorg.qiu.spring.bean.LogBeanPostProcessor/
Test
public void testBeanLifecycleFive(){ApplicationContext application new ClassPathXmlApplicationContext(spring.xml);User user application.getBean(user, User.class);System.out.println(第六步使用 Bean user);// 必须手动关闭 Spring 容器这样 Spring 容器才会销毁 BeanClassPathXmlApplicationContext context (ClassPathXmlApplicationContext) application;context.close();
} 运行结果 四、 Bean 生命周期之 7 步
如果根据源码跟踪可以划分更细粒度的步骤10步 上图中检查 Bean 是否实现了Aware 的相关接口是什么意思
Aware相关的接口包括BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 当 Bean 实现了 BeanNameAwareSpring 会将 Bean的名字传递给 Bean 当 Bean 实现了 BeanClassLoaderAwareSpring 会将加载该 Bean的类加载器传递给 Bean 当 Bean 实现了 BeanFactoryAwareSpring 会将 Bean工厂对象传递给 Bean 测试以上10步可以让 User 类实现5个接口并实现所有方法 BeanNameAware BeanClassLoaderAware BeanFactoryAware InitializingBean DisposableBean package org.qiu.spring.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-10:45* since 1.0*/
public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {private String name;public User() {System.out.println(第一步无参数构造方法执行);}public void setName(String name) {System.out.println(第二步给对象的属性赋值);this.name name;}public void initBean(){System.out.println(第六步初始化 Bean);}public void destroyBean(){System.out.println(第十步销毁 Bean);}Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println(第三步类加载器 classLoader);}Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println(第三步Bean工厂 beanFactory);}Overridepublic void setBeanName(String name) {System.out.println(第三步Bean名字 name);}Overridepublic void destroy() throws Exception {System.out.println(第九步DisposableBean destroy);}Overridepublic void afterPropertiesSet() throws Exception {System.out.println(第五步afterPropertiesSet执行);}
}
package org.qiu.spring.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-11:11* since 1.0*/
public class LogBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(第四步Bean后处理器的before方法执行即将开始初始化);return bean;}/*** param bean 刚创建的 Bean 对象* param beanName Bean 的名字* return* throws BeansException*/Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(第七步Bean后处理器的after方法执行已完成初始化);return bean;}
}
Test
public void testBeanLifecycleFive(){ApplicationContext application new ClassPathXmlApplicationContext(spring.xml);User user application.getBean(user, User.class);System.out.println(第八步使用 Bean user);// 必须手动关闭 Spring 容器这样 Spring 容器才会销毁 BeanClassPathXmlApplicationContext context (ClassPathXmlApplicationContext) application;context.close();
}
运行结果 通过测试可以看出来 InitializingBean 的方法早于 init-method 的执行 DisposableBean 的方法早于 destroy-method 的执行
对于 SpringBean 的生命周期掌握之前的7步即可 Bean 生命周期五步
1、实例化 Bean
2、给 Bean 的属性赋值
3、初始化 Bean
4、使用 Bean
5、销毁 Bean Bean 生命周期七步
1、实例化 Bean
2、给 Bean 的属性赋值
3、执行“Bean后处理器”的 before 方法
4、初始化 Bean
5、执行“Bean后处理器”的 after 方法
6、使用 Bean
7、销毁 Bean Bean 声明周期十步
1、实例化 Bean
2、给 Bean 的属性赋值
3、点位一
4、执行“Bean后处理器”的 before 方法
5、点位二
6、初始化 Bean
7、执行“Bean后处理器”的 after 方法
8、使用 Bean
9、点位三
10、销毁 Bean
点位1检查Bean是否实现了Aware相关的接口如果实现了接口则调用执行接口中的方法
点位2检查Bean是否实现了InitializingBean接口如果实现了则调用接口中的方法
点位3检查Bean是否实现了DisposableBean接口如果实现了则调用接口中的方法
的是为了给你专递一些数据让你更加方便使用 添加这三个点位的特点
都是在检查这个 Bean 是否实现了某些特定的接口如果实现了执行接口则 Spring 容器会调用这个接口中的方法 五、Bean 的作用域不同管理方式不同
Spring 根据 Bean 的作用域来选择管理方式 对于 singleton 作用域的 BeanSpring 能够精确地知道该 Bean 何时被创建何时初始化完成以及何时被销毁 而对于 prototype 作用域的 BeanSpring 只负责创建当容器创建了 Bean 的实例后Bean 的实例就交给客户端代码管理Spring 容器将不再跟踪其生命周期
把 User 类的 spring.xml 文件中的配置 scope 设置为 prototype
!-- 需要手动指定初始化方法和销毁方法 --
bean iduser classorg.qiu.spring.bean.User init-methodinitBean destroy-methoddestroyBean scopeprototypeproperty namename value张三/
/bean
执行测试程序 通过测试一目了然只执行了前8步第9和10都没有执行 六、自己 new 的对象如何让 Spring 管理
有些时候可能会遇到这样的需求某个 java 对象是我们自己 new 的然后我们希望这个对象被 Spring 容器管理怎么实现
package org.qiu.spring.bean;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-10:45* since 1.0*/
public class User(){
}
Test
public void testBeanRegister(){// 自己new的对象User user new User();System.out.println(user);// 创建 默认可列表BeanFactory 对象DefaultListableBeanFactory factory new DefaultListableBeanFactory();// 注册Beanfactory.registerSingleton(userBean, user);// 从spring容器中获取beanUser userBean factory.getBean(userBean, User.class);System.out.println(userBean);
}
执行结果 一 叶 知 秋奥 妙 玄 心