1、Spring的依賴注入(DI)
1.1 xml形式注入 java
(1)普通變量的注入spring
//普通變量的注入,xml配置property,實體類配置set方法注入 <bean id="person" class="com.jyk.spring.simpletest.Person"> <property name="id" value="1"></property> <property name="name" value="tom"></property>
</bean> public class Person { public String id; public String name; public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void printInfo(){ System.out.println("id=="+id); System.out.println("name=="+name); } }
(2)對象的引用注入,該種形式的xml配置靈活,建議使用內部bean的配置形式函數
//多對象的引用注入,一樣可採用常規的xml配置,對象中配置set方法來實現注入
<bean id="dao" class="com.jyk.spring.simpletest.Dao"> </bean> <bean id="service" class="com.jyk.spring.simpletest.Service"> <property name="dao" ref="dao"></property> </bean> <bean id="action" class="com.jyk.spring.simpletest.Action"> <property name="service" ref="service"></property> </bean>
//內部bean的配置形式
<bean id="action" class="com.jyk.spring.simpletest.Action">
<property name="service">
<bean class="com.jyk.spring.simpletest.Service">
<property name="dao">
<bean class="com.jyk.spring.simpletest.Dao"></bean>
</property>
</bean>
</property>
</bean>ui
public class Action { private Service service; public void setService(Service service) { this.service = service; } public void execute(){ service.execute(); } } public class Service { private Dao dao; public void setDao(Dao dao) { this.dao = dao; } public void execute(){ dao.execute(); } } public class Dao { public void execute(){ System.out.println("dao執行邏輯"); } }
(3)p 名稱空間給對象的屬性注入值(該功能僅Spring3.0以上支持)this
<bean id="person" class="com.jyk.spring.simpletest.Person" p:id="1" p:name="cat"></bean>
<bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean> <bean id="service" class="com.jyk.spring.simpletest.Service" p:dao-ref="dao"></bean> <bean id="action" class="com.jyk.spring.simpletest.Action" p:service-ref="service"></bean>
(4)裝配list,set,map,properties集合spa
<bean id="person" class="com.jyk.spring.simpletest.Person"> </bean> <bean id="person1" class="com.jyk.spring.simpletest.Person1"> <property name="list"> <list> <value>list1</value> <value>list2</value> <ref bean="person"/> </list> </property> <property name="set"> <set> <value>set1</value> <value>set2</value> <ref bean="person"/> </set> </property> <property name="map"> <map> <entry key="key1"> <value>map1</value> </entry> <entry key="key2"> <value>map2</value> </entry> </map> </property> <property name="properties"> <props> <prop key="01">prop1</prop> <prop key="02">prop2</prop> </props> </property> </bean> public class Person1 { private List list; private Map map; private Set set; private Properties properties; public void setList(List list) { this.list = list; } public void setMap(Map map) { this.map = map; } public void setSet(Set set) { this.set = set; } public void setProperties(Properties properties) { this.properties = properties; } public void printInfo(){ System.out.println("list=="+list); System.out.println("map=="+map); System.out.println("set=="+set); System.out.println("properties=="+properties); } }
1.2 自動裝配code
什麼是自動裝配?就是對屬性,方法參數,引用的其餘bean,無需經過property的形式來配置,而是經過必定的自動裝配策略,交由Spring進行自動適配和裝載。強烈建議使用自動裝配,由於擴展性高,代碼可維護性強,好比在java代碼中新增一個屬性或引用,只需添加set方法,以及配置文件中配置對應的bean便可。並且自動裝配也能夠顯著減小bean配置的繁瑣過程。xml
(1)byName 根據屬性名自動裝配。此選項將檢查容器並根據名字查找與屬性徹底一致的bean,並將其與屬性自動裝配。對象
public class Action { private Service service; public void setService(Service service) { this.service = service; } public void execute(){ service.execute(); } } public class Service { private Dao dao; public void setDao(Dao dao) { this.dao = dao; } public void execute(){ dao.execute(); } } public class Dao { public void execute(){ System.out.println("dao執行邏輯"); } } <bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean> <bean id="service" class="com.jyk.spring.simpletest.Service" autowire="byName"></bean> <bean id="action" class="com.jyk.spring.simpletest.Action" autowire="byName"></bean>
(2)byType 若是容器中存在一個與指定屬性類型相同的bean,那麼將與該屬性自動裝配。若是存在多個該類型的bean,那麼將會拋出異常,並指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什麼事都不發生,屬性也不會被設置。如沒找到匹配的bean須要拋出異常,則能夠經過設置經過設置
dependency-check="objects"來使Spring拋出異常。blog
<bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean> <bean id="service" class="com.jyk.spring.simpletest.Service" autowire="byType"></bean> <bean id="action" class="com.jyk.spring.simpletest.Action" autowire="byType"></bean>
(3)constructor 與byType的方式相似,不一樣之處在於它應用於構造器參數。若是在容器中沒有找到與構造器參數類型一致的bean,那麼將會拋出異常。而且 constructor會優先查找參數比較多的構造函數
(4) autodetect 經過bean類的自省機制(introspection)來決定是使用constructor仍是byType方式進行自動裝配。若是發現默認的構造器,那麼將使用byType方式
1.3 註解形式注入
Spring提供了一系列註解,經過在Java類中添加各類註解,一樣能夠達到依賴注入的效果。
@Autowired註解是按類型裝配依賴對象,默認狀況下它要求依賴對象必須存在,若是容許null值,能夠設置它required屬性爲false。
@Resource註解默認按名稱裝配,若是沒有指定name屬性,而且按照默認的名稱找不到依賴對象時, @Resource註解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。
區別:@Resource註解和@Autowired同樣,均可以標註在字段或屬性的setter方法上,不一樣的是當@Resource註解標註在字段上,即默認取字段的名稱做爲bean名稱尋找依賴對象,當@Resource註解標註在屬性的setter方法上,即默認取屬性名做爲bean名稱尋找依賴對象。而@Autowired則是以bean類型爲基準。
@Qualifier註解按名稱裝配。
@PostConstruct 指定Bean的初始化方法
@PreDestroy 指定Bean的銷燬方法