bean创建过程spring BeanFactory的实现spring aware
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bean创建过程spring BeanFactory的实现spring aware相关的知识,希望对你有一定的参考价值。
Bean的创建过程:
Spring beanFactory的工厂模式实现:
解析<bean>标签,存到一个Map<String, Object> beans中
People o = (People)factory.getBean("p");
因为map存的是object类型,所以取出时需要强制类型转换
Bean的生命周期:
spring aware的目的是为了让Bean获得spring容器的服务,bean继承applicationContextAware可以获得spring容器的所有服务,但原则上还是用到什么接口,继承什么接口。(如beanNameAware,BeanFactoryAware...)
beanNameAware接口:获得本身bean的id属性。
void setBeanName(String name)
该方法的name参数就是该bean的id属性,调用setBeanName方法可以让bean获取得自身的id属性
@Service public class BeanNameAwareTest implements BeanNameAware {
private String name;
@Override
public void setBeanName(String name) {
System.out.println("setBeanName方法,id是"+name);
this.name = name;
}
public String getBeanName() {
return this.name;
}
}
获取bean:
@Autowired private BeanNameAwareTest beanNameAwareTest;
public void aware() {
System.out.println("beanName:"+beanNameAwareTest.getBeanName());
beanNameAwareTest.setBeanName("beanName");
System.out.println("beanName:"+beanNameAwareTest.getBeanName());
}
结果:
setBeanName方法,id是beanNameAwareTest//bean被实例化时自动调用的
beanName:beanNameAwareTest
setBeanName方法,id是beanName//手动调用的setBeanName方法 beanName:beanName
BeanFactoryAware接口:相应的beanfactory的实例引用
void setBeanFactory(BeanFactory beanFactory)
通过这个方法的参数创建它的BeanFactory实例,实现了BeanFactoryAware接口,就可以让Bean拥有访问Spring容器的能力。缺点:导致代码与spring的api耦合在一起。
@Service
public class BeanFactoryAwareTest implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
获取bean工厂进行bean操作:
@Autowired
private BeanFactoryAwareTest beanFactoryAwareTest;
public void aware() {
System.out.println("通过bean工厂得到一个bean:"+beanFactoryAwareTest.getBeanFactory().getBean("beanFactoryAwareTest"));
}
ApplicationContextAware接口:被注入applicationContext实例
setApplicationContext(ApplicationContext context)
使用参数context用来创建它的applicationContext实例,缺点:导致代码与spring的api耦合在一起。
public class ContextAwareTest implements ApplicationContextAware{
@Override
public void setApplicationContext(ApplicationContext arg0){
applicationContext = arg0;
People= (People)applicationContext.getBean("people");
}
}
使用场景:
比如,根据环境的不同,target需要对应不同的资源,可以首先加载一个source类,其中有一个与环境有关的属性mode;
得到beanFactory,getBean(source)再对其mode属性判断,做出不同的处理,get相同的bean,赋给target
以上是关于bean创建过程spring BeanFactory的实现spring aware的主要内容,如果未能解决你的问题,请参考以下文章