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)中常見(jiàn)的排序算法
這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開(kāi)發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō)Java常見(jiàn)的排序算法,需要的朋友可以參考一下2022-01-01
java數(shù)學(xué)歸納法非遞歸求斐波那契數(shù)列的方法
這篇文章主要介紹了java數(shù)學(xué)歸納法非遞歸求斐波那契數(shù)列的方法,涉及java非遞歸算法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
JAVA中使用FTPClient實(shí)現(xiàn)文件上傳下載實(shí)例代碼
本文給大家介紹如何利用jakarta commons中的FTPClient(在commons-net包中)實(shí)現(xiàn)上傳下載文件。非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06
springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例
這篇文章主要介紹了springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
java實(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

