spring中組件注冊(cè)的幾種方法(使用注解方式)

所使用的spring的版本為:4.3.12.RELEASE

一捶朵、包掃描+組件標(biāo)注注解

這個(gè)就是我們常用的幾種注解

@Controller综看,@Service岖食,@Repository,@Component

指定相關(guān)的配置類

@Configuration  //告訴spring這是一個(gè)配置類
@ComponentScan(
 value = {"com.nanc"},
 excludeFilters =
 {
 @ComponentScan.Filter(type = FilterType.ANNOTATION, classes= {Controller.class,Service.class}),
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {MyTest.class})
 }, useDefaultFilters = false)
public class MainConfig {

}

@Component中excludeFilters的簡要說明

這個(gè)注解會(huì)掃描指定的包及其子包句喷,可以是一個(gè)字符串的數(shù)組

excludeFilters:指定不掃描哪些組件,它的值也是一個(gè)@ComponentScan.Filter類型的數(shù)組

可選類型有:

FilterType.ANNOTATION 按照注解
FilterType.ASSIGNABLE_TYPE 按照給定的類型
FilterType.ASPECTJ:使用ASPECTJ表達(dá)式
FilterType.REGEX:使用正則指定
FilterType.CUSTOM:使用自定義規(guī)則

二兄春、使用@Bean導(dǎo)入

package com.nanc.config;

import com.nanc.entity.Person;
import org.springframework.context.annotation.*;

@Configuration
public class MainConfig {

   @Scope("prototype")
   @Lazy
   @Bean
   public Person person(){
      System.out.println("給容器中添加Person....");
      return new Person(1, "haha");
   }
}

@Scope注解說明:

@Scope用來調(diào)整Bean的作用域赶舆,可選取值[singleton,prototype,request,session]等

singleton:單實(shí)例的(默認(rèn)值):ioc容器啟動(dòng)會(huì)調(diào)用方法創(chuàng)建對(duì)象放到ioc容器中祭饭。以后每次獲取就是直接從容器(map.get())中拿。

prototype:多實(shí)例的:ioc容器啟動(dòng)并不會(huì)去調(diào)用方法創(chuàng)建對(duì)象放在容器中九串。每次獲取的時(shí)候才會(huì)調(diào)用方法創(chuàng)建對(duì)象猪钮;

request:同一次請(qǐng)求創(chuàng)建一個(gè)實(shí)例

session:同一個(gè)session創(chuàng)建一個(gè)實(shí)例

@Lazy

懶加載:容器啟動(dòng)不創(chuàng)建對(duì)象胆建。第一次使用(獲取)Bean創(chuàng)建對(duì)象,并初始化扑馁;

沒有此注解時(shí)腻要,單實(shí)例bean:默認(rèn)在容器啟動(dòng)的時(shí)候創(chuàng)建對(duì)象沿侈;

三市栗、使用@Import 快速給容器中導(dǎo)入一個(gè)組件

使用此注解有三種方式

1、直接導(dǎo)入實(shí)體類

package com.nanc.config;

import com.nanc.entity.User;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(User.class)
public class MainConfig {
}

2蛛淋、引入一個(gè)實(shí)現(xiàn)了ImportSelector的類

package com.nanc.condition;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {
    
    /**
     * AnnotationMetadata: 當(dāng)前標(biāo)注@Import注解的類的所有注釋信息
     * @param importingClassMetadata
     * @return  要導(dǎo)入到容器中的組件全類名
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //return new String[0];
        return new String[]{"com.nanc.entity.User1", "com.nanc.entity.User2"};
    }
}


package com.nanc.config;

import com.nanc.condition.MyImportSelector;
import com.nanc.entity.User;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({User.class,MyImportSelector.class})
public class MainConfig {
}

3褐荷、導(dǎo)入一個(gè)實(shí)現(xiàn)了ImportBeanDefinitionRegistrar接口 的類

package com.nanc.condition;

import com.nanc.entity.RainBow;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {


   /**
    * AnnotationMetadata:當(dāng)前類的注解信息
    * BeanDefinitionRegistry:BeanDefinition注冊(cè)類叛甫;
    *        把所有需要添加到容器中的bean;調(diào)用
    *        BeanDefinitionRegistry.registerBeanDefinition手工注冊(cè)進(jìn)來
    */
   @Override
   public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
      //指定Bean定義信息萌腿;(Bean的類型抖苦,Bean。贮庞。。)
      RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
      //注冊(cè)一個(gè)Bean窗慎,指定bean名
      registry.registerBeanDefinition("rainBow",rootBeanDefinition);
   }
}


package com.nanc.config;

import com.nanc.condition.MyImportBeanDefinitionRegistrar;
import com.nanc.condition.MyImportSelector;
import com.nanc.entity.User;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({User.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig {
}

四捉邢、使用Spring提供的 FactoryBean(工廠Bean)

package com.nanc.entity;

import org.springframework.beans.factory.FactoryBean;

/**
 * 創(chuàng)建一個(gè)Spring定義的FactoryBean
 */
public class ColorFactoryBean implements FactoryBean<Color> {
   /**
    * 返回一個(gè)Color對(duì)象伏伐,這個(gè)對(duì)象會(huì)添加到容器中
    * @return
    * @throws Exception
    */
   @Override
   public Color getObject() throws Exception {
      System.out.println("----------ColorFactoryBean------------------");
      return new Color();
   }

   @Override
   public Class<?> getObjectType() {
      return Color.class;
   }

   /**
    * 控制這個(gè)bean是否是單例模式?
    *
    * true: 單例
    * false: 多實(shí)例藐翎,每次創(chuàng)建都會(huì)獲取一個(gè)新的
    * @return
    */
   @Override
   public boolean isSingleton() {
      return true;
   }
}

把上面的類放入到spring容器中(可以使用@Component注解吝镣,也是在配置類中使用@Bean進(jìn)行注入)

測(cè)試類

@Test
public void test(){
   ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);


   //工廠Bean獲取的是調(diào)用getObject創(chuàng)建的對(duì)象
   Object bean2 = applicationContext.getBean("colorFactoryBean");
   Object bean3 = applicationContext.getBean("colorFactoryBean");
   System.out.println("bean的類型:"+bean2.getClass());
   System.out.println(bean2 == bean3);

   //前面加一個(gè)& 獲取的就是ColorFactoryBean的本身實(shí)例
   Object bean4 = applicationContext.getBean("&colorFactoryBean");
   System.out.println(bean4.getClass());
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末末贾,一起剝皮案震驚了整個(gè)濱河市整吆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拴测,老刑警劉巖府蛇,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妆距,居然都是意外死亡函匕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吸耿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酷窥,“玉大人,你說我怎么就攤上這事妆棒「馍海” “怎么了毅糟?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喇肋。 經(jīng)常有香客問我迹辐,道長,這世上最難降的妖魔是什么间学? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任低葫,我火速辦了婚禮躏鱼,結(jié)果婚禮上殷绍,老公的妹妹穿的比我還像新娘。我一直安慰自己茶行,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布娶靡。 她就那樣靜靜地躺著姿锭,像睡著了一般伯铣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腔寡,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天忿磅,我揣著相機(jī)與錄音,去河邊找鬼葱她。 笑死,一個(gè)胖子當(dāng)著我的面吹牛览效,可吹牛的內(nèi)容都是我干的虫几。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼但校,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼状囱!你這毒婦竟也來了倘是?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤叨粘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后答倡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘪撇,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡港庄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鹏氧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了度帮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞳秽,死狀恐怖率翅,靈堂內(nèi)的尸體忽然破棺而出冕臭,到底是詐尸還是另有隱情,我是刑警寧澤悯蝉,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布托慨,位于F島的核電站,受9級(jí)特大地震影響蕉世,放射性物質(zhì)發(fā)生泄漏婆硬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一向楼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜜自,春花似錦卢佣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罩扇。三九已至,卻和暖如春消约,著一層夾襖步出監(jiān)牢的瞬間或粮,已是汗流浹背捞高。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氢哮,地道東北人命浴。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓生闲,卻偏偏與公主長得像月幌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捉兴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容