SpringBean的生命周期

SpringBean的生命周期:

Spring容器可以管理singleton作用域的Bean的生命周期

  • singleton
    在此作用域下,Spring能够精确的知道该Bean何时作用域被创建,何时初始化完成,以及何时被销毁。
  • prototype
    prototype作用域的Bean, Spring只 负责创建,当容器创作用域建了Bean实例后,Bean的实例就交给客户端代码来管理,Spring容器将不再跟踪其生命周期。

在这里插入图片描述

特别要记住一点,Spring是根据beanDefinition来创建Spring bean的

为什么不直接使用对象的class对象来创建bean呢?

因为在class对象仅仅能描述一个对象的创建,它不足以用来描述一个Spring bean,而对于是否为懒加载、是否是首要的、初始化方法是哪个、销毁方法是哪个,这个Spring中特有的属性在class对象中并没有,所有Spring就定义了beanDefinition来完成bean的创建。

步骤如下:

Spring有 BeanDefinition来存储着我们日常给Spring Bean定义的元数据(@Scope、 @Lazy、@DependsOn等)

Spring启动时进行扫描注解或者XMl或者JavaConfig中需要被Spring进行管理的Bean

封装进BeanDefinition再放入BeanDefinitionMap(K是BeanName,V是BeanDefinition)加载数据但未实例化

  • 调用构造方法进行创建一个Bean的实例;
  • 如有此Bean对象有相关属性,进行set方法设置属性值;
  • 然后根据Bean对象是否实现某些感知接口(Awave)
    • 如果实现了SetBeanNameAware接口,重写setBeanName方法,传入Bean的名字;
    • 如果实现了SetBeanClassLoaderAware接口,重写setBeanClassLoader方法,传入ClassLoader的实例;
    • 如果实现了SetBeanFactoryAware接口,重写setBeanFactory方法,传入BeanFactory
    • …对应实现***Aware接口,就重写对应的方法
  • 如果此Bean对象有和BeanPostProcessor对象有关的话,重写postProcessBeforeInitialization方法,在Bean对象初始化之前执行一些操作
  • 如果Bean对象实现了InitializingBean接口,重写afterPropertiesSet方法,进行初始化Bean对象
  • 如果Bean对象有对应的init-method方法,则执行对应的方法
  • 如果此Bean对象有和BeanPostProcessor对象有关的话,重写postProcessAfterInitialization方法,在Bean对象初始化之后执行一些操作
  • 如果Bean对象实现了DisposableBean接口,则要销毁Bean的时候执行initDestory方法
  • 如果Bean对象有对应的destroy-method方法,执行指定的方法。

在这里插入图片描述

Bean对象:

public class MyBean implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean ,BeanClassLoaderAware{

    private String name;

    public MyBean() {
        System.out.println("构造方法");
    }

    public void setName(String name) {
        System.out.println("属性的set方法");
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyBean{" +
                "name='" + name + '\'' +
                '}';
    }

    public void initBefore(){
        System.out.println("初始化前方法");
    }

    public void initDestory(){
        System.out.println("摧毁方法");
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("setBeanFactory");
    }

    public void setBeanName(String name) {
        System.out.println("setBeanName");
    }

    public void destroy() throws Exception {
        System.out.println("DisposableBean");

    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean");
    }


    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("setBeanClassLoader");
    }
}

测试对象:

public class test {
    public static void main(String[] args) {
        Resource resource  = new ClassPathResource("bean.xml");

        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

        beanDefinitionReader.loadBeanDefinitions(resource);

        beanFactory.addBeanPostProcessor(new MyPostProcessor());

        Object bean = beanFactory.getBean("MyBean");
        beanFactory.destroySingletons();
        System.out.println(bean);
    }
}

BPP对象:

public class MyPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization");
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization");
        return bean;
    }
}

注入:

<bean id="MyBean"
          class="com.xiao.BeanLifeCycle.MyBean"
          init-method="initBefore"
          destroy-method="initDestory">
			<property name="name" value="Bean对象的生命周期"></property>
</bean>

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值