中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Spring的IOC

發布時間:2021-10-12 09:07:50 來源:億速云 閱讀:105 作者:iii 欄目:開發技術

這篇文章主要講解了“如何理解Spring的IOC”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解Spring的IOC”吧!

1 什么是IOC?

對于IOC的理解,主要是停留在概念和幾種注入的方式上,雖然知道其生命周期,但是對整個bean管理的宏觀角度,理解的不夠深刻。

IOC:**控制反轉(Inversion of Control)容器,**是一種設計思想。意味著將你設計好的對象交給容器控制。

1.1 什么是依賴注入

這個概念的理解,我準備使用一個案例來表示。如果a類中包含了b類,就說明a類對b類產生了依賴。如一個人需要車,這就說人對車產生了依賴。

class User{    Car car;    public User(){      car=new Car();    }  }

上面這個案例,可以看到,在User類中,包含了Car類,也就說User類對Car類產生了依賴。

按照傳統的方式,User類如果想要使用Car基本上就是在內部new一個新對象即可。但是這樣做缺點很大,new的方式也就意味著User和Car產生了緊耦合。不利于大規模使用。于是使用了另外一種方式可以代替。那就是什么時候用到Car,從外部直接傳遞過來就好。這樣的話,耦合性就大大降低了。再看下面這種形式是不是就好很多了。

class User{    Car car;    public User(Car car){      this.car=car;    }  }

像這樣的方式就是依賴注入,也就是把依賴Car注入到了User中。

1.2 什么是控制反轉

有了上面依賴注入的概念,再立即控制反轉就比較簡單了。

  • 誰控制誰:傳統方式User是在內部new,現在我們通過依賴注入的方式注入依賴對象Car。現在spring出現了,發明了IOC,IOC里面有一個容器,這些依賴對象全部交給容器去管理。也就是說這些依賴對象的控制權交給了容器。

  • 如何反轉:傳統方式User是主動去new,這種方式是正轉。反轉是由容器來幫忙創建及注入依賴對象;

2 依賴注入的幾種形式

目前主要有五種注入方式:SET注入,構造器注入,靜態工廠,實例工廠。

本文直接使用網上的基本案例來實現。比如UserService依賴UserDao。先把UserDao定義好了,接下來看如何實現注入的。

public class UserDao {  public String userLogin() {   return "userLogin()方法";  } }

下面看幾種依賴注入的幾種實現方式。

2.1 set注入

第一步:XML配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  <bean id="userDao" class="com.xxx.demo.UserDao"></bean>  <!-- setter注入 -->  <bean id="userService" class="com.xxx.demo.UserService">         <!--ref是對于外部bean對象引用,與被引用的bean對象的id保持一致-->   <property name="userDao" ref="userDao"></property>  </bean> </beans>

第二步:set方式注入

public class UserService {     //一定要提供屬性的setter方法  private UserDao userDao;  public void userlogin() {   String res=userDao.userLogin();   System.out.println(res);  }  public void setUserDao(UserDao userDao) {   this.userDao = userDao;  } }

這種方式簡單易操作。

2.2 構造器注入

第一步:XML配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  <bean id="userDao" class="com.xxx.demo.UserDao"></bean>  <!-- 構造器注入 -->  <bean id="userServiceV2" class="com.xxx.demo.UserServiceV2">   <constructor-arg index="0" ref="userDao"></constructor-arg>   <constructor-arg index="1" value="印度三哥"></constructor-arg>  </bean> </beans>

第二步:構造器注入

public class UserServiceV2 {  private UserDao userDao;  private String name;  public void userlogin() {   String res=userDao.userLogin();   System.out.println(res);   System.out.println(name);  }  public UserServiceV2(UserDao userDao,String name) {   super();   this.userDao = userDao;   this.name = name;  } }

2.3 靜態工廠注入

第一步:XML配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  <!-- 靜態工廠注入 -->  <bean id="userDao01" class="com.xxx.demo.StaticFactory" factory-method="createuserDao"></bean>  <bean id="userService01" class="com.xxx.demo.UserService">   <property name="userDao" ref="userDao01"></property>  </bean> </beans>

第二步:定義靜態工廠

public class StaticFactory {  public static UserDao createuserDao(){   return new UserDao();  } }

第三部:靜態工廠注入

public class UserService {  private UserDao userDao;  public void userlogin() {   String res=userDao.userLogin();   System.out.println(res);  }  public void setUserDao(UserDao userDao) {   this.userDao = userDao;  } }

2.4 實例化工廠

第一步:XML配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  <!-- 實例化工廠 -->  <bean id="instanceFactory" class="com.xxx.demo.InstanceFactory"></bean>  <bean id="userDao3" factory-bean="instanceFactory" factory-method="createUserDao"></bean>  <bean id="userService02" class="com.xxx.demo.UserService">   <property name="userDao" ref="userDao3"></property>  </bean> </beans>

第二步:工廠注入

public class InstanceFactory {  public UserDao createUserDao(){   return new UserDao();  } }

以上就是幾種常見的注入方式。在開發中比較常用。知道了IOC的概念和幾種實現方式之后,下面主要探討IOC的底層實現原理。

3 IOC底層實現過程

Spring IOC容器初始化的核心過程主要有四個步驟(還有一些如:后置加載器,國際化,事件廣播器等一些過程不展開):

  1. 鴻蒙官方戰略合作共建——HarmonyOS技術社區

  2. Bean定義的定位,Bean  可能定義在XML中,或者一個注解,或者其他形式。這些都被用Resource來定位,讀取Resource獲取BeanDefinition 注冊到  Bean定義注冊表中。

  3. 第一次向容器getBean操作會觸發Bean的創建過程,實列化一個Bean時 ,根據BeanDefinition中類信息等實列化Bean。

  4. 將實列化的Bean放到單列Bean緩存內。

  5. 此后再次獲取向容器getBean就會從緩存中獲取。

這張圖是核心的過程。這個過程是已經簡化了,具體的實現方式要設計到bean的生命周期的管理。安排到下一章節了。spring的核心內容就是aop和ioc,知道了這倆是如何實現的之后,就是核心bean管理的核心實現,最后對配置文件進行介紹。

感謝各位的閱讀,以上就是“如何理解Spring的IOC”的內容了,經過本文的學習后,相信大家對如何理解Spring的IOC這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

徐闻县| 河北省| 阜阳市| 老河口市| 龙南县| 潼南县| 汤阴县| 海盐县| 新郑市| 深泽县| 平江县| 台州市| 裕民县| 广德县| 商南县| 奎屯市| 亳州市| 鄱阳县| 东兴市| 清河县| 太谷县| 隆昌县| 全州县| 新蔡县| 潍坊市| 嵊泗县| 河曲县| 子洲县| 资中县| 淮北市| 成安县| 达州市| 白城市| 石城县| 山西省| 伊宁县| 响水县| 北碚区| 西宁市| 旌德县| 永安市|