1. @Configuration
標(biāo)注在類上霍殴,表示這是一個spring的配置類开镣。使用@bean注解向容器中添加一個組件
2. @bean
標(biāo)注在方法上焕济,表示向容器中添加一個組件嘴瓤。組件的類型為返回值的類型毁腿;組件的id默認(rèn)為方法名,也可以指定組件的名稱@bean(value="bean的名稱")仇冯。
3. @CompentScan
標(biāo)注在類上之宿,用來進(jìn)行包掃描,掃描@component苛坚、@Controller澈缺、@Service、@Repository注解標(biāo)注的類炕婶,添加到容器中
- excludeFilters:指定一下排除策略姐赡,排除某些注解
- includeFilters:指定包含策略,指定包含某些注解柠掂。需要把useDefaultFilters屬性設(shè)置為false(true表示掃描全部的)
- @ComponentScan.Filter type的類型
- 注解形式的FilterType.ANNOTATION @Controller @Service @Repository @Compent
- 指定類型的 FilterType.ASSIGNABLE_TYPE
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {GobaioService.class})
- aspectj類型的 FilterType.ASPECTJ(不常用)
- 正則表達(dá)式的 FilterType.REGEX(不常用)
- 自定義的 FilterType.CUSTOM
public enum FilterType { //注解形式 比如@Controller @Service @Repository @Compent ANNOTATION, //指定的類型 ASSIGNABLE_TYPE, //aspectJ形式的 ASPECTJ, //正則表達(dá)式的 REGEX, //自定義的 CUSTOM }
- FilterType.CUSTOM 自定義類型如何使用
public class GobaioFilterType implements TypeFilter { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //獲取當(dāng)前類的注解源信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //獲取當(dāng)前類的class的源信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //獲取當(dāng)前類的資源信息 Resource resource = metadataReader.getResource(); if(classMetadata.getClassName().contains("dao")) { return true; } return false; } }
@ComponentScan(basePackages = {"com.gobaio.testcompentscan"}, includeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM,value = GobaioFilterType.class) },useDefaultFilters = false) public class MainConfig { }
4. @scop
在不指定@Scope的情況下项滑,所有的bean都是單實例的bean,而且是餓漢加載,指定@Scope為 prototype 表示為多實例的,而且還是懶漢模式加載(IOC容器啟動的時候涯贞,并不會創(chuàng)建對象枪狂,而是 在第一次使用的時候才會創(chuàng)建)
@Scope指定的作用域方法取值:
a. singleton 單實例的(默認(rèn))
b. prototype 多實例的
c. request 同一次請求
d. session 同一個會話級別
5. @Lazy
Bean的懶加載
@Lazy(主要針對單實例的bean 容器啟動的時候,不創(chuàng)建對象宋渔,在第一次使用的時候才會創(chuàng)建該對象)
6. @Conditional進(jìn)行條件判斷
public class GobaioCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
@Conditional(value = GobaioCondition.class)
public GobaioLog gobaioLog() { return new gobiaoLog(); }
7. 往IOC 容器中添加組件的方式
- 通過@CompentScan +@Controller @Service @Respository @compent
適用場景: 針對我們自己寫的組件可以通過該方式來進(jìn)行加載到容器中州疾。 - 通過@Bean的方式來導(dǎo)入組件(適用于導(dǎo)入第三方組件的類)
- 通過@Import來導(dǎo)入組件(導(dǎo)入組件的id為全類名路徑);通過@Import 的ImportSeletor類實現(xiàn)組件的導(dǎo)入 (導(dǎo)入組件的id為全類名路徑);通過@Import的 ImportBeanDefinitionRegister導(dǎo)入組件 (可以指定bean的名稱);@ImportResource(value = {"classpath:beans/beans.xml"})導(dǎo)入一個spring的配置文件
- 通過實現(xiàn)FacotryBean接口來實現(xiàn)注冊 組件
7. @Value+@PropertySource
通過@Value +@PropertySource來給組件賦值
@PropertySource(value = {"classpath:person.properties"}) //指定外部文件的位置
8. 自動裝配
8.1 @AutoWired
- 自動裝配首先時按照類型進(jìn)行裝配,若在IOC容器中發(fā)現(xiàn)了多個相同類型的組件皇拣,那么就按照 屬性名稱來進(jìn)行裝配
@Autowired
private GobaioDao gobaioDao;
比如严蓖,我容器中有兩個GobaioDao類型的組件 一個叫g(shù)obaioDao 一個叫g(shù)obaioDao2 那么我們通過@AutoWired 來修飾的屬性名稱時gobaioDao,那么拿就加載容器的gobaiaoDao組件氧急,若屬性名稱為 gobaioDao2 那么他就加載的時gobaioDao2組件 - 假設(shè)我們需要指定特定的組件來進(jìn)行裝配颗胡,我們可以通過使用@Qualifier("gobaioDao")來指定裝配的組件 或者在配置類上的@Bean加上@Primary注解
- 假設(shè)我們?nèi)萜髦屑礇]有g(shù)obaioDao 和gobaioDao2,那么在裝配的時候就會拋出異常
No qualifying bean of type 'com.gobaio.testautowired.GobaioDao' available;
若我們想不拋異常 ,我們需要指定 required為false的時候可以了
@Autowired(required = false)
@Qualifier("gobaioDao")
private GobaioDao gobaioDao2;
- @Resource(JSR250規(guī)范)
功能和@AutoWired的功能差不多一樣吩坝,但是不支持@Primary 和@Qualifier的支持 - @InJect(JSR330規(guī)范)
需要導(dǎo)入jar包依賴 功能和支持@Primary功能 ,但是沒有Require=false的功能
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
- 使用autowired 可以標(biāo)注在方法上
標(biāo)注在set方法上
//@Autowired
public void setGobaioLog(GobaioLog gobaioLog) {
this.gobaioLog = gobaioLog;
}
標(biāo)注在構(gòu)造方法上
@Autowired
public GobaioAspect(GobaioLog gobaioLog) {
this.gobaioLog = gobaioLog;
}
標(biāo)注在配置類上的入?yún)⒅校梢圆粚懀?/p>
@Bean
public GobaioAspect gobaioAspect(@Autowired GobaioLog gobaioLog) {
GobaioAspect gobaioAspect = new GobaioAspect(gobaioLog);
return gobaioAspect;
}
9. @Profile
通過@Profile注解 來根據(jù)環(huán)境來激活標(biāo)識不同的Bean
- @Profile標(biāo)識在類上毒姨,那么只有當(dāng)前環(huán)境匹配,整個配置類才會生效
- @Profile標(biāo)識在Bean上 钉寝,那么只有當(dāng)前環(huán)境的Bean才會被激活
- 沒有標(biāo)志為@Profile的bean 不管在什么環(huán)境都可以被激活
激活切換環(huán)境的方法: - 通過運(yùn)行時jvm參數(shù)來切換 -Dspring.profiles.active=test|dev|prod
- 通過代碼的方式來激活
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("test","dev");
ctx.register(MainConfig.class);
ctx.refresh(); printBeanName(ctx);
}