您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何理解Spring的IOC”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解Spring的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,這種方式是正轉。反轉是由容器來幫忙創建及注入依賴對象;
目前主要有五種注入方式: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的底層實現原理。
Spring IOC容器初始化的核心過程主要有四個步驟(還有一些如:后置加載器,國際化,事件廣播器等一些過程不展開):
鴻蒙官方戰略合作共建——HarmonyOS技術社區
Bean定義的定位,Bean 可能定義在XML中,或者一個注解,或者其他形式。這些都被用Resource來定位,讀取Resource獲取BeanDefinition 注冊到 Bean定義注冊表中。
第一次向容器getBean操作會觸發Bean的創建過程,實列化一個Bean時 ,根據BeanDefinition中類信息等實列化Bean。
將實列化的Bean放到單列Bean緩存內。
此后再次獲取向容器getBean就會從緩存中獲取。
這張圖是核心的過程。這個過程是已經簡化了,具體的實現方式要設計到bean的生命周期的管理。安排到下一章節了。spring的核心內容就是aop和ioc,知道了這倆是如何實現的之后,就是核心bean管理的核心實現,最后對配置文件進行介紹。
感謝各位的閱讀,以上就是“如何理解Spring的IOC”的內容了,經過本文的學習后,相信大家對如何理解Spring的IOC這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。