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