一、配置注解
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;
2)通過讓 Bean 實作 InitializingBean(定義初始化邏輯),DisposableBean(定義銷毀邏輯)
3)可以使用JSR250:(使用在方法上)
@PostConstruct:在bean建立完成并且屬性指派完成,來執行初始化方法
@PreDestroy:在容器銷毀bean之前通知我們進行清理工作
4)BeanPostProcessor 接口 bean的後置處理器,在bean建立之後初始化完成前後進行一些處理工作
postProcessBeforeInitialization:初始化之前進行後置處理工作
postProcessAfterInitialization:初始化之後工作
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 讀取外部配置檔案
4. @Profile 根據環境,動态激活、切換元件
@Profile:通過設定Environment的ActiveProfiles來設定目前context需要使用的配置環境。(類或方法上)
@Profile:指定元件在哪個環境的情況下才能被注冊到容器中,不指定,任何環境下都能注冊這個元件
1)、加了環境辨別的bean,隻有這個環境被激活的時候才能注冊到容器中。預設是default環境。
2)、寫在配置類上,隻有是指定的環境的時候,整個配置類裡面的所有配置才能開始生效。
3)、沒有标注環境辨別的bean,任何環境下都是加載的。