Spring Boot(三)Spring4擴充套件分析(一)
1. 將Bean加入到Spring容器裡(讓Spring 進行管理),有2鍾方法
1.使用 一些指定的註解 @Component , @Controller , @Service , @Repository 等
2.建立一個 配置類 ,在類裡 建立一個 返回 想要載入的 Bean 的方法
1.給配置類加 註解 @Configuration
2.建立一個 返回 User.class Bean的方法
3.給 該方法 加註解 @Bean
@Configuration
public class MyConfig {
@Bean
public User getUsre(){
return new User();
}
}
2. 獲取 Bean
1.通過類名 獲取
1. 通過 類.class
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.aa.b");
context.getBean(User.class)
2. 通過 類的名稱 獲取 ,如 獲取 User.class
1.AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.aa.b");
context.getBean("user")
2. 類的名稱要小寫
2.通過 配置類中 方法的名稱 ,來獲取
3.通過型別 獲得Bean 時
1. Spring容器裡 只有 一個該型別的Bean
可以用 context.getBean(User.class) 來獲得
2. Spring容器裡 只有 多個該型別的Bean
只能用 context.getBeansOfType(User.class) 來獲得,否則 報錯
3. 將 ApplicationContext 注入 有3種方法
1.直接用 @Autowired 或 @Resource 或 @Inject 來註解
1.在一個Bean類裡, 新增 ApplicationContext 屬性
2.用 @Autowired 或 @Resource 或 @Inject 來註解 ApplicationContext 屬性
2.實現 ApplicationContextAware
1.讓一個 Bean類 實現 ApplicationContextAware 介面
2.在這個Bean類裡 新增 ApplicationContext 屬性
3.在重寫 方法 setApplicationContext 中 加 this.applicationContext=applicationContext
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
3.通過構造方法
1.在一個Bean類裡, 新增 ApplicationContext 屬性
2.構建 該Bean的帶 ApplicationContext 引數 的建構函式,在建構函式 中加 this.pplicationContext=applicationContext
private ApplicationContext applicationContext;
public Bank(ApplicationContext applicationContext){
this.pplicationContext=applicationContext;
}
-----
3.Spring4.3新特性
1.建構函式只能有一個,如果有多個,則必須有一個無參的建構函式.此時,Spring會呼叫無參的建構函式
2.建構函式的引數,都必須都要Spring容器裡
4. 實現 BeanPostProcessor 介面 ,Bean的後置處理器 --對指定的Bean做一些處理,比如返回該物件的代理物件
1.建立一個新的類 ,實現 BeanPostProcessor 介面
2.在該類裡 重寫 2個方法 postProcessBeforeInitialization() ,postProcessAfterInitialization()
1.postProcessBeforeInitialization
1.方法, 是在 Bean依賴裝配(屬性設定完)完成之後觸發
2.這裡可以對指定的Bean做一些處理,比如返回該物件的代理物件
2.postProcessAfterInitialization 方法, 是在bean init方法執行之後觸發的
5. 將 ApplicationContext 注入 第2種方法中實現的原理
1.在一個類中 實現一個Spring 特定的介面 BeanPostProcessor ,來對 ApplicationContext 做一些處理
2.執行BeanPostProcessor 介面 中的 postProcessBeforeInitialization()方法。
3. postProcessBeforeInitialization(Object bean,String beanName)方法,中加一個if判斷
1.
private Object postProcessBeforeInitialization(Object bean,String beanName){
if(bean instanceof User){
return new ApplicationContext();
}
}
2. ApplicationContext 是User Bean中的屬性 。Spring容器剛 注入 User Bean 後,
將 執行 postProcessBeforeInitialization(),在該方法裡 返回一個新建立的ApplicationContext 也就是將ApplicationContext注入Spring容器。