spring註解開發(一)Bean注入

微笑面對生活發表於2018-08-21

傳統的Spring做法是使用.xml檔案來對bean進行注入,這樣做既麻煩又難維護。所以Spring後來引入了註解,大大減少配置檔案,增加了web程式碼的可讀性。

本文將對比配置注入bean和註解注入bean兩種方式。

因為本文主要比較這兩種開發模式,所以不介紹專案的構建。

1. xml配置注入bean

1.1 建立bean
public class Student {

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
    }

    private String name;
    private int age;
    
    setter and getter ...
複製程式碼
1.2 新增xml配置
    <bean id="student" class="com.fantj.bean.Student">
        <property name="age" value="18"/>
        <property name="name" value="FantJ"/>
    </bean>
複製程式碼

id表示bean的唯一標識,從bean工廠裡獲取例項化物件就是靠它,一般是類首字母小寫。 property 用來初始化類的欄位值,比如我初始化name=FantJ,age=18

1.3 執行檢視結果
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        Student person = (Student) applicationContext.getBean("student");
        System.out.println(person);
    }
複製程式碼

這個getBean方法返回的是Object物件,但是我們很確定根據student這個id取出的就是Student的例項化物件,所以我們可以直接在這裡做強制型別轉換。

Student{name='FantJ', age=18}
複製程式碼

2. 註解注入bean

2.1 建立配置類
@Configuration
public class MyConfig {

    @Bean
    public Student student(){
        return new Student("FantJ",20);
    }
}
複製程式碼
  1. 先看@Bean註解,這個註解就是把Student這個類載入到IOC容器,我們看不到它的idproperty,id預設是方法名,當然也可以手動設定(不建議),以這樣的方式設定:@Bean("xxx")。那如何初始化它的欄位值呢,我們返回一個帶有值的例項化物件就行。
  2. @Configuration註解是幹嘛的呢,它用來宣告這是一個配置類,Spring容器啟動要來載入我這個類,如果不加這個配置,spring啟動不會載入到它。既然Spring能來載入這個類,就會發現Bean註解,自然也把bean就載入了。當然這樣的註解有很多,比如@Compoment、@Controller、@Service等都能完成,只不過它們有它們的特定使用的規範。最好不要亂用,造成程式碼可讀性差。
2.2 測試
ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(MyConfig.class);
Student bean = applicationContext1.getBean(Student.class);
System.out.println(bean);
複製程式碼
Student{name='FantJ', age=20}
複製程式碼
2.3 @Component載入bean

寫這個的意思是告訴讀者,千萬不要以為註解載入Bean只有@Configuration能做到。

我們看下@Configuration原始碼

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {.....}
複製程式碼

可以看到它裡面包含這Component註解。那下來我們寫個Component載入bean的例子:

@Component
public class ComponentTest {
    @Bean
    public Student student(){
        return new Student("FantJ",21);
    }
}
複製程式碼
ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(ComponentTest.class);
Student bean1 = applicationContext2.getBean(Student.class);
System.out.println(bean1);
複製程式碼
Student{name='FantJ', age=21}
複製程式碼

相關文章