@Configuration:告訴Spring這是一個配置類,配置類===配置文件
@Bean:給容器注入一個bean,類型爲返回值類型,id默認是用方法名作爲id
@Configuration
//@ComponentScan value:指定要掃描的包
//excludeFilters=Filter[]:指定掃描的時候按照什麼規則排除哪些組件
//includeFilters=Filter[]:指定掃描的時候只需要包含哪些組件,需要使這個起作用,還需要配置useDefaultFilters=false,禁用掉默認規則(掃描所有)
/*@ComponentScan(value="com.atguigu.controller",includeFilters={@Filter(type=FilterType.ANNOTATION,classes=Controller.class)},useDefaultFilters=false)*/
@ComponentScan(value="com.atguigu.controller",excludeFilters={@Filter(type=FilterType.ANNOTATION,classes=Controller.class)})
public class MainConfig{
@Scope("prototype")
@Bean
public Person person(){
return new Person("lisi",20);
}
}
包掃描:只要標註了@Controller、@Service、@Repository、@Component這四個註解的任意一個,就都會被掃描到並加入容器
@ComponentScan value:指定要掃描的包
excludeFilters=Filter[]:指定掃描的時候按照什麼規則排除哪些組件
includeFilters=Filter[]:指定掃描的時候只需要包含哪些組件,需要使這個起作用,還需要配置useDefaultFilters=false,禁用掉默認規則(掃描所有)
掃描規則:
FilterType.ANNOTATION:按照註解
FilterType.ASPECTJ:使用ASPECTJ表達式
FilterType.ASSIGNABLE_TYPE:按照給定的類型
FilterType.REGEX:使用正則表達式
FilterType.CUSTOM:使用自定義規則,實現TypeFilter接口;
metadataReader:讀取到的當前正在掃描的類的信息
metadataReaderFactory:可以獲取到其他任何類的信息
@Scope:默認是單實例的
prototype:多實例的:ioc容器啓動時候不會調用方法創建對象放在容器中。每次獲取對象的時候纔會調用方法創建對象放到容器中
singleton:單實例的,默認值;ioc容器啓動會調用方法創建對象放到ioc容器中,以後每次獲取就是直接從容器中拿
request:同一個請求創建一個實例
session:同意給session創建一個實例
@Lazy 懶加載:
單實例bean:默認在容器啓動的時候創建對象
懶加載:容器啓動不創建對象,第一次使用(獲取)Bean創建對象,並初始化;只執行一次
@Conditional:按照一定的條件進行判斷,滿足條件給容器中註冊bean
實現Condition接口,實現matches()方法返回一個boolean值,滿足條件就給容器註冊bean
matches()中有兩個參數:
ConditionContext:判斷條件能使用的上下文(環境)
AnnotatedTypeMetadata:當前標註了Condition註解的註釋信息
//滿足當前條件,這個類配置的所有bean註冊才能生效
@Conditional({條件})
@Configuration
@Import(Color.class) //導入組件,單個;@Import({Color.class,Red.class,MyImportSelector.class})多個
public class MainCondition{
@Bean
public Car car(){
return new Car("red");
}
}
@Import:
給容器中註冊組件
1).包掃描+組件標註註解(@Controller、@Service、@Repository、@Component)【侷限於自己寫的類】
2).@Bean[導入第三方包裏面的組件,可以給它加上@Bean註解注入到容器中]
3).@Import[快速的給容器中導入一個組件,id默認是組件的全類名]
1.@Import(要導入到容器中的組件);容器中就會自動註冊這個組件,id默認是全類名
2.ImportSelector:是一個接口,返回需要導入的組件的全類名的數組
//自定義邏輯返回需要導入的組件
public class MyImportSelector implements ImportSelector{
//返回值,就是要導入到容器中的組件全類名
//AnnotationMetadata:當前標註@Import註解的類的所有註解信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata){
//方法不用返回null值,可以返回空數組[],null值會報錯空指針異常
//return null;
return new String[]{};
}
}
3.ImportBeanDefinitionRegistrar:手動註冊bean到容器中
4).使用Spring提供的FactoryBean(工廠Bean)
//創建一個Spring定義的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color>{
//返回一個Color對象,這個對象會添加到容器中
@Override
public Object getObject() throws Exception {
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
//是否單例?true是單實例,在容器中只會保存一份;false多實例,每次獲取都會創建一個新實例(調用getObject()獲取)
@Override
public boolean isSingleton() {
return false;
}
}
Object obj = applicationContext.getBean("&colorFactoryBean");//加了&符合,獲取的是工廠bean本身,如果沒有&符號,獲取的是getObject返回的bean