spring-bean的生命周期

这里拿两个类进行举例

app.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="user" class="com.java12.spring.life.UserLife.User" lazy-init="true">
        <property name="beanName" value="guozhibo"></property>
    </bean>
    <bean id="admin" class="com.java12.spring.life.admin.Admin" init-method="init" destroy-method="aa"></bean>
</beans>

User

public class User implements BeanNameAware{

    private String beanName;
    private String name;

    public void setName(String name) {
        System.out.println("给属性赋值");
        this.name = name;
    }

    public User() {
        System.out.println("对象被实例化");
    }

    public User(String beanName) {
        this.beanName = beanName;
    }

    public String getBeanName() {
        return beanName;
    }

    @Override
    public void setBeanName(String s) {
        this.beanName = s;
    }

    @Override
    public String toString() {
        return "User{" +
                "beanName='" + beanName + '\'' +
                '}';
    }
}public class User implements BeanNameAware{

    private String beanName;
    private String name;

    public void setName(String name) {
        System.out.println("给属性赋值");
        this.name = name;
    }

    public User() {
        System.out.println("对象被实例化");
    }

    public User(String beanName) {
        this.beanName = beanName;
    }

    public String getBeanName() {
        return beanName;
    }

    @Override
    public void setBeanName(String s) {
        this.beanName = s;
    }

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

BeanNameAware实现这个接口,可以用于测试执行过程

spring在执行过程中,首先会实例化这个类,然后去给属性赋值,紧接着调用BeanNameAware下的setBeanName这个方法

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Admin 

public class Admin implements BeanFactoryAware{

    private BeanFactory beanFactory;



    private ApplicationContext applicationContext;
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
        System.out.println("这是第二步通过BeanFactoryAware获取容器");

    }
}

实现BeanFactoryAware这个接口,就回调用setBeanFactory这个方法,这里可以拿到spring容器中的实例,可以对之就行加工

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

public class Admin implements BeanFactoryAware,ApplicationContextAware{

    private BeanFactory beanFactory;



    private ApplicationContext applicationContext;
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
        System.out.println("这是第二步通过BeanFactoryAware获取容器");

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        int beanDefinitionCount = applicationContext.getBeanDefinitionCount();
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String str:beanDefinitionNames) {
            System.out.println(str);
        }
        System.out.println("第三步获取所有id:"+beanDefinitionCount);
    }

实现了ApplicationContextAware这个接口,就会调用setApplicationContext这个方法,这里可以获取到容器中所有的bean,我们可以对其进行修饰

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

public class Admin1 implements InitializingBean,BeanPostProcessor{
    
    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("预------------------------"+o);
        return o;
    }

@Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("aaaaaaaaaaaaaaaaaaaa");
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("初始化");
        return o;
    }   }    

    
}

实现InitializingBean接口,就回调用他自己的初始化方法,对于整个容器而言,谁实现了这个接口,就在实现的那个地方进行初始化   这一步在预初始化之前的后面执行       执行顺序如图所示

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用。如果既采用init-method属性指定初始化方法,又实现InitializingBean接口来指定初始化方法的话,Spring会先执行InitializingBean接口中定义的方法,然后执行init-method属性指定的方法。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bean完成一系列初始化工作可以被使用了

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

最后

public class Admin implements DisposableBean{
 @Override
    public void destroy() throws Exception {
        System.out.println("默认销毁");
    }

    private void aa() {
        System.out.println("手动销毁");
    }
}

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

猜你喜欢

转载自blog.csdn.net/xiaosuanmiao123/article/details/82501983