Spring的IOC解決程序耦合的實現(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>
<!-- 項目源碼及編譯輸出的編碼 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 項目編譯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自動將相關依賴Jar引入到項目中。
Spring常用功能的Jar包依賴關系:

核心容器由 beans、core、context 和 expression(Spring Expression Language,SpEL)4個模塊組成。
spring-beans和spring-core模塊是Spring框架的核心模塊,包含了控制反轉(Inversion of Control,IOC)和依賴注入(Dependency Injection,DI)。BeanFactory使用控制反轉對應用程序的配置和依賴性規(guī)范與實際的應用程序代碼進行了分離。BeanFactory屬于延時加載,也就是說在實例化容器對象后并不會自動實例化Bean,只有當Bean被使用時,BeanFactory才會對該 Bean 進行實例化與依賴關系的裝配。
spring-context模塊構架于核心模塊之上,擴展了BeanFactory,為它添加了Bean生命周期控制、框架事件體系及資源加載透明化等功能。此外,該模塊還提供了許多企業(yè)級支持,如郵件訪問、遠程訪問、任務調(diào)度等,ApplicationContext 是該模塊的核心接口,它的超類是 BeanFactory。與BeanFactory不同,ApplicationContext實例化后會自動對所有的單實例Bean進行實例化與依賴關系的裝配,使之處于待用狀態(tài)。
spring-expression 模塊是統(tǒng)一表達式語言(EL)的擴展模塊,可以查詢、管理運行中的對象,同時也可以方便地調(diào)用對象方法,以及操作數(shù)組、集合等。它的語法類似于傳統(tǒng)EL,但提供了額外的功能,最出色的要數(shù)函數(shù)調(diào)用和簡單字符串的模板函數(shù)。EL的特性是基于Spring產(chǎn)品的需求而設計的,可以非常方便地同Spring IoC進行交互。
1.2.dao
/**
* 持久層實現(xiàn)類
*/
public class UserDaoImpl implements UserDao {
@Override
public void addUser(){
System.out.println("insert into tb_user......");
}
}1.3.service
/**
* 業(yè)務層實現(xiàn)類
*/
public class UserServiceImpl implements UserService {
//此處有依賴關系
private UserDao userDao = new UserDaoImpl();
public void addUser(){
userDao.addUser();
}
}2.IOC
2.1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要導入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、把對象交給spring來創(chuàng)建
id:給對象在容器中提供一個唯一標識。用于獲取對象
class:指定類的全限定類名。用于反射創(chuàng)建對象。默認情況下調(diào)用無參構造函數(shù)
-->
<bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<bean id="userService" class="com.by.service.UserServiceImpl"></bean>
</beans>注意:命名無限制,約定俗成命名有:spring-context.xml、applicationContext.xml、beans.xml
2.2.測試
/**
* 模擬表現(xiàn)層
*/
public class Client {
public static void main(String[] args) {
//1.使用ApplicationContext接口,就是在獲取spring容器
ApplicationContext ac = new
ClassPathXmlApplicationContext("applicationContext.xml");
//2.根據(jù)bean的id獲取對象
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)建對象的同時,為其屬性賦值,稱之為依賴注入。
3.1.構造函數(shù)注入
顧名思義,就是使用類中的構造函數(shù),給成員變量賦值。注意,賦值的操作不是我們自己做的,而是通過配置的方式,讓spring框架來為我們注入。具體代碼如下:
/**
* 業(yè)務層實現(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、注意:要導入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、把對象交給spring來創(chuàng)建-->
<bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<bean id="userService" class="com.by.service.UserServiceImpl">
<!--
要求:類中需要提供一個對應參數(shù)列表的構造函數(shù)。
標簽:constructor-arg
==給誰賦值:==
index:指定參數(shù)在構造函數(shù)參數(shù)列表的索引位置
name:指定參數(shù)在構造函數(shù)中的名稱
==賦什么值:==
value:它能賦的值是基本數(shù)據(jù)類型和String類型
ref:它能賦的值是其他bean類型,也就是說,必須得是在配置文件中配置過的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è)務層實現(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、注意:要導入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、把對象交給spring來創(chuàng)建-->
<bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<bean id="userService" class="com.by.service.UserServiceImpl">
<!--
要求:property
標簽:constructor-arg
==給誰賦值:==
name:找的是類中set方法后面的部分
==賦什么值:==
value:它能賦的值是基本數(shù)據(jù)類型和String類型
ref:它能賦的值是其他bean類型,也就是說,必須得是在配置文件中配置過的bean
-->
<property name="userDao" ref="userDao"></property>
<property name="name" value="張三"></property>
<property name="age" value="18"></property>
</bean>
</beans>3.3.自動注入
不用在配置中 指定為哪個屬性賦值,由spring自動根據(jù)某個 "原則" ,在工廠中查找一個bean并為屬性注入值。具體代碼如下:
/**
* 業(yè)務層實現(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、注意:要導入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、把對象交給spring來創(chuàng)建-->
<bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<!--autowire="byType":按照類型自動注入值-->
<bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType">
</bean>
</beans><?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要導入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、把對象交給spring來創(chuàng)建-->
<bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<!--autowire="byType":按照類型自動注入值-->
<bean id="userService" class="com.by.service.UserServiceImpl" autowire="byName">
</bean>
</beans>3.4.注入集合類型的屬性
顧名思義,就是給類中的集合成員傳值,它用的也是set方法注入的方式,只不過變量的數(shù)據(jù)類型都是集合。我們這里介紹注入數(shù)組,List,Set,Map。具體代碼如下:
/**
* 業(yè)務層實現(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、注意:要導入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、把對象交給spring來創(chuàng)建-->
<bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<bean id="userService" class="com.by.service.UserServiceImpl">
<!--
要求:property
標簽:constructor-arg
==給誰賦值:==
name:找的是類中set方法后面的部分
==賦什么值:==
value:它能賦的值是基本數(shù)據(jù)類型和String類型
ref:它能賦的值是其他bean類型,也就是說,必須得是在配置文件中配置過的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>到此這篇關于Spring的IOC解決程序耦合的實現(xiàn)的文章就介紹到這了,更多相關Spring IOC程序耦合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java數(shù)學歸納法非遞歸求斐波那契數(shù)列的方法
這篇文章主要介紹了java數(shù)學歸納法非遞歸求斐波那契數(shù)列的方法,涉及java非遞歸算法的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
JAVA中使用FTPClient實現(xiàn)文件上傳下載實例代碼
本文給大家介紹如何利用jakarta commons中的FTPClient(在commons-net包中)實現(xiàn)上傳下載文件。非常不錯具有參考借鑒價值,感興趣的朋友一起學習吧2016-06-06
springboot執(zhí)行延時任務之DelayQueue實例
這篇文章主要介紹了springboot執(zhí)行延時任務之DelayQueue實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
淺談java中類名.class, class.forName(), getClass()的區(qū)別
下面小編就為大家?guī)硪黄獪\談java中類名.class, class.forName(), getClass()的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

