Spring學習(二):3個裝配bean方式

weixin_33785972發表於2017-06-26

bean的生命週期

6212571-47e5e85031005561.jpg
bean.jpg
  • Bean配置資訊定義了Bean的實現及依賴關係,Spring容器根據各種形式的Bean配置資訊在容器內部建立Bean定義登錄檔,然後根據登錄檔載入、例項化Bean,並建立Bean和Bean的依賴關係,最後將這些準備就緒的Bean放到Bean快取池中,以供外層的應用程式進行呼叫。

3個裝配方式

  • 基於Java類的配置方式
  • 基於XML的配置方式
  • 基於註解的配置方式

1.基於Java類的配置方式

基於Java類定義Bean配置後設資料,其實就是通過Java類定義Spring配置後設資料,且直接消除XML配置檔案。

1.1要點:

  • 必須要兩個註解:
    • @Configuration :代替了xml配置.表明該類是一個配置類,該類應該包含在Spring應用上下文中如何建立bean的細節。
    • @Bean : 告訴Spring,這個方法將會返回一個物件。一般用在構造器和Setter方法上
  • 只需要這個兩個註解,就可以完成bean的裝配過程了。
  • 非必須的註解:
    • @import :用來引入別的類裡面同樣有@Configuration標籤的類。
    • @importResource : 用來引入xml配置,實現xml配置方式和java類配置方式共存。

1.2例子

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

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

    @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);  //應用上下問
        UserBean userBean=ctx.getBean(UserBean.class);

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

    }

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

對於例項化Bean的邏輯比較複雜,則比較適合用基於Java類配置的方式

2.基於XML配置

其實可從基於java類配置方式去考慮,在Java類配置方式中,需要的兩個註解@Configuration 和@Bean 轉化成xml配置檔案裡說明。這樣的話java的配置類也可以不要了。

2.1要點

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 類,如果沒有這條會出現
       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.自動化裝配bean

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

  • 相對於基於xml配置方法來說,不需要在xml裡面配置注入bean的資訊,而換成註解注入。
  • 而相對與基於java配置方法來說,不需要在配置類中建立物件的方法,只需要在需要注入的地方,用註解就可以了

3.1要點

  • 從兩個角度來實現自動化裝配:
    • 元件掃描:Spring會自動發現應用上下文中所建立的bean。(需要在xml裡面配置,或者用註解)
    • 自動裝配:Spring自動滿足bean之間的依賴。(需要用註解)

3.2例子

  • 用@configuration來裝配bean
    • 用到的註解
      • @Configuration :代替了xml配置.表明該類是一個配置類,該類應該包含在Spring應用上下文中如何建立bean的細節。
      • @ComponentScan:啟動元件掃描。(如果沒有設定範圍,預設該包下)
      • @Autowired :自動注入。用在類下物件的注入
      • @Compoent : 表明該類會作為元件類,並告知Spring要為該類建立bean。
      • @RunWith(SpringJUnit4ClassRunner,class):在測試開始的時候自動建立Spring的應用上下文
    • @ContextConfiguration(class=xxxx) :載入配置,在這裡是Config.class

很奇怪,如果不用@ContextConfiguration(class=xxxx) 這個載入配置,是掃描不到我測試類下面的@Autowired 註解。也就是我用正規建立上下文方法建立的話,test類下的物件是null的。 有待解決
- 程式碼結構
- Config類:用來裝配Spring規則。具有@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替換掉。其實只是用xml文件寫一個掃描語句
    • 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的實現類是當前專案開發的,可直接在Java類中使用註解配置

4.總結

  • 3個配置方式其實都很簡單,在開發過程中,都是推薦使用xml配置和自動化裝配。
  • 不同配置方式比較
6212571-ac6ace9fef906e8d.png
xml.png

相關文章