目錄
兩個測試類
package cn.ganlixin.pojo; public class Major { private String name; private String category; // 此處省略了無參構造方法、有參構造方法、getter和setter、toString方法 }
package cn.ganlixin.pojo; public class Student { private int id; private String name; private Major major; // 需要引用一個major對象 // 此處省略了無參構造方法、有參構造方法、getter和setter、toString方法 }
普通方式注入
上面的Student依賴於一個Major類型的對象,在創建Student這個類的對象(bean)的時候,對major屬性進行注入時,需要引用一個Major類創建的bean,也就是下面這樣:
<?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.xsd"> <bean id="major" class="cn.ganlixin.pojo.Major"></bean> <bean id="student" class="cn.ganlixin.pojo.Student"> <!-- 引用上面的major bean --> <property name="major" ref="major"></property> </bean> </beans>
普通方式注入的缺點
從上面的配置上來看,其實配置一個<property>好像並不困難,但是當項目稍微大一點,類中屬性稍微復雜一點,那么配置利用<property>進行注入將是特別不便捷的,需要寫很多的<property>,並且需要記住創建的bean的id,否則可能會引用錯誤。
另外,在修改配置的時候也不方便,當一個bean的id發生改變,引用他的bean中的<property>的ref屬性也要進行修改,所以,真的不方便。
自動注入的介紹
依舊以上面這段配置為例:
<bean id="major" class="cn.ganlixin.pojo.Major"></bean> <bean id="student" class="cn.ganlixin.pojo.Student"> <!-- 引用上面的major bean --> <property name="major" ref="major"></property> </bean>
其實,我們發現,student這個bean中的<property>中的name和ref,值(字符串)都是一樣的,如果能省略這一句,然后讓student的major屬性自動去找id為major的<bean>,就方便很多了。
<bean id="major" class="cn.ganlixin.pojo.Major"></bean> <bean id="student" class="cn.ganlixin.pojo.Student" autowire="byName"></bean> <!-- major屬性自動去Spring容器中尋找id為major的bean,自動引用 -->
其實這就是自動注入,只不過,我們還需要進行其他配置。
配置自動注入的方式
配置自動注入的方式有兩種,一種是全局配置,另一種是局部單獨配置。
全局配置:只配置一次,之后配置文件中的所有bean,都按照全局配置進行注入,全局配置是在<beans>標簽中配置default-autowire="Xxx";
局部單獨配置:對於每一個bean,單獨設置注入方式,單獨配置是在單獨的<bean>標簽中配置autowire="xxx"。
對於全局配置和局部單獨配置,都有5個值可以選擇:
1、no:當autowire設置為no的時候,Spring就不會進行自動注入,相當於不給引用屬性賦值。
2、byName:在Spring容器中查找id與屬性名相同的bean,並進行注入。
3、byType:在Spring容器中查找類型與屬性名的類型相同的bean,並進行注入。
4、constructor:仍舊是使用byName方式,只不過注入的時候,使用構造方式進行注入。
5、default:全局配置的default相當於no,局部的default表示使用全局配置設置
配置全局自動注入
<?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.xsd" default-autowire="byName" > <!-- 注意,<beans>標簽中配置了全局自動注入方式 --> <bean id="major" class="cn.ganlixin.pojo.Major"></bean> <bean id="student" class="cn.ganlixin.pojo.Student"></bean> <!-- 默認使用全局配置,全局設置為byName,所以會按照byName方式自動注入, --> </beans>
局部單獨配置
使用局部單獨配置就是在要創建的<bean>中設置autowire屬性:
<?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.xsd" default-autowire="no" > <!-- 注意,<beans>標簽中配置了全局自動注入方式 --> <bean id="major" class="cn.ganlixin.pojo.Major"></bean> <bean id="student" class="cn.ganlixin.pojo.Student" autowire="byName"></bean> <!-- 局部進行配置后,會覆蓋全局配置,局部設置為byName,所以會按照byName方式自動注入, --> </beans>
使用注解實現自動注入
使用注解自動注入,可以參考:Spring 使用注解完成IoC與DI
主要使用的是@autowired和@Resource兩個注解