1. 程式人生 > >Spring Boot(三)Spring4擴充套件分析(一)

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容器。