Spring常用的幾個註解@Configuration、@Bean、@ComponentScan

@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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章