Spring學(xué)習(xí)(二):3個(gè)裝配bean方式

bean的生命周期

bean.jpg
  • Bean配置信息定義了Bean的實(shí)現(xiàn)及依賴關(guān)系专甩,Spring容器根據(jù)各種形式的Bean配置信息在容器內(nèi)部建立Bean定義注冊表,然后根據(jù)注冊表加載晚伙、實(shí)例化Bean颖低,并建立Bean和Bean的依賴關(guān)系,最后將這些準(zhǔn)備就緒的Bean放到Bean緩存池中陌宿,以供外層的應(yīng)用程序進(jìn)行調(diào)用锡足。

3個(gè)裝配方式

  • 基于Java類的配置方式
  • 基于XML的配置方式
  • 基于注解的配置方式

1.基于Java類的配置方式

基于Java類定義Bean配置元數(shù)據(jù),其實(shí)就是通過Java類定義Spring配置元數(shù)據(jù)壳坪,且直接消除XML配置文件舶得。

1.1要點(diǎn):

  • 必須要兩個(gè)注解:
    • @Configuration :代替了xml配置.表明該類是一個(gè)配置類,該類應(yīng)該包含在Spring應(yīng)用上下文中如何創(chuàng)建bean的細(xì)節(jié)爽蝴。
    • @Bean : 告訴Spring扩灯,這個(gè)方法將會(huì)返回一個(gè)對象。一般用在構(gòu)造器和Setter方法上
  • 只需要這個(gè)兩個(gè)注解霜瘪,就可以完成bean的裝配過程了珠插。
  • 非必須的注解:
    • @import :用來引入別的類里面同樣有@Configuration標(biāo)簽的類。
    • @importResource : 用來引入xml配置颖对,實(shí)現(xiàn)xml配置方式和java類配置方式共存捻撑。

1.2例子

  • 代碼結(jié)構(gòu)
    • Configuration 包:用來放Java類的配置。其實(shí)其作用就是跟xml配置一樣的缤底。所以此包下的類是Java類配置方式的核心
    • Entity 包:用來放bean
    • test 包: 測試
  • 代碼
    • Configuration 包下的EntityConfig類:
@Configuration //表示這個(gè)類可以使用 Spring IoC 容器作為 bean 定義的來源
public class EntityConfig {

    @Bean
    public UserBean user(){
        return new UserBean( student());  //有參構(gòu)造
    }

    @Bean
    public StudentBean student(){
        return new StudentBean();
    }
}
  • Entity 包 UserBean類和StudentBean類:
public class UserBean {
    private StudentBean studentBean;

    public UserBean(){}
    public UserBean(StudentBean studentBean){
        this.studentBean=studentBean;
    }

    @Override
    public String toString() {

        return "this is UserBean";
    }

    public StudentBean getStudent(){
        return studentBean;
    }
}
public class StudentBean {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "this is StudentBean";
    }
}
  • test 包
@Test
    public void test(){
       
        ApplicationContext ctx=
                new AnnotationConfigApplicationContext(EntityConfig.class);  //應(yīng)用上下問
        UserBean userBean=ctx.getBean(UserBean.class);

        StudentBean student = userBean.getStudent(); //從userBean里顾患,看是否獲得studenBean
        System.out.println(student.toString());

    }

1.3基于Java類的配置主要使用場景:

對于實(shí)例化Bean的邏輯比較復(fù)雜,則比較適合用基于Java類配置的方式

2.基于XML配置

其實(shí)可從基于java類配置方式去考慮个唧,在Java類配置方式中江解,需要的兩個(gè)注解@Configuration 和@Bean 轉(zhuǎn)化成xml配置文件里說明。這樣的話java的配置類也可以不要了徙歼。

2.1要點(diǎn)

  • xml配置犁河。有兩篇文章可以參考鳖枕。
  • 基于xml配置的特點(diǎn)是自由度很高〗奥荩可以實(shí)現(xiàn)初始化bean宾符。還有c-命名空間等來裝配bean。裝配bean

2.2 例子

  • Entity類:跟上面類一樣灭翔,不需要該魏烫。
  • xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">


    <bean id="studentBean" class="cn.Entity.StudentBean"/>  

    <bean id="userBean" class="cn.Entity.UserBean">
     //在userBean類里面注入StudentBean 類,如果沒有這條會(huì)出現(xiàn)
       NullPointerException異常
    <property name="studentBean"  ref="studentBean"/>    
     // name="" 是userBean 的屬性名稱肝箱。(需要setter方法)
     // ref="" 是上面studentBean類注入的id哄褒。
     </bean>



</beans>
  • test類
@Test
    public void testUserBean(){
        ApplicationContext ctx=
                new ClassPathXmlApplicationContext("spring.xml"); //配置文件的絕對路徑
        if (ctx!=null){
            UserBean user = (UserBean) ctx.getBean(UserBean.class);
            System.out.println(user.getStudent());
        }
    }
  • 使用場景:
    • 第三方類庫,如DataSource煌张、JdbcTemplate等呐赡;
    • 命名空間,如aop唱矛、context等罚舱;

3.自動(dòng)化裝配bean

可以對比前面兩種方法的變化,可以知道配置方法上的不同了绎谦。

  • 相對于基于xml配置方法來說管闷,不需要在xml里面配置注入bean的信息,而換成注解注入窃肠。
  • 而相對與基于java配置方法來說包个,不需要在配置類中創(chuàng)建對象的方法,只需要在需要注入的地方冤留,用注解就可以了

3.1要點(diǎn)

  • 從兩個(gè)角度來實(shí)現(xiàn)自動(dòng)化裝配:
    • 組件掃描:Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文中所創(chuàng)建的bean碧囊。(需要在xml里面配置,或者用注解)
    • 自動(dòng)裝配:Spring自動(dòng)滿足bean之間的依賴纤怒。(需要用注解)

3.2例子

  • 用@configuration來裝配bean
    • 用到的注解
      • @Configuration :代替了xml配置.表明該類是一個(gè)配置類糯而,該類應(yīng)該包含在Spring應(yīng)用上下文中如何創(chuàng)建bean的細(xì)節(jié)。
      • @ComponentScan:啟動(dòng)組件掃描泊窘。(如果沒有設(shè)定范圍熄驼,默認(rèn)該包下)
      • @Autowired :自動(dòng)注入。用在類下對象的注入
      • @Compoent : 表明該類會(huì)作為組件類烘豹,并告知Spring要為該類建立bean瓜贾。
      • @RunWith(SpringJUnit4ClassRunner,class):在測試開始的時(shí)候自動(dòng)創(chuàng)建Spring的應(yīng)用上下文
    • @ContextConfiguration(class=xxxx) :加載配置,在這里是Config.class

很奇怪携悯,如果不用@ContextConfiguration(class=xxxx) 這個(gè)加載配置祭芦,是掃描不到我測試類下面的@Autowired 注解。也就是我用正規(guī)創(chuàng)建上下文方法創(chuàng)建的話憔鬼,test類下的對象是null的龟劲。 有待解決
- 代碼結(jié)構(gòu)
- Config類:用來裝配Spring規(guī)則胃夏。具有@Configuration和@ComponentScan注解
- StudentBean類和UserBean
- test類
- 例子
- Config類

@Configuration
@ComponentScan(basePackages = {"cn.Entity"})
public class Config {  //不需像基于java配置一樣,用方法返回new 對象咸灿。
}
  - SutdentBean和UserBean類 
@Component
public class StudentBean {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "this is StudentBean";
    }
}

***********************************************************************
@Component
public class UserBean {
    private StudentBean studentBean;


    public UserBean(){}

    @Autowired
    public UserBean(StudentBean studentBean){
        this.studentBean=studentBean;
    }

    @Override
    public String toString() {

        return "this is UserBean";
    }

    public StudentBean getStudent(){
        return studentBean;
    }



    public StudentBean getStudentBean() {
        return studentBean;
    }


}

  • test類
 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class UserBeanTest extends TestCase {

    @Autowired
    private UserBean userBean;

    @Test
    public void testUserBean(){

            System.out.println(userBean.getStudent());
             System.out.println(userBean);

    }
}
  • 用xml配置文件來裝配bean
    只是把上面的Config類构订,用xml替換掉侮叮。其實(shí)只是用xml文檔寫一個(gè)掃描語句
    • spring.xml文檔
            <?xml version="1.0" encoding="UTF-8"?>
            <beans //省去很多約束
      
            <context:component-scan base-package="cn.Entity"/>
      
            </beans>
      
      
    • StudentBean類和UserBean類沒變
    • Test類
              @RunWith(SpringJUnit4ClassRunner.class)
               @ContextConfiguration({"/spring.xml"})  //加載xml配置
             public class UserBeanTest extends TestCase {
                @Autowired
               private UserBean userBean;
               @Test
                 public void testUserBean(){
                       System.out.println(userBean.getStudent());
                        System.out.println(userBean);
                 }       }
      
  • 使用場景:Bean的實(shí)現(xiàn)類是當(dāng)前項(xiàng)目開發(fā)的避矢,可直接在Java類中使用注解配置

4.總結(jié)

  • 3個(gè)配置方式其實(shí)都很簡單,在開發(fā)過程中囊榜,都是推薦使用xml配置和自動(dòng)化裝配审胸。
  • 不同配置方式比較
xml.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卸勺,隨后出現(xiàn)的幾起案子砂沛,更是在濱河造成了極大的恐慌,老刑警劉巖曙求,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍庵,死亡現(xiàn)場離奇詭異,居然都是意外死亡悟狱,警方通過查閱死者的電腦和手機(jī)静浴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挤渐,“玉大人苹享,你說我怎么就攤上這事≡÷椋” “怎么了得问?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長软免。 經(jīng)常有香客問我宫纬,道長,這世上最難降的妖魔是什么膏萧? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任漓骚,我火速辦了婚禮,結(jié)果婚禮上向抢,老公的妹妹穿的比我還像新娘认境。我一直安慰自己,他們只是感情好挟鸠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布叉信。 她就那樣靜靜地躺著,像睡著了一般艘希。 火紅的嫁衣襯著肌膚如雪硼身。 梳的紋絲不亂的頭發(fā)上硅急,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音佳遂,去河邊找鬼营袜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丑罪,可吹牛的內(nèi)容都是我干的荚板。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼吩屹,長吁一口氣:“原來是場噩夢啊……” “哼跪另!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煤搜,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤免绿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后擦盾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘲驾,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年迹卢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辽故。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婶希,死狀恐怖榕暇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喻杈,我是刑警寧澤彤枢,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站筒饰,受9級特大地震影響缴啡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓷们,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一业栅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谬晕,春花似錦碘裕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春文兢,著一層夾襖步出監(jiān)牢的瞬間匆骗,已是汗流浹背官紫。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留餐济,地道東北人桨武。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓噪径,卻偏偏與公主長得像满败,于是被迫代替她去往敵國和親驮瞧。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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