Spring之實現依賴注入DI(1.0)
依賴注入
在Spring中最爲核心的兩大組件:IOC&DI、AOP,其中IOC稱爲控制反轉,實際上也就相當於將對象的創建權利交由Spring負責處理,但是隻是觀察對象的話嚴格來講並不能夠全面的觀察到Spring優點,還需要進一步觀察DI(依賴注入)。
在整個Spring裏面可以發現,其最大的特點是:直接設置類的完整名稱,而後就可以取得類的實例化對象,如果照這樣的思路,Spring的核心設計思想就是反射。
構造方法注入
1,定義一個Dept.class類。
@SuppressWarnings("serial")
public class Dept implements Serializable {
private Integer deptno;
private String dname;
private String loc;
public Dept(Integer deptno,String dname,String loc){
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public String toString(){
return "Dept [deptno="+deptno + ",dname="+dname + ",loc=" + loc +"]";
}
}
2,修改applicationContext.xml文件,進行Dept類對象的定義
<!-- 定義一個Java類的對象,一旦定義之後在Spring啓動之後就表示可以自動
實例化 -->
<bean id="dept" class="cn.mldn.vo.Dept">
<constructor-arg index="0" value="10"/>
<constructor-arg index="1" value="開發部"/>
<constructor-arg index="2" value="北京"/>
</bean>
於是這一瞬間可以發現,利用構造方法進行參數傳遞的時候只需要注意參數的順序以及匹配的類型即可。
3, 定義一個測試類TestDemoA。
public class TestDemoA {
public static void main(String[] args) {
// 以後這部分的代碼根本就不需要你去編寫
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// 將容器中已經可以使用的對象接收過來進行調用,此時與實例化對象沒有任何
的關係
Dept dept = ctx.getBean("dept", Dept.class);
System.out.println(dept);
}
}
4,運行結果
之所以要用到constructor-arg ,屬性的原因是類中沒有無參構造了,所以如果要使用反射進行處理的話,Class類中的newInstance()將無法使用,那麼此時必須明確的找到指定參數的構造方法,而後利用Constructor類來進行調用。
setter注入
現在可以發現,的確可以直接進行有參構造的調用,但是綜合來講,沒有人真的這麼做,因爲用對象的時候更多的習慣是利用setter方法設置的。
1,更改Dept.class類
·刪除代碼中有參構造
·加入setter()方法;
import java.beans.ConstructorProperties;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Dept implements Serializable {
private Integer deptno;
private String dname;
private String loc;
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
public String toString(){
return "Dept [deptno="+deptno + ",dname="+dname + ",loc=" + loc +"]";
}
}
2,配置相應的applicationContext.xml文件
<bean id="str" class="java.lang.String">
<constructor-arg index="0" value="北京"/>
</bean>
<!-- 定義一個Java類的對象,一旦定義之後在Spring啓動之後就表示可以自動實例
化 -->
<bean id="dept" class="cn.mldn.vo.Dept">
<!-- 一旦使用了此標籤,就意味者要調用類中的指定屬性的setter方法 -->
<property name="deptno" value="10"/>
<property name="dname">
<value>開發部</value>
</property>
<property name="loc">
<ref bean="str"/>
</property>
</bean>
在爲每個類屬性設置內容的時候實例上都可以採用兩種方式完成:
·value:表示設置具體的內容;
·ref:表示引用其他定義的Bean對象。
3, 定義一個測試類TestDemoB。
public class TestDemoB {
public static void main(String[] args) {
// 以後這部分的代碼根本就不需要你去編寫
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// 將容器中已經可以使用的對象接收過來進行調用,此時與實例化對象沒有任何的關係
Dept dept = ctx.getBean("dept", Dept.class);
System.out.println(dept);
}
}
4,運行結果
擴展:一個僱員屬於一個部門,則應該創建一個僱員類,而後引用這個部門類。
1,定義一個Emp.java類
import java.io.Serializable;
@SuppressWarnings("serial")
public class Emp implements Serializable {
private Integer empno;
private String ename;
private Dept dept;
public void setDept(Dept dept){
this.dept=dept;
}
public void setEmpno(Integer empno){
this.empno = empno;
}
public void setEname(String ename){
this.ename = ename;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", dept=" + dept
+ "]";
}
}
2,配置applicationContext.xml文件
<bean id="dept" class="cn.mldn.vo.Dept">
<!-- 一旦使用了此標籤,就意味者要調用類中的指定屬性的setter方法 -->
<property name="deptno" value="10"/>
<property name="dname" value="開發部"/>
<property name="loc" value="北京"/>
</bean>
<bean id="emp" class="cn.mldn.vo.Emp">
<!-- 一旦使用了此標籤,就意味者要調用類中的指定屬性的setter方法 -->
<property name="empno" value="7369"/>
<property name="ename" value="SMITH"/>
<property name="dept" ref="dept"/>
</bean>
3, 定義一個測試類TestDemoC。
public class TestDemoC {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Emp emp = ctx.getBean("emp",Emp.class);
System.out.println(emp);
}
}