• Spring Bean的生命周期及其应用


    一、什么是Bean?

    In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

    Bean是一个由Spring IoC容器实例化、组装和管理的对象,bean就是一个实例。

     

    二、Bean 的完整生命周期

    Bean从创建-参与计算流程-销毁,spring通过IOC控制翻转进行操作,所以bean的整个生命周期都会暴露操作实例的方法,通过这些方法,可以更加灵活的操控每个实例对象。

    下面展示了一个Bean的构造过程

    深究Spring中Bean的生命周期

    Bean 的生命周期

    1. Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化,配置文件中<bean>表示一个bean,也可以使用各种注解

    2. 然后对Bean在文件或注解中设置的属性等进行注入;

    3. 如果Bean实现了BeanNameAware接口,Spring将Bean的Id传递给setBeanName()方法,此处可以重新修改beanName;

    4. 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;

    5. 如果Bean实现了ApplicationContextAware接口,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

    6. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

    7. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

    8. 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

    9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

    10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

    记忆方法:数猪名 工厂上下 初始化四阶段 系统自我销毁 

    三、生命周期中函数在开发中有什么用

    我以前看到bean的生命周期的时候只是简单的记住它的顺序,感觉没什么用,真的是to yong to simple;

    1.属性注入

    <bean id="car1" class="com.demo.Car">
            <property name="name" value="宝马"></property>
            <property name="price" value="100000"></property>
    </bean>

    这样在car的类中有一个

    public Car(String name,double price){
        this.name=name;
        this.price=price;
    }

    就可以实现一个设置好初始值得一个bean

    2.BeanNameAware接口,有一个setBeanName方法

    可以在类中新建一个String beanName变量,通过setBeanName进行复制,这样就可以知道这个bean的Name,

    上面的id="car1" 也会通过这个setBeanName传入到实例中;

    3.BeanFactoryAware接口,可以获得创建这个实例的工厂方法

    BeanFactory  可以获得或者设置类
    String FACTORY_BEAN_PREFIX = "&";
    
        Object getBean(String var1) throws BeansException;
    
        <T> T getBean(String var1, Class<T> var2) throws BeansException;
    
        <T> T getBean(Class<T> var1) throws BeansException;
    
        Object getBean(String var1, Object... var2) throws BeansException;
    
        boolean containsBean(String var1);
    
        boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
    
        Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
    
        String[] getAliases(String var1);

    4.ApplicationContextAware  可以获得ApplicationContext 上下文,

    applicationContext.getBeansOfType(RegistryConfig.class
    applicationContext可以通过getBeansOfType获得所有已经继承RegistryConfig这个配置文件的实例Map,
    Map的key是beanName value是对应的实例,这样这个类需要什么配置就能很好的确定

    5.BeanPostProcessor接口的postProcessBeforeInitialization 、postProcessAfterInitialization

    是在系统初始化和自定义初始化之前和之后的一些处理方法,针对所有Spring上下文中所有的bean,
    可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,

    然后对所有的bean进行一个初始化之前和之后的代理



    6.InitializingBean接口,afterPropertiesSet是系统的初始化方法,此处可以对父类做一些基本的初始化
    7.调用自己定义的初始化方法
    <bean id="beanA"  class="classA"  init-method="anotherInit">
    
    </bean>

    init-method 配置的初始化方法

    8.DisposableBean 系统销毁时调用的方法

    9.自定义销毁方法:

    <bean class="com.demo" init-method="start" destroy-method="destroy">
    </bean>

    destroy-method方法



  • 相关阅读:
    apktool 在mac下的使用 -反编译安卓apk文件
    通过Stetho在Chrome上调试Android App
    Android Studio 遇到 No Debuggable Applications 的解决方案
    安装Eclipse Maven插件的方法
    Android如何实现点击一次返回键返回桌面而不是退出应用
    安卓7.0遇到 android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
    由Memcached使用不当而引发性能问题的两个经验总结
    对MySql查询缓存及SQL Server过程缓存的理解及总结
    由Java中toString()方法引发的无意识的递归想到的
    为什么不能把委托(delegate)放在一个接口(interface)当中?
  • 原文地址:https://www.cnblogs.com/becoding/p/13416766.html
Copyright © 2020-2023  润新知