java之Spring實現控制反轉


先來復習一下多態吧,簡單點講,就是一個類的引用可以指向其本身以及其子類的對象。

Like these:

FatherClass a = new FatherClass();

FatherClass a = new Son1Class();

FatherClass a = new Son2Class();

再來說說接口和其實現類,父類和子類是繼承關系(父子關系),接口和實現類的關系與之是有區別的;

接口中只定義方法,沒有方法體,而接口實現類就是負責補充方法體,多個實現類的方法體可以是不同的。

現在定義一個接口InterfaceDemo和兩個實現類Demoimp1、Demoimp2.三個類都有同名方法say();

InterfaceDemo b = new Demoimp1();

InterfaceDemo c = new Demoimp2();

那么b.say()和c.say()是調用了兩個不同的方法的。

說到這,就該輪到Spring閃亮登場了!!!

1.面向接口的編程

從上面我們可以看到,我們想要調用某個實現類的say()方法,先要實例化一個這個類的對象,無論是直接實例化

還是通過引用多態的方式實例化該類對象。

而面向接口呢,是不顯式地實例化這個實現類對象,而是定義一個接口類的對象,然后定義方法去調用接口類對

象的方法,然后在程序要真正使用這個方法時,先通過setter()方法來聲明這個接口類對象具體是指向哪個實現類

的對象,然后運行這個方法時就會真正調用接口實現類的的方法了(接口和實現類的方法名都相同)。

 1 public class Userservice {
 2     // 定義接口的引用
 3     private UserDao userdao;
 4 
 5     // 定義setter方法,設置接口的引用指向哪個實現類的對象
 6     public void setUserdao(UserDao userdao) {
 7         this.userdao = userdao;
 8     }
 9 
10     public void useradd(User newuser) {
11         // 此時的userdao經過spring依賴注入之后已經實現指向特定的接口實現類對象
12         // 那么調用接口的方法,實際上是調用了特定實現類的方法的
13         userdao.adduser(newuser);
14     }
15 }

2.依賴注入

又叫做接口注入,可以看做規定這個接口對象userdao到底要指向哪個實現類的對象,進而實現對何種實現類方法

的調用。

以下是beans.xml文件:

1     <bean id="todo" class="com.eco.daoimp.Usertodo1"></bean>
2     
3     <!--定義Userservice類內部接口的引用(userdao)指向具體的實現類對象(Usertodo1) -->
4     <bean id="userservice" class="com.eco.service.Userservice">
5         <property name="userdao" ref="todo"></property>
6     </bean>

依賴注入有三種方法,在這里只說最常用的setter注入,紅字可以看做是一個連接器,上面的第二個bean標簽實現

了聲明接口對象userdao是指向Usertodo1這個實現類的,那么自然之前的userdao.adduser(newuser)實際上也就等

於實例化一個Usertodo1對象,然后調用Usertodo1對象的adduser(newuser)方法。

3.測試類通過對xml文件的操作來明確接口對象的指向

 1 public class Test1 {
 2     @Test
 3     public void add() {
 4         // Spring讀取beans。xml文件
 5         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
 6         // 解析id為userservice的bean標簽,內部實現UserDao userdao = new Usertodo1()
 7         Userservice service = (Userservice) ctx.getBean("userservice");
 8         User newuser = new User("桔子桑", 31);
 9         // 此時調用的useradd()方法,就是接口實現類Usertodo1的useradd()方法
10         service.useradd(newuser);
11     }
12 }

如此,就實現了通過xml文件來對Usertodo1的useradd(newuser)方法的調用。我為每個實現類的方法添加了標記,

1 //Usertodo1類
2 System.out.println("todo1 create the user");
3 
4 //Usertodo2類
5 System.out.println("todo2 create the user");

上面的bean文件配置,最后運行測試了類,控制台打印輸出:

1 todo1 create the user

然后我們改一下上面的bean標簽如下:

1 <bean id="todo" class="com.eco.daoimp.Usertodo2"></bean>

控制台打印輸出:

1 todo2 create the user

這樣我們只需通過更改bean文件就能實現對不同實現類方法的調用了,再也不用在代碼中具體實例化這個實現類了,

這就相當於把控制權交給了Spring,實現了控制反轉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM