Bean的建立过程:
spring
Spring beanFactory的工厂模式实现:api
解析<bean>标签,存到一个Map<String, Object> beans中app
People o = (People)factory.getBean("p");ide
由于map存的是object类型,因此取出时须要强制类型转换this
Bean的生命周期:spa
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