您的位置:首页 > 编程语言 > Java开发

Spring bean的生命周期

2017-12-18 20:51 555 查看


Instantiate:
Populate properties:依赖注入
BeanNameAware的setBeanName():
BeanFactoryAware的这个方法可以通过传入的工厂参数来获取
BeanPostProcessor的public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException:该方法很酷,它可以做的事情

LifeCycleBean.java
 
package com.lee.pojo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class LifeCycleBean implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{
private void info(String infoMsg){
System.out.println(infoMsg);
}

@Override
public void setBeanName(String arg0) {
info("步骤三:如果bean实现了BeanNameAware接口,Spring将bean的ID "+arg0+"传递给setBeanName方法");
}
@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
info("步骤四:如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory方法,将BeanFactory容器实例 "+arg0.hashCode()+"传入进来");
}
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
info("步骤五:如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext方法,将bean所在的应用上下文引用"+arg0.hashCode()+"传入进来");
}
@Override
public void afterPropertiesSet() throws Exception {
info("步骤七:如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用");
}

@Override
public void destroy() throws Exception {
info("步骤十:如果bean实现了DisposableBean接口 ,Spring将调用它的destroy接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用");
}

}

注意:这里的BeanFactory实例和ApplicationContext实例不是同一个对象,虽然ApplicationContext继承了BeanFactory接口,其实实际的情况是ApplicationContext的实现通常包含一个BeanFactory的实现。比如AnnotationConfigApplicationContext就有一个getBeanFactory()方法。

BeanPostProcessImpl.java
package com.lee.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class BeanPostProcessImpl implements BeanPostProcessor {
private void info(String infoMsg){
System.out.println(infoMsg);
}
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
info("步骤六:如果有一个公共的bean实现了BeanPostProcessor接口,"
+ "\n\tSpring将调用它们的postProcessBeforeInitialization方法arg0="+arg0+" arg1="+arg1);
return arg0;
}

@Override
public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
info("步骤八:如果如果有一个公共的bean实现了BeanPostProcessor接口,"
+ "\n\tSpring将调用它们的postProcessAfterInitialization方法arg0="+arg0+" arg1="+arg1+
"\n\t这一步该bean就在容器中可以使用了");
return arg0;
}
}
注意:BeanPostProcessor的实现一个容器只需要一个,它能干的事就是,截获bean被初始(init-method)化前后,可以做一些修改然后返回给容器。

JavaConfig.java
package com.lee.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Configuration
@ComponentScan(basePackages= {"com.lee"})
public class JavaConfig {

}


M.java
package com.lee;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.lee.config.JavaConfig;

public class TestAnnotation {
public static void main(String[] args) {
AnnotationConfigApplicationContext atxt = new AnnotationConfigApplicationContext(JavaConfig.class);
atxt.close();
}
}


输出
步骤三:如果bean实现了BeanNameAware接口,Spring将bean的ID lifeCycleBean传递给setBeanName方法
步骤四:如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory方法,将BeanFactory容器实例 22541646传入进来
步骤五:如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext方法,将bean所在的应用上下文引用7125882传入进来
步骤六:如果有一个公共的bean实现了BeanPostProcessor接口,
Spring将调用它们的postProcessBeforeInitialization方法arg0=com.lee.pojo.LifeCycleBean@4d6e83 arg1=lifeCycleBean
步骤七:如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用
步骤八:如果如果有一个公共的bean实现了BeanPostProcessor接口,
Spring将调用它们的postProcessAfterInitialization方法arg0=com.lee.pojo.LifeCycleBean@4d6e83 arg1=lifeCycleBean
这一步该bean就在容器中可以使用了
一月 01, 2018 11:48:18 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
步骤十:如果bean实现了DisposableBean接口 ,Spring将调用它的destroy接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: