Spring 組件注冊

@Configuration

告訴Spring這是一個(gè)配置類作用在類上,同時(shí)該類會注冊在IOC容器中

@Bean

給容器中注冊一個(gè)Bean;類型為返回值的類型益老,id默認(rèn)是用方法名作為id

@ComponentScan

作用:指定掃描的包 锉罐。
有以下屬性
1.value:指定要掃描的包
2.excludeFilters = Filter[] :指定掃描的時(shí)候按照什么規(guī)則排除那些組件
3.includeFilters = Filter[] :指定掃描的時(shí)候只需要包含哪些組件
4.FilterType.ANNOTATION:按照注解
5.FilterType.ASSIGNABLE_TYPE:按照給定的類型辐烂;
6.FilterType.ASPECTJ:使用ASPECTJ表達(dá)式
7.FilterType.REGEX:使用正則指定
8.FilterType.CUSTOM:使用自定義規(guī)則

@ComponentScans(
        value = {
                @ComponentScan(value="com.atguigu.bean",includeFilters = {
/*                      @Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
                        @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class}),*/
                        @Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
                },useDefaultFilters = false)    
        }
        )

其中自定義規(guī)則時(shí)要實(shí)現(xiàn)TypeFilter接口代碼如下:

public class MyTypeFilter implements TypeFilter {

    /**
     * metadataReader:讀取到的當(dāng)前正在掃描的類的信息
     * metadataReaderFactory:可以獲取到其他任何類信息的
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
            throws IOException {
        // TODO Auto-generated method stub
        //獲取當(dāng)前類注解的信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //獲取當(dāng)前正在掃描的類的類信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //獲取當(dāng)前類資源(類的路徑)
        Resource resource = metadataReader.getResource();
        
        String className = classMetadata.getClassName();
        System.out.println("--->"+className);
        if(className.contains("er")){
            return true;
        }
        return false;
    }

}

@Scope

@Scope:調(diào)整作用域
* prototype:多實(shí)例的:ioc容器啟動(dòng)并不會去調(diào)用方法創(chuàng)建對象放在容器中。
* 每次獲取的時(shí)候才會調(diào)用方法創(chuàng)建對象辛块;
* singleton:單實(shí)例的(默認(rèn)值):ioc容器啟動(dòng)會調(diào)用方法創(chuàng)建對象放到ioc容器中郊霎。以后每次獲取就是直接從容器(map.get())中拿姥饰,
* request:同一次請求創(chuàng)建一個(gè)實(shí)例
* session:同一個(gè)session創(chuàng)建一個(gè)實(shí)例

參照spring源碼:

ConfigurableBeanFactory#SCOPE_PROTOTYPE    
@see ConfigurableBeanFactory#SCOPE_SINGLETON  
@see
org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST  request
@see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION     sesssion

@Lazy

懶加載:容器啟動(dòng)不創(chuàng)建對象。第一次使用(獲取)Bean創(chuàng)建對象鲤屡,并初始化损痰;但是單實(shí)例bean:默認(rèn)在容器啟動(dòng)的時(shí)候創(chuàng)建對象;

@Lazy
@Bean("person")
public Person person(){
        System.out.println("給容器中添加Person....");
        return new Person("張三", 25);
}

@Conditional

  • 作用在類上,類中組件統(tǒng)一設(shè)置酒来。滿足當(dāng)前條件卢未,這個(gè)類中配置的所有bean注冊才能生效;
  • 作用在方法上堰汉,滿足條件給容器中注冊bean
//類中組件統(tǒng)一設(shè)置辽社。滿足當(dāng)前條件,這個(gè)類中配置的所有bean注冊才能生效翘鸭;
@Conditional({WindowsCondition.class})
public class MainConfig2 
  • WindowsCondition該類需要實(shí)現(xiàn)Conditional接口
//判斷是否windows系統(tǒng)
public class WindowsCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String property = environment.getProperty("os.name");
        if(property.contains("Windows")){
            return true;
        }
        return false;
    }

}

@Import

  • 快速給容器中導(dǎo)入一個(gè)組件 容器中就會自動(dòng)注冊這個(gè)組件滴铅,id默認(rèn)是全類名
@Import({Color.class,Red.class})
//@Import導(dǎo)入組件,id默認(rèn)是組件的全類名
public class MainConfig2
  • ImportSelector:返回需要導(dǎo)入的組件的全類名數(shù)組
@Import({MyImportSelector.class})
//自定義邏輯返回需要導(dǎo)入的組件
public class MyImportSelector implements ImportSelector {

    //返回值就乓,就是到導(dǎo)入到容器中的組件全類名
    //AnnotationMetadata:當(dāng)前標(biāo)注@Import注解的類的所有注解信息
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // TODO Auto-generated method stub
        //importingClassMetadata
        //方法不要返回null值
        return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Yellow"};
    }

}
  • ImportBeanDefinitionRegistrar:手動(dòng)注冊bean到容器中
 @Import({MyImportBeanDefinitionRegistrar.class})
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * AnnotationMetadata:當(dāng)前類的注解信息
     * BeanDefinitionRegistry:BeanDefinition注冊類汉匙;
     * 把所有需要添加到容器中的bean;調(diào)用
     * BeanDefinitionRegistry.registerBeanDefinition手工注冊進(jìn)來
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        
        boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
        boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
        if(definition && definition2){
            //指定Bean定義信息档址;(Bean的類型盹兢,Bean。守伸。绎秒。)
            RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
            //注冊一個(gè)Bean,指定bean名
            registry.registerBeanDefinition("rainBow", beanDefinition);
        }
    }
}

FactoryBean的使用

  • 默認(rèn)獲取到的是工廠bean調(diào)用getObject創(chuàng)建的對象
  • 要獲取工廠Bean本身尼摹,我們需要給id前面加一個(gè)& &colorFactoryBean
@Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
//創(chuàng)建一個(gè)Spring定義的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

    //返回一個(gè)Color對象见芹,這個(gè)對象會添加到容器中
    @Override
    public Color getObject() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("ColorFactoryBean...getObject...");
        return new Color();
    }

    @Override
    public Class<?> getObjectType() {
        // TODO Auto-generated method stub
        return Color.class;
    }

    //是單例剂娄?
    //true:這個(gè)bean是單實(shí)例,在容器中保存一份
    //false:多實(shí)例玄呛,每次獲取都會創(chuàng)建一個(gè)新的bean阅懦;
    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return false;
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市徘铝,隨后出現(xiàn)的幾起案子耳胎,更是在濱河造成了極大的恐慌,老刑警劉巖惕它,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怕午,死亡現(xiàn)場離奇詭異,居然都是意外死亡淹魄,警方通過查閱死者的電腦和手機(jī)郁惜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甲锡,“玉大人兆蕉,你說我怎么就攤上這事$吐伲” “怎么了虎韵?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疚俱。 經(jīng)常有香客問我劝术,道長,這世上最難降的妖魔是什么呆奕? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任养晋,我火速辦了婚禮,結(jié)果婚禮上梁钾,老公的妹妹穿的比我還像新娘绳泉。我一直安慰自己,他們只是感情好姆泻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布零酪。 她就那樣靜靜地躺著,像睡著了一般拇勃。 火紅的嫁衣襯著肌膚如雪四苇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天方咆,我揣著相機(jī)與錄音月腋,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛榆骚,可吹牛的內(nèi)容都是我干的片拍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妓肢,長吁一口氣:“原來是場噩夢啊……” “哼捌省!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碉钠,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纲缓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后放钦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體色徘,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年操禀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片横腿。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颓屑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耿焊,到底是詐尸還是另有隱情揪惦,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布罗侯,位于F島的核電站器腋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钩杰。R本人自食惡果不足惜纫塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讲弄。 院中可真熱鬧措左,春花似錦、人聲如沸避除。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓶摆。三九已至凉逛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間群井,已是汗流浹背状飞。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昔瞧。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓指蚁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親自晰。 傳聞我的和親對象是個(gè)殘疾皇子凝化,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354