Spring的IOC解決程序耦合的實(shí)現(xiàn)
1.創(chuàng)建工程
1.1.pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.by</groupId> <artifactId>Spring_IOC_Xml</artifactId> <version>1.0-SNAPSHOT</version> <properties> <!-- 項(xiàng)目源碼及編譯輸出的編碼 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- 項(xiàng)目編譯JDK版本 --> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- Spring常用依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.8.RELEASE</version> </dependency> </dependencies> </project>
注意:Jar包彼此存在依賴,只需引入最外層Jar即可由Maven自動(dòng)將相關(guān)依賴Jar引入到項(xiàng)目中。
Spring常用功能的Jar包依賴關(guān)系:
核心容器由 beans、core、context 和 expression(Spring Expression Language,SpEL)4個(gè)模塊組成。
spring-beans和spring-core模塊是Spring框架的核心模塊,包含了控制反轉(zhuǎn)(Inversion of Control,IOC)和依賴注入(Dependency Injection,DI)。BeanFactory使用控制反轉(zhuǎn)對(duì)應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼進(jìn)行了分離。BeanFactory屬于延時(shí)加載,也就是說(shuō)在實(shí)例化容器對(duì)象后并不會(huì)自動(dòng)實(shí)例化Bean,只有當(dāng)Bean被使用時(shí),BeanFactory才會(huì)對(duì)該 Bean 進(jìn)行實(shí)例化與依賴關(guān)系的裝配。
spring-context模塊構(gòu)架于核心模塊之上,擴(kuò)展了BeanFactory,為它添加了Bean生命周期控制、框架事件體系及資源加載透明化等功能。此外,該模塊還提供了許多企業(yè)級(jí)支持,如郵件訪問(wèn)、遠(yuǎn)程訪問(wèn)、任務(wù)調(diào)度等,ApplicationContext 是該模塊的核心接口,它的超類是 BeanFactory。與BeanFactory不同,ApplicationContext實(shí)例化后會(huì)自動(dòng)對(duì)所有的單實(shí)例Bean進(jìn)行實(shí)例化與依賴關(guān)系的裝配,使之處于待用狀態(tài)。
spring-expression 模塊是統(tǒng)一表達(dá)式語(yǔ)言(EL)的擴(kuò)展模塊,可以查詢、管理運(yùn)行中的對(duì)象,同時(shí)也可以方便地調(diào)用對(duì)象方法,以及操作數(shù)組、集合等。它的語(yǔ)法類似于傳統(tǒng)EL,但提供了額外的功能,最出色的要數(shù)函數(shù)調(diào)用和簡(jiǎn)單字符串的模板函數(shù)。EL的特性是基于Spring產(chǎn)品的需求而設(shè)計(jì)的,可以非常方便地同Spring IoC進(jìn)行交互。
1.2.dao
/** * 持久層實(shí)現(xiàn)類 */ public class UserDaoImpl implements UserDao { @Override public void addUser(){ System.out.println("insert into tb_user......"); } }
1.3.service
/** * 業(yè)務(wù)層實(shí)現(xiàn)類 */ public class UserServiceImpl implements UserService { //此處有依賴關(guān)系 private UserDao userDao = new UserDaoImpl(); public void addUser(){ userDao.addUser(); } }
2.IOC
2.1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!--1、注意:要導(dǎo)入schema約束--> <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"> <!-- 2、把對(duì)象交給spring來(lái)創(chuàng)建 id:給對(duì)象在容器中提供一個(gè)唯一標(biāo)識(shí)。用于獲取對(duì)象 class:指定類的全限定類名。用于反射創(chuàng)建對(duì)象。默認(rèn)情況下調(diào)用無(wú)參構(gòu)造函數(shù) --> <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean> <bean id="userService" class="com.by.service.UserServiceImpl"></bean> </beans>
注意:命名無(wú)限制,約定俗成命名有:spring-context.xml、applicationContext.xml、beans.xml
2.2.測(cè)試
/** * 模擬表現(xiàn)層 */ public class Client { public static void main(String[] args) { //1.使用ApplicationContext接口,就是在獲取spring容器 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.根據(jù)bean的id獲取對(duì)象 UserDao userDao = (UserDao) ac.getBean("userDao"); System.out.println(userDao); UserService userService = (UserService) ac.getBean("userService"); System.out.println(userService); userService.addUser(); } }
3.DI
概述:DI(Dependency Injection)依賴注入,在Spring創(chuàng)建對(duì)象的同時(shí),為其屬性賦值,稱之為依賴注入。
3.1.構(gòu)造函數(shù)注入
顧名思義,就是使用類中的構(gòu)造函數(shù),給成員變量賦值。注意,賦值的操作不是我們自己做的,而是通過(guò)配置的方式,讓spring框架來(lái)為我們注入。具體代碼如下:
/** * 業(yè)務(wù)層實(shí)現(xiàn)類 */ public class UserServiceImpl implements UserService { private UserDao userDao; private String name; private Integer age; public UserServiceImpl(UserDao userDao, String name, Integer age) { this.userDao = userDao; this.name = name; this.age = age; } public void addUser(){ System.out.println(name+","+age); userDao.addUser(); } }
<?xml version="1.0" encoding="UTF-8"?> <!--1、注意:要導(dǎo)入schema約束--> <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"> <!--2、把對(duì)象交給spring來(lái)創(chuàng)建--> <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean> <bean id="userService" class="com.by.service.UserServiceImpl"> <!-- 要求:類中需要提供一個(gè)對(duì)應(yīng)參數(shù)列表的構(gòu)造函數(shù)。 標(biāo)簽:constructor-arg ==給誰(shuí)賦值:== index:指定參數(shù)在構(gòu)造函數(shù)參數(shù)列表的索引位置 name:指定參數(shù)在構(gòu)造函數(shù)中的名稱 ==賦什么值:== value:它能賦的值是基本數(shù)據(jù)類型和String類型 ref:它能賦的值是其他bean類型,也就是說(shuō),必須得是在配置文件中配置過(guò)的bean --> <constructor-arg name="userDao" ref="userDao"></constructor-arg> <constructor-arg name="name" value="張三"></constructor-arg> <constructor-arg name="age" value="18"></constructor-arg> </bean> </beans>
3.2.set方法注入
顧名思義,就是在類中提供需要注入成員的set方法。具體代碼如下:
/** * 業(yè)務(wù)層實(shí)現(xiàn)類 */ public class UserServiceImpl implements UserService { private UserDao userDao; private String name; private Integer age; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void addUser(){ System.out.println(name+","+age); userDao.addUser(); } }
<?xml version="1.0" encoding="UTF-8"?> <!--1、注意:要導(dǎo)入schema約束--> <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"> <!--2、把對(duì)象交給spring來(lái)創(chuàng)建--> <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean> <bean id="userService" class="com.by.service.UserServiceImpl"> <!-- 要求:property 標(biāo)簽:constructor-arg ==給誰(shuí)賦值:== name:找的是類中set方法后面的部分 ==賦什么值:== value:它能賦的值是基本數(shù)據(jù)類型和String類型 ref:它能賦的值是其他bean類型,也就是說(shuō),必須得是在配置文件中配置過(guò)的bean --> <property name="userDao" ref="userDao"></property> <property name="name" value="張三"></property> <property name="age" value="18"></property> </bean> </beans>
3.3.自動(dòng)注入
不用在配置中 指定為哪個(gè)屬性賦值,由spring自動(dòng)根據(jù)某個(gè) "原則" ,在工廠中查找一個(gè)bean并為屬性注入值。具體代碼如下:
/** * 業(yè)務(wù)層實(shí)現(xiàn)類 */ public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void addUser(){ userDao.addUser(); } }
<?xml version="1.0" encoding="UTF-8"?> <!--1、注意:要導(dǎo)入schema約束--> <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"> <!--2、把對(duì)象交給spring來(lái)創(chuàng)建--> <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean> <!--autowire="byType":按照類型自動(dòng)注入值--> <bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType"> </bean> </beans>
<?xml version="1.0" encoding="UTF-8"?> <!--1、注意:要導(dǎo)入schema約束--> <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"> <!--2、把對(duì)象交給spring來(lái)創(chuàng)建--> <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean> <!--autowire="byType":按照類型自動(dòng)注入值--> <bean id="userService" class="com.by.service.UserServiceImpl" autowire="byName"> </bean> </beans>
3.4.注入集合類型的屬性
顧名思義,就是給類中的集合成員傳值,它用的也是set方法注入的方式,只不過(guò)變量的數(shù)據(jù)類型都是集合。我們這里介紹注入數(shù)組,List,Set,Map。具體代碼如下:
/** * 業(yè)務(wù)層實(shí)現(xiàn)類 */ public class UserServiceImpl implements UserService { private UserDao userDao; private String[] myStrs; private List<String> myList; private Set<String> mySet; private Map<String,String> myMap; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public void setMyList(List<String> myList) { this.myList = myList; } public void setMySet(Set<String> mySet) { this.mySet = mySet; } public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } public void addUser(){ System.out.println(Arrays.toString(myStrs)); System.out.println(myList); System.out.println(mySet); System.out.println(myMap); userDao.addUser(); } }
<?xml version="1.0" encoding="UTF-8"?> <!--1、注意:要導(dǎo)入schema約束--> <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"> <!--2、把對(duì)象交給spring來(lái)創(chuàng)建--> <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean> <bean id="userService" class="com.by.service.UserServiceImpl"> <!-- 要求:property 標(biāo)簽:constructor-arg ==給誰(shuí)賦值:== name:找的是類中set方法后面的部分 ==賦什么值:== value:它能賦的值是基本數(shù)據(jù)類型和String類型 ref:它能賦的值是其他bean類型,也就是說(shuō),必須得是在配置文件中配置過(guò)的bean --> <property name="userDao" ref="userDao"></property> <!-- 給mySet集合注入數(shù)據(jù) --> <property name="mySet"> <set> <value>AAA</value> <value>BBB</value> <value>CCC</value> </set> </property> <!-- 注入array數(shù)組數(shù)據(jù) --> <property name="myArray"> <array> <value>AAA</value> <value>BBB</value> <value>CCC</value> </array> </property> <!-- 注入list集合數(shù)據(jù) --> <property name="myList"> <list> <value>AAA</value> <value>BBB</value> <value>CCC</value> </list> </property> <!-- 注入Map數(shù)據(jù) --> <property name="myMap"> <map> <entry key="testA" value="aaa"></entry> <entry key="testB" value="bbb"></entry> </map> </property> </bean> </beans>
到此這篇關(guān)于Spring的IOC解決程序耦合的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring IOC程序耦合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java深入了解數(shù)據(jù)結(jié)構(gòu)中常見的排序算法
這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō)Java常見的排序算法,需要的朋友可以參考一下2022-01-01java數(shù)學(xué)歸納法非遞歸求斐波那契數(shù)列的方法
這篇文章主要介紹了java數(shù)學(xué)歸納法非遞歸求斐波那契數(shù)列的方法,涉及java非遞歸算法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07JAVA中使用FTPClient實(shí)現(xiàn)文件上傳下載實(shí)例代碼
本文給大家介紹如何利用jakarta commons中的FTPClient(在commons-net包中)實(shí)現(xiàn)上傳下載文件。非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例
這篇文章主要介紹了springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web服務(wù)器實(shí)例解析
這篇文章主要介紹了java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web服務(wù)器實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02淺談java中類名.class, class.forName(), getClass()的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java中類名.class, class.forName(), getClass()的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05