Spring其实就是一个管理Bean对象的工厂.它负责对象的创建,对象的销毁.
这样我们才可以知道在哪个时间节点上调用了哪个类的哪个方法,知道代码该写在哪里
Bean的生命周期之粗略5步
Bean生命周期的管理可以参考Spring的源码:
AbstractAutowireCapableBeanFactory
Bean的生命周期之粗略7步
比前面增加了两步,这两步放在上面第三步:初始化Bean 自定义init方法的前后
可以假如"Bean后处理器"
需要这个类实现BeanPostProcessor类,并重写before和after方法
Bean的生命周期10步
就是又增加了三个接口
Aware相关的接口包括:BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
当Bean实现了BeanNameAware,Spring会将Bean的名字传递给Bean
当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean
当Bean实现了BeanFactoryAware,Spring会将Bean工厂对象传递给Bean
测试以上十步,让类实现5个接口,并实现所有方法:
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
InitializingBean
DisposableBean
package com.example.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
/**
* Bean的生命周期按照粗略的5步:
* 1.实例化Bean(调用无参构造方法)
* 2.给Bean属性赋值(调用set方法)
* 3.调用init方法,注意这个init方法需要自己写,自己配(方法名随意)
* 4.可以使用bean
* 5.销毁Bean,会调用destroy方法,需要自己写,自己配(方法名随意)
* @author hrui
* @date 2023/9/24 3:16
*/
public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean ,DisposableBean{
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("第三步:调用initBean方法");
}
public void destoryBean(){
System.out.println("第五步:destoryBean方法销毁Bean");
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.println("这个Bean的类加载器:"+classLoader);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("这个Bean的BeanFactory:"+beanFactory);
}
@Override
public void setBeanName(String name) {
System.out.println("这个Bean的Name:"+name);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean的afterPropertiesSet方法");
}
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean的destroy方法");
}
}
Bean的生命周期中,不同的作用域有不同的管理方式
Spring是根据Bean的作用域来选择管理方式的.
对于singleton作用域的Bean,Spring能够精确地知道该Bean何时被创建,合适初始化,以及何时被销毁
而对于protoType作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean的实例就交给客户端代码管理,Spring容器将不再跟踪其生命周期.
Spring容器只对singleton的bean进行完整的生命周期管理
如果是prototype作用域的Bean,Spring容器只负责将该Bean初始化完毕.等客户端程序一旦获取到该Bean之后,Spring容器就不再管理该对象生命周期
也就是说scope是prottype的Bean执行完"Bean后处理器"交给客户端使用后就不管了
将自己new的对象让Spring管理
有时候可能会遇到这样的需求,某个java对象是我们自己new的,然后我们希望这个对象被Spring容器管理,怎么实现.
之前都是Spring配置文件中配置,然后纳入Spring容器管理
如果我们想让该对象让Spring容器管理,但是又不想在配置文件里配置怎么办
例如
但是这个Bean并不由Spring管理
怎么办?用
DefaultListableBeanFactory注册