傳統的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);
}
}
複製程式碼
- 先看
@Bean
註解,這個註解就是把Student這個類載入到IOC容器,我們看不到它的id
和property
,id預設是方法名,當然也可以手動設定(不建議),以這樣的方式設定:@Bean("xxx")
。那如何初始化它的欄位值呢,我們返回一個帶有值的例項化物件就行。 - 那
@Configuration
註解是幹嘛的呢,它用來宣告這是一個配置類,Spring容器啟動要來載入我這個類,如果不加這個配置,spring啟動不會載入到它。既然Spring能來載入這個類,就會發現Bean註解,自然也把bean就載入了。當然這樣的註解有很多,比如@Compoment、@Controller、@Servic
e等都能完成,只不過它們有它們的特定使用的規範。最好不要亂用,造成程式碼可讀性差。
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}
複製程式碼