1. 程式人生 > >Spring中註解注入bean和配置檔案注入bean

Spring中註解注入bean和配置檔案注入bean

註解的方式確實比手動寫xml檔案注入要方便快捷很多,省去了很多不必要的時間去寫xml檔案

按以往要注入bean的時候,需要去配置一個xml,當然也可以直接掃描包體,用xml注入bean有以下方法:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2   <beans xmlns="http://www.springframework.org/schema/beans"
 3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
 4
xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" 6 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 7 http://
www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 9 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 11 12 <!-- 這個就是springmvc裡面的包掃描,只要是家了@Controller,@Service之類的,都會自動掃描並加入註冊 --> 13 <context:component-scan base-package="com.lx.springmvcdemo" use-default-filters="false"></context:component-scan> 14 15 16 <!-- 這個就是spring裡面的bean註冊,scope是告訴spring是用什麼模式,是單例還是工廠或者request或者session等 -->
17 <bean id="person" class="com.lx.springmvcdemo.bean.Color" scope="prototype"> 18 <property name="yellow" value="yellow"></property> 19 <property name="red" value="red"></property> 20 </bean> 21 22 <bean ></bean> 23 24 <!-- 開啟基於配置的的AOP --> 25 <aop:aspectj-autoproxy ></aop:aspectj-autoproxy> 26 </beans>

可以看到,如果是手動注入bean的話,需要配置很多東西,比如採用的模式,包的路徑,id,預設屬性值等等,但用註解,可以省略很多,而且更加靈活

首先我們先建立一個普通的類:

package com.lx.springmvcdemo.bean;

public class Color {

    private String yellow;
    public Color(String yellow, String red) {
        super();
        this.yellow = yellow;
        this.red = red;
    }
    public Color() {
        super();
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "Color [yellow=" + yellow + ", red=" + red + "]";
    }
    public String getYellow() {
        return yellow;
    }
    public void setYellow(String yellow) {
        this.yellow = yellow;
    }
    public String getRed() {
        return red;
    }
    public void setRed(String red) {
        this.red = red;
    }
    private String red;
}

然後做一個配置類,我們起個名字叫MainConfig

package com.lx.springmvcdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import com.lx.springmvcdemo.bean.*;
import com.lx.springmvcdemo.condition.LinuxCondition;
import com.lx.springmvcdemo.condition.WindowCondition;


//類中組建統一設定,這個conditional裡面的是一個數組,只有滿足這個條件,這個類裡面的bean才會生效
//@Conditional({WindowCondition.class})
@Configuration

//快速匯入元件的註解,import,可以使用單個,也可以使用陣列,這樣就會自動匯入這個元件
//{Color.class,Red.class,MyImportSelecter.class,MyImportBeanDefinitionRegistart.class}
@Import({Blue.class})
public class MainConfigII {

    /*Scope,設定元件作用域
     *  * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
     * @see ConfigurableBeanFactory#SCOPE_SINGLETON
     * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
     * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
     * prototype:多例項,ioc啟動的時候,並不會去新增這個person物件,而是在每次呼叫的時候new一次
     * singleton:單例項,也是預設值,會一直使用同一個
     * request:同一次請求建立一個例項
     * session:同一個session建立一個例項
     * 
     * 
     * @lazy
     * 懶載入:
     * 只針對單例項bean,預設容器啟動的時候建立bean
     * 而懶載入則是,容器啟動的時候不建立物件,而是第一次使用時候
     * 建立物件並初始化
     * 
     * */
    
    //@Scope("singleton")//這個確定是單例還是多例項
//    @Lazy  ///這個就是懶載入
//    @Bean("person")
//    public Person person() {
//        System.out.println("啟動,新增person類");
//        return new Person("aj",33);
//    }
    
    /***
     * Conditional:按照條件註冊bean
     * 這個conditional也可以註冊到類上面
     * 意思也是一樣,就是滿足conditional這個註解裡面的條件,這個類下面的所以bean才會生效
     * @return
     */
    
    
    /***
     * 給容器中註冊元件的註解
     * 1),@Bean():就像下面所演示的一樣
     * 2),@import():可以快速匯入不需要操作很複雜的元件,可以直接用陣列批量匯入
     *             其中,ID是預設的全類名
     *             ImportSelector:自定義返回bean,陣列,
     *             importBeanDefinitionRegistart:手動註冊bean到容器裡面
     * 
     * 3),直接掃描某一個包下面的全部bean
     * 4),FactoryBean,這個是spring提供的工廠bean
     *             1),預設獲取呼叫的是bean呼叫getObject()的物件
     *             2),要獲取工廠本身的話,可以用&ColorFactoryBean來獲取,即&加上bean的ID
     * @return
     */



    
    @Bean  
    public Color Color() {
        return new Color();
    }
    
 
}

以上程式碼裡面都有很詳細的註釋

然後可以直接建立一個測試類

    @Test    
    public void test02() {
    //    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
        //通過AnnotationConfigApplicationContext獲取配置檔案
        //然後通過bean的ID 獲取bean
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(MainConfigII.class);
        Color c= (Color) applicationContext.getBean("Color");
     System.out.println(c.toString());
    //    Person person2=(Person) applicationContext.getBean("person");
        //System.out.println(person==person2);
    }

 以上。