欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring的IOC解決程序耦合的實(shí)現(xiàn)

 更新時(shí)間:2024年07月01日 09:18:52   作者:三月37  
本文主要介紹了Spring的IOC解決程序耦合的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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ù)據(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-01
  • java數(shù)學(xué)歸納法非遞歸求斐波那契數(shù)列的方法

    java數(shù)學(xué)歸納法非遞歸求斐波那契數(shù)列的方法

    這篇文章主要介紹了java數(shù)學(xué)歸納法非遞歸求斐波那契數(shù)列的方法,涉及java非遞歸算法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • java反射之方法反射的基本操作方法

    java反射之方法反射的基本操作方法

    下面小編就為大家?guī)?lái)一篇java反射之方法反射的基本操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • JAVA中使用FTPClient實(shí)現(xiàn)文件上傳下載實(shí)例代碼

    JAVA中使用FTPClient實(shí)現(xiàn)文件上傳下載實(shí)例代碼

    本文給大家介紹如何利用jakarta commons中的FTPClient(在commons-net包中)實(shí)現(xiàn)上傳下載文件。非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • JAVA Map架構(gòu)和API介紹

    JAVA Map架構(gòu)和API介紹

    JAVA Map架構(gòu)和API介紹:Map、Map.Entry、AbstractMap、SortedMap、 NavigableMap、Dictionary。
    2013-11-11
  • springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例

    springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例

    這篇文章主要介紹了springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java中逆序遍歷List集合的實(shí)現(xiàn)

    Java中逆序遍歷List集合的實(shí)現(xiàn)

    本文主要介紹了Java中逆序遍歷List集合的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web服務(wù)器實(shí)例解析

    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
  • zookeeper節(jié)點(diǎn)類型詳解

    zookeeper節(jié)點(diǎn)類型詳解

    今天小編就為大家分享一篇關(guān)于zookeeper節(jié)點(diǎn)類型詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • 淺談java中類名.class, class.forName(), getClass()的區(qū)別

    淺談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

最新評(píng)論