日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
測試同學(xué)上手Spring之DI深入解析

前面已經(jīng)介紹了如何上手Spirng編碼以及IOC的核心概念,今天給大家講解Spring的另一個重點——DI。

Spring核心模塊

DI概念

IoC 其實有兩種方式,一種就是 DI(Dependency Injection) ,而另一種是 DL(Dependency Lookup)即依賴查找。前者是當(dāng)前組件被動接受IoC容器注入的依賴組件,而后者則是組件主動去某個服務(wù)注冊地查找其依賴的組件,我們這里重點介紹DI。

IoC的一個重點是在系統(tǒng)運行中,動態(tài)的向某個對象提供它所需要的其他對象。這一點是通過DI來實現(xiàn)的。比如對象A需要操作數(shù)據(jù)庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了spring我們就只需要告訴spring,A中需要一個Connection,至于這個Connection怎么構(gòu)造,何時構(gòu)造,A不需要知道。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何代碼就可指定目標(biāo)需要的資源,完成自身的業(yè)務(wù)邏輯,而不需要關(guān)心具體的資源來自何處,由誰實現(xiàn)。在系統(tǒng)運行時,spring會在適當(dāng)?shù)臅r候制造一個Connection,然后像打針一樣,注射到A當(dāng)中,這樣就完成了對各個對象之間關(guān)系的控制。A需要依賴Connection才能正常運行,而這個Connection是由spring注入到A中的,依賴注入的名字就這么來的。Spring是通過反射技術(shù)實現(xiàn)注入的,它允許程序在運行的時候動態(tài)的生成對象、執(zhí)行對象的方法、改變對象的屬性。

簡單的總結(jié)一下依賴注入:

  • 依賴 : 指Bean對象的創(chuàng)建依賴于容器 。
  • 注入 : 指Bean對象所依賴的資源 , 由容器來設(shè)置和裝配。

注入的方式主要包括Setter注入(重點)、構(gòu)造器注入和參數(shù)直接注入。還有拓展方式注入,即:p命名空間注入和c命名空間注入,這里就不再展開介紹了,有興趣的同學(xué)可以自行研究。

Setter注入

IoC 容器使用 setter 方法注入被依賴的實例。通過調(diào)用無參構(gòu)造器或無參 static 工廠方法實例化 bean 后,調(diào)用該 bean的setter 方法(類中必須有屬性的set方法),即可實現(xiàn)基于setter的DI

代碼如下:

 
 
 
 
  1. public class Address { 
  2.     private String address; 
  3.     public String getAddress() { 
  4.         return address; 
  5.     } 
  6.     public void setAddress(String address) { 
  7.         this.address = address; 
  8.     } 

 
 
 
 
  1. import java.util.List; 
  2. import java.util.Map; 
  3. import java.util.Properties; 
  4. import java.util.Set; 
  5. public class Student { 
  6.     private String name; 
  7.     private Address address; 
  8.     private String[] books; 
  9.     private List hobbys; 
  10.     private Map card; 
  11.     private Set games; 
  12.     private String wife; 
  13.     private Properties info; 
  14.     public void setName(String name) { 
  15.         this.name = name; 
  16.     } 
  17.     public String getName() { 
  18.        return this.name; 
  19.     } 
  20.     public void setAddress(Address address) { 
  21.         this.address = address; 
  22.     } 
  23.    public void setBooks(String[] books) { 
  24.         this.books = books; 
  25.     } 
  26.     public void setHobbys(List hobbys) { 
  27.         this.hobbys = hobbys; 
  28.     } 
  29.     public void setCard(Map card) { 
  30.         this.card = card; 
  31.     } 
  32.     public void setGames(Set games) { 
  33.         this.games = games; 
  34.     } 
  35.     public void setWife(String wife) { 
  36.         this.wife = wife; 
  37.     } 
  38.     public void setInfo(Properties info) { 
  39.         this.info = info; 
  40.     } 
  41.     public void show(){ 
  42.         System.out.println("name="+ name 
  43.                 +",address="+ address.getAddress() 
  44.                 +",books=" 
  45.         ); 
  46.         for (String book:books){ 
  47.             System.out.print("<<"+book+">>\t"); 
  48.         } 
  49.         System.out.println("\nhobbys:"+hobbys); 
  50.         System.out.println("card:"+card); 
  51.         System.out.println("games:"+games); 
  52.         System.out.println("wife:"+wife); 
  53.         System.out.println("info:"+info); 
  54.     } 

 配置文件

 
 
 
 
  1.  
  2.       
  3.   

配置文件中把name 賦值為小明,即完成了對代碼 private String name的注入。

測試類

 
 
 
 
  1. public static void main(String[] args) { 
  2.            ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); 
  3.            Student student=(Student)context.getBean("student"); 
  4.            System.out.println(student.getName()); 
  5.         } 

 運行結(jié)果,輸出:小明

常見注入方式的xml 配置如下:

bean注入

使用ref進行引入其他bean

 
 
 
 
  1.  
  2.       
  3.      
  4.  

數(shù)組注入

 
 
 
 
  1.  
  2.           
  3.              數(shù)學(xué) 
  4.              語文 
  5.              英語 
  6.           
  7.      

 List注入

 
 
 
 
  1.  
  2.       
  3.          聽歌 
  4.          看電影 
  5.          打游戲 
  6.       
  7.    

 Map注入

 
 
 
 
  1.  
  2.       
  3.           
  4.           
  5.       
  6.   

set注入

 
 
 
 
  1.  
  2.       
  3.          CS 
  4.          斗地主 
  5.          消消樂 
  6.       
  7.   

 Null注入

 
 
 
 
  1.  

Properties注入

 
 
 
 
  1.  
  2.       
  3.          123456 
  4.          男 
  5.          小明 
  6.       
  7.   

 測試方法

 
 
 
 
  1. public static void main(String[] args) { 
  2.            ApplicationContextcontext = new ClassPathXmlApplicationContext("bean1.xml"); 
  3.            Studentstudent=(Student)context.getBean("student"); 
  4.            student.show();  
  5.         } 

 運行結(jié)果,輸出:

name=小明,address=北京,books=

<<數(shù)學(xué)>> <<語文>> <<英語>>

hobbys:[聽歌, 看電影, 打游戲]

card:{招行=123456789, 工行=987654321}

games:[CS, 斗地主, 消消樂]

wife:null

info:{學(xué)號=123456, 性別=男, 姓名=小明}

構(gòu)造器注入

指IoC 容器使用構(gòu)造方法注入被依賴的實例。基于構(gòu)造器的 DI 通過調(diào)用帶參數(shù)的構(gòu)造方法實現(xiàn),每個參數(shù)代表一個依賴。

代碼如下:

 
 
 
 
  1. public class Student2{ 
  2.        private String name; 
  3.        public Student2(String name) { 
  4.           this.name = name; 
  5.       } 
  6.        public void setName(String name) { 
  7.           this.name = name; 
  8.       } 
  9.        public void show(){ 
  10.           System.out.println("name="+ name ); 
  11.       } 
  12.     } 

 配置文件中設(shè)置

 
 
 
 
  1.   
  2.  
  3.     
  4.     
  5.  
  6.  
  7.  
  8.     
  9.     
  10.  
  11.  
  12.  
  13.     
  14.  

測試代碼

 
 
 
 
  1. public static void main(String[] args) { 
  2.            ApplicationContextcontext = new ClassPathXmlApplicationContext("bean3.xml");        
  3.            Student2 user = (Student2) context.getBean("student1") 
  4.            user.show(); 
  5.         } 

 運行結(jié)果:

name=kevin1

參數(shù)直接注入

主要通過注解@Autowired、@Qualifier和@Resource來實現(xiàn)

@Autowired

@Autowired是按類型自動轉(zhuǎn)配的,不支持id匹配。

需要導(dǎo)入 spring-aop的包

配置文件中設(shè)置<

context:annotation-config/>

代碼:

 
 
 
 
  1. public class Animal {    
  2. @Autowired    private Cat cat; //運行時spring通過DI會把Cat類實例化    
  3. @Autowired private Dog dog;//運行時spring通過DI會把Dog類實例化    
  4.        public void printCatshot() { 
  5.               cat.shout();      
  6.   }   
  7.         public void printDogshot() { 
  8.                 dog.shout(); 

 @Qualifier

@Autowired是根據(jù)類型進行自動裝配的。如果當(dāng)Spring上下文中存在一個類型的不同bean時,就會拋出BeanCreationException異常;我們可以使用@Qualifier配合@Autowired來解決這些問題。

代碼:

 
 
 
 
  1. @Autowired 
  2. @Qualifier(value= "dog1") 
  3. private Dog dog1; 
  4. beans.xml 
  5.  
  6.  

 @Resource

@Resource是J2EE提供的, 需導(dǎo)入Package: javax.annotation.Resource;

@Resource如有指定的name屬性,先按該屬性進行byName方式查找裝配,其次再進行默認的byName方式進行裝配,都不成功,則報異常。

代碼

 
 
 
 
  1. @Resource(name = "dog2") 
  2. private Dog dog; 
  3. beans.xml 
  4.  
  5.  

 最簡單的解釋

IoC通過DI技術(shù)主要實現(xiàn)了以下兩點:

  • 在系統(tǒng)運行中,動態(tài)地向某個對象提供它所需要的其他對象;
  • 在系統(tǒng)運行中,動態(tài)地從配置文件中讀取數(shù)據(jù)來為對象的屬性進行賦值。

 【編輯推薦】

  1. 跟妹妹聊到 Java 16 新特征,真香!
  2. IT項目過多,管理太難?NO!因為你還沒學(xué)會這七招
  3. 學(xué)了五年P(guān)ython,這些網(wǎng)站讓我相見恨晚,快來一起見識一下
  4. Java都到16了,為什么都還在用8,是越做越爛了么?
  5. 實在太神奇!Windows10這些黑科技小功能你都用過嗎

文章題目:測試同學(xué)上手Spring之DI深入解析
URL標(biāo)題:http://www.5511xx.com/article/cddjdeg.html