成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring系列之IOC的理解和分析

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

 [[397949]]

根據(jù)時間安排,今天主要是對spring中IOC的理解。對于IOC的理解可以從以下幾個角度去分析。

什么是IOC?如何使用案例來理解?

  • IOC有哪幾種實現(xiàn)方式?
  • IOC的底層實現(xiàn)過程是什么?
  • 根據(jù)這幾個角度,開始今天的故事,

1 什么是IOC?

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

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

1.1 什么是依賴注入

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

  1. class User{  
  2.   Car car;  
  3.   public User(){  
  4.     car=new Car();  
  5.   }  

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

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

  1. class User{  
  2.   Car car;  
  3.   public User(Car car){  
  4.     this.car=car;  
  5.   }  

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

1.2 什么是控制反轉(zhuǎn)

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

  • 誰控制誰:傳統(tǒng)方式User是在內(nèi)部new,現(xiàn)在我們通過依賴注入的方式注入依賴對象Car。現(xiàn)在spring出現(xiàn)了,發(fā)明了IOC,IOC里面有一個容器,這些依賴對象全部交給容器去管理。也就是說這些依賴對象的控制權(quán)交給了容器。
  • 如何反轉(zhuǎn):傳統(tǒng)方式User是主動去new,這種方式是正轉(zhuǎn)。反轉(zhuǎn)是由容器來幫忙創(chuàng)建及注入依賴對象;

2 依賴注入的幾種形式

目前主要有五種注入方式:SET注入,構(gòu)造器注入,靜態(tài)工廠,實例工廠。

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

  1. public class UserDao { 
  2.  public String userLogin() { 
  3.   return "userLogin()方法"
  4.  } 

下面看幾種依賴注入的幾種實現(xiàn)方式。

2.1 set注入

第一步:XML配置

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

 

 

第二步:set方式注入

  1. public class UserService { 
  2.     //一定要提供屬性的setter方法 
  3.  private UserDao userDao; 
  4.  public void userlogin() { 
  5.   String res=userDao.userLogin(); 
  6.   System.out.println(res); 
  7.  } 
  8.  public void setUserDao(UserDao userDao) { 
  9.   this.userDao = userDao; 
  10.  } 

這種方式簡單易操作。

2.2 構(gòu)造器注入

第一步:XML配置

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans 
  5. http://www.springframework.org/schema/beans/spring-beans.xsd"> 
  6.  <bean id="userDao" class="com.xxx.demo.UserDao"></bean> 
  7.  <!-- 構(gòu)造器注入 --> 
  8.  <bean id="userServiceV2" class="com.xxx.demo.UserServiceV2"
  9.   <constructor-arg index="0" ref="userDao"></constructor-arg> 
  10.   <constructor-arg index="1" value="印度三哥"></constructor-arg> 
  11.  </bean> 
  12. </beans> 

 

 

第二步:構(gòu)造器注入

  1. public class UserServiceV2 { 
  2.  private UserDao userDao; 
  3.  private String name
  4.  public void userlogin() { 
  5.   String res=userDao.userLogin(); 
  6.   System.out.println(res); 
  7.   System.out.println(name); 
  8.  } 
  9.  public UserServiceV2(UserDao userDao,String name) { 
  10.   super(); 
  11.   this.userDao = userDao; 
  12.   this.name = name
  13.  } 

2.3 靜態(tài)工廠注入

第一步:XML配置

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans 
  5. http://www.springframework.org/schema/beans/spring-beans.xsd"> 
  6.  <!-- 靜態(tài)工廠注入 --> 
  7.  <bean id="userDao01" class="com.xxx.demo.StaticFactory" factory-method="createuserDao"></bean> 
  8.  <bean id="userService01" class="com.xxx.demo.UserService"
  9.   <property name="userDao" ref="userDao01"></property> 
  10.  </bean> 
  11. </beans> 

 

 

第二步:定義靜態(tài)工廠

  1. public class StaticFactory { 
  2.  public static UserDao createuserDao(){ 
  3.   return new UserDao(); 
  4.  } 

第三部:靜態(tài)工廠注入

  1. public class UserService { 
  2.  private UserDao userDao; 
  3.  public void userlogin() { 
  4.   String res=userDao.userLogin(); 
  5.   System.out.println(res); 
  6.  } 
  7.  public void setUserDao(UserDao userDao) { 
  8.   this.userDao = userDao; 
  9.  } 

2.4 實例化工廠

第一步:XML配置

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

 

 

第二步:工廠注入

  1. public class InstanceFactory { 
  2.  public UserDao createUserDao(){ 
  3.   return new UserDao(); 
  4.  } 

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

3 IOC底層實現(xiàn)過程

以上的幾種注入方式,可能有個疑問,那就是bean是如何從xml,再到注入類中的呢?看下面這張圖

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

  1. Bean定義的定位,Bean 可能定義在XML中,或者一個注解,或者其他形式。這些都被用Resource來定位,讀取Resource獲取BeanDefinition 注冊到 Bean定義注冊表中。
  2. 第一次向容器getBean操作會觸發(fā)Bean的創(chuàng)建過程,實列化一個Bean時 ,根據(jù)BeanDefinition中類信息等實列化Bean。
  3. 將實列化的Bean放到單列Bean緩存內(nèi)。
  4. 此后再次獲取向容器getBean就會從緩存中獲取。

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

本文轉(zhuǎn)載自微信公眾號「愚公要移山」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系愚公要移山公眾號。

 

責任編輯:武曉燕 來源: 愚公要移山
相關(guān)推薦

2021-05-06 18:17:52

SpringAOP理解

2022-12-07 08:02:43

Spring流程IOC

2024-02-23 10:33:34

SpringBean容器

2021-03-13 13:57:23

springIOC源碼

2025-03-14 10:37:24

SpringSpring IOC容器

2025-05-21 10:09:09

Spring 5.xIOC編程

2021-03-16 08:22:49

SpringIoCAOP

2014-10-22 09:33:10

2009-06-22 10:20:01

Spring IoC容

2024-03-04 11:10:01

2022-02-20 07:28:13

Spring注解用法

2022-02-19 07:41:36

Bean注解項目

2009-06-18 14:45:55

Spring Fram

2022-03-25 00:00:00

Splunk搜索SPL

2021-06-29 07:04:39

SQL數(shù)據(jù)視圖

2012-07-02 15:26:19

Spring架構(gòu)框架

2023-11-15 08:28:13

PythonVTK

2021-07-16 06:19:55

SpringIOC騰訊

2020-08-06 00:14:16

Spring IoC依賴注入開發(fā)

2021-05-06 07:58:57

Spring BeanIOCAOP
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日本免费在线看 | 精品一二区| 精品亚洲一区二区三区 | 成人小视频在线观看 | 日韩欧美在线观看 | 狠狠狠 | 夜夜精品视频 | 精品国产乱码久久久久久图片 | 亚洲小视频在线观看 | 欧美精品一区二区三区在线播放 | 国产高清精品在线 | 午夜免费av | 国产目拍亚洲精品99久久精品 | 97超碰站 | 久久综合激情 | 黄色国产视频 | 日本人和亚洲人zjzjhd | 色婷婷精品 | 精品欧美一区二区久久久伦 | 91社区在线观看播放 | 精一区二区 | 欧美成人aaa级毛片在线视频 | 视频精品一区二区三区 | 一级做a爰片久久毛片免费看 | 国产久视频 | 99久久婷婷 | 国产丝袜一区二区三区免费视频 | 国产黄色在线 | 国产一区二区免费电影 | 日本黄色免费片 | 91综合在线观看 | 国产精品久久久久久久久久软件 | 亚洲视频国产视频 | 精品久久久久久国产 | 国产精品久久久久久久久免费 | 综合另类 | 国产成人免费视频网站高清观看视频 | 日韩a在线| 日本 欧美 国产 | 热99视频 | 亚洲免费在线播放 |