一、Spring的依賴注入(DI)
1.依賴注入:
IOC的作用:降低程序之間的耦合(依賴關系)
概念:依賴關系的管理交給spring維護,在當前類需要用到其他類的對象,由spring為我們提供,只需在配置文件中說明關系的維護;
2.能夠注入的數據有三類:
1) 基本類型和string
2) 其他bean類型(在配置文件中或者注解配置過的bean)
3) 復雜集合類型
3.注入方式
1) 使用構造函數
<!-- 構造函數注入: 使用的標簽:constructor-arg 標簽出現的位置:bean標簽內部 標簽的屬性 type:用於指定要注入的數據的數據類型,該數據構造函數中某個或某些參數類型 index:用於指定要注入的數據給構造函數中指定索引位置的參數賦值,索引位置從0開始 name:用於指定給構造函數中指定名稱的參數賦值(常用) =================以上用於指定個給構造函數中那個參數賦值========== value:用於提供基本類型和string類型數據 ref:用於指定其他的bean類型數據,它指的就是在spring的Ioc核心容器中出現過的bean對象 優勢:在獲取bean對象時,注入數據是必須的操作,否則對象無法創建成功 弊端:改變了bean對象的實例化方式,使我們在創建對象時,如果融不到這些數據,頁必須提供 --> <bean id="accountService" class="com.li.service.impl.AccountServiceImpl"> <constructor-arg name="name" value="text"></constructor-arg> <constructor-arg name="age" value="18"></constructor-arg> <constructor-arg name="birthday" ref="now"></constructor-arg> </bean> <!--配置一個日期對象--> <bean id="now" class="java.util.Date"></bean>
public class AccountServiceImpl implements IAccountService { //如果經常變化的數據不適合的注入方式 private String name; private Integer age; private Date birthday; public AccountServiceImpl(String name,Integer age,Date birthday) { this.name=name; this.age=age; this.birthday=birthday; } public void saveAccount() { System.out.println("service中的saveAccount執行了******"); } }
2.1.)set方法注入(常用)
<!--set方法注入 常用 涉及的標簽:property 出現的位置:bean標簽的內部 name:用於注入時所調用的set方法名稱 value:用於提供基本類型和string類型數據 ref:用於指定其他的bean類型數據,它指的就是在spring的Ioc核心容器中出現過的bean對象 優勢:創建對象時沒有明確的限制,可以直接使用默認構造函數 弊端:如果由某個成員,必須有值,則獲取對象時,有可能set方法沒有執行 --> <bean id="accountService2" class="com.li.service.impl.AccountServiceImpl2"> <property name="name" value="test"></property> <property name="age" value="18"></property> <property name="birthday" ref="now"></property> </bean>
public class AccountServiceImpl2 implements IAccountService { private String name; private Integer age; private Date birthday; public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void setBirthday(Date birthday) { this.birthday = birthday; } public void saveAccount() { System.out.println("service中的saveAccount執行了******"); }
2.2.)使用set注入完成復雜集合類型數據
<!-- 復雜類型的注入/集合類型的注入 用於給List結構集合注入的標簽 list array set 用於給List結構集合注入的標簽 map props 結構相同,標簽可以互換 --> <bean id="accountService3" class="com.li.service.impl.AccountServiceImpl3"> <property name="myStrs"> <array> <value>aaa</value> <value>bbb</value> <value>ccc</value> </array> </property> <property name="myList"> <list> <value>AAA</value> <value>BBB</value> <value>CCC</value> </list> </property> <property name="mySet"> <set> <value>AAA</value> <value>BBB</value> <value>CCC</value> </set> </property> <property name="myMap"> <map> <entry key="testA" value="aaa"></entry> <entry key="testB" value="bbb"></entry> </map> </property> <property name="myProp"> <props> <prop key="testC">ccc</prop> <prop key="testD">ddd</prop> </props> </property> </bean>
public class AccountServiceImpl3 implements IAccountService { private String[] myStrs; private List<String> myList; private Set<String> mySet; private Map<String,String> myMap; private Properties myProp; public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public void setMyList(List<String> myList) { this.myList = myList; } public void setMySet(Set<String> mySet) { this.mySet = mySet; } public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } public void setMyProp(Properties myProp) { this.myProp = myProp; } public void saveAccount() { System.out.println(Arrays.toString(myStrs)); System.out.println(myList); System.out.println(mySet); System.out.println(myMap); System.out.println(myProp); }
3)注解方式
* 用於創建對象:
作用和XML配置文件的<bean>標簽的實現功能一致;
1) @Component: 作用:用於當前類存入spring容器
屬性:value: 用於指定bean的id,當我們不寫時,默認為當前類的名稱且首字母小寫
2)@Controller : 用於表現層
3)@Service: 用於業務層
4)@Repository: 用於持久層
以上三個注解和Component功能一樣;
* 用於注入數據:
作用和XML配置文件中的bean標簽中的<property>作用一樣;
1)@Autowried
作用:自動按類型注入,只要容器中由唯一的bean對象類型和要注入的變量類型匹配,就可以成功注入
出現位置:可以為成員變量,也可以為方法
2)@Qualifier:
作用:再按照類中注入的基礎之上再按照名稱注入,它在給類成員注入時不能單獨使用和Autowired配合使用,但是給方法注入時可以
屬性:value:用於指定注入bean的id
3) @Resources
作用:直接按照bean的id注入,它可以獨立使用
屬性:name:用於指定bean的id
以上三種注入只能注入其他bean類型的數據,而基本類型和String類型無法使用上述注解實現
4) @Value
作用:用於注入基本類型和String類型數據
屬性:value:用於指定數據的值,它可以使用spring中的spEL(也就是spring的el表達式)
SpEl的寫法:${表達式}
* 用於改變作用范圍
作用和在bean標簽中使用scopoe屬性實現的功能一樣的
Scope
作用:用於指定bean的作用范圍
屬性:value:指定范圍取值。常用的值:singleton(單例) prototype(多例)
* 和生命周期相關
作用和在bean標簽中使用init_method和destroy-method的作用一樣
PreDestroy:用於指定銷毀
PostConstruct:用於指定初始化