天天看點

Spring注解歸納

一、配置注解

1. @Configuration 告訴Spring這是一個配置類,此注解等同于配置檔案<bean></bean> (類上)

2. @ComponentScan value屬性:指定要掃描的包 (類上)

excludeFilters = Filter[] ,指定掃描的時候按照什麼規則排除哪些元件

FilterType.ANNOTATION 按照注解掃描

FilterType.ASSIGNABLE_TYPE 按照指定類型掃描

3. @Bean 注解在方法上,聲明目前方法的傳回值為一個bean,id預設是方法名。

二、聲明 bean 的注解

@Component 元件,沒有明确的角色

@Service 在業務邏輯層使用(service層)

@Repository 在資料通路層使用(dao層)

@Controller 在表現層使用,表示為SpringMVC的控制器

三、@Bean的屬性支援

@Scope 設定Spring容器建立Bean執行個體的類型(方法上,和@Bean一起使用)

prototype:多執行個體的,ioc容器啟動并不會去調用方法建立對象放在容器中,每次擷取的時候才會調用方法建立對象。

singleton:單執行個體的,ioc容器啟動會調用方法建立對象放到ioc容器中,以後每次擷取就是直接從容器中拿 (map.get())。

request:同一次請求建立一個執行個體。

session:同一個session建立一個執行個體。

四、@Import 導入元件

@Import 快速給容器中導入一個元件

1. @Import(要導入的元件) 容器中就會自動注冊這個元件,id預設是全類。

2. ImportSelector:傳回需要導入的元件的全類名數組(實作該接口)

3. ImportBeanDefinitionRegistrar :手動注冊bean到容器中(實作該接口)

五、bean 的生命周期

bean的聲明周期分為:bean建立---初始化---銷毀

1. 容器管理bean的生命周期

我們可以自定義初始化和銷毀方法,容器在bean 進行到目前生命周期的時候來調用我們自定義的初始化和銷毀方法。

調用無參構造(對象建立):

        單執行個體:在容器啟動的時候建立對象

        多執行個體:在每次擷取的時候建立對象

初始化:

        對象建立完成,并屬性指派好,調用初始化方法。。。

銷毀:

       單執行個體:容器關閉時候銷毀

       多執行個體:容器不負責管理這個 bean,容器不會調用銷毀方法。

2. 初始化和銷毀方式

1)指定初始化和銷毀方法

通過@Bean指定init-method和destory-method;

Spring注解歸納

2)通過讓 Bean 實作 InitializingBean(定義初始化邏輯),DisposableBean(定義銷毀邏輯)

3)可以使用JSR250:(使用在方法上)

@PostConstruct:在bean建立完成并且屬性指派完成,來執行初始化方法

@PreDestroy:在容器銷毀bean之前通知我們進行清理工作

4)BeanPostProcessor 接口 bean的後置處理器,在bean建立之後初始化完成前後進行一些處理工作

postProcessBeforeInitialization:初始化之前進行後置處理工作

postProcessAfterInitialization:初始化之後工作

Spring注解歸納

3. BeanPostProcessor原理 bean的後置處理器

源碼:

首先調用 populateBean(beanName, mbd, instanceWrapper);給bean進行屬性指派

然後調用 initializeBean 進行初始化 {

建立完bean之後初始化之前:applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

執行自定義初始化:invokeInitMethods(beanName, wrappedBean, mbd);

建立完bean之後初始化之後:applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

}

Spring底層對 BeanPostProcessor的使用:

   bean指派,注入其他元件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor 等都用到了BeanPostProcessor 。

六、元件指派

1. @Value 為屬性注入值

基本數值:@Value("科比")

SpEL表達式:@Value("#{20-2}")

取出配置檔案的值:@Value("${person.nickName}") person.nickName為 properties檔案中的屬性。

2. 自動裝配

Spring利用依賴注入(DI),完成對IOC容器中中各個元件的依賴關系指派。

1)@Autowired:自動注入:

      1)、預設優先按照類型去容器中找對應的元件:applicationContext.getBean(BookDao.class);找到就指派

      2)、如果找到多個相同類型的元件,再将屬性的名稱作為元件的id去容器中查找

      3)、@Qualifier("bookDao"):使用@Qualifier指定需要裝配的元件的id,而不是使用屬性名

      4)、自動裝配預設一定要将屬性指派好,沒有就會報錯。

         required屬性決定依賴注入是否必選,預設true,意味着沒有合适類型bean注入時,會抛出異常。

      5)、@Primary:讓Spring進行自動裝配的時候,預設使用首選的bean; 也可以繼續使用@Qualifier指定需要裝配的bean的名字。标注了@Primary的 bean 優先注入。

2)Spring還支援使用@Resource(JSR250)和@Inject(JSR330)[java規範的注解]

    @Resource:

          可以和@Autowired一樣實作自動裝配功能;預設是按照元件名稱進行裝配的。

          沒有能支援@Primary功能沒有支援@Autowired(reqiured=false)。

    @Inject:

         需要導入javax.inject的包,和Autowired的功能一樣。沒有required=false的功能。

AutowiredAnnotationBeanPostProcessor:解析完成自動裝配功能;

 3)、 @Autowired:構造器,參數,方法,屬性;都是從容器中擷取參數元件的值

      1)、[标注在方法位置]:@Bean+方法參數;參數從容器中擷取;預設不寫@Autowired效果是一樣的;都能自動裝配

      2)、[标在構造器上]:如果元件隻有一個有參構造器,這個有參構造器的@Autowired可以省略,參數位置的元件還是可以自動從容器中擷取。

3. @PropertySource 讀取外部配置檔案

Spring注解歸納

4. @Profile 根據環境,動态激活、切換元件

@Profile:通過設定Environment的ActiveProfiles來設定目前context需要使用的配置環境。(類或方法上)

@Profile:指定元件在哪個環境的情況下才能被注冊到容器中,不指定,任何環境下都能注冊這個元件

1)、加了環境辨別的bean,隻有這個環境被激活的時候才能注冊到容器中。預設是default環境。

2)、寫在配置類上,隻有是指定的環境的時候,整個配置類裡面的所有配置才能開始生效。

3)、沒有标注環境辨別的bean,任何環境下都是加載的。

繼續閱讀