最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring框架基于xml實(shí)現(xiàn)自動(dòng)裝配流程詳解

 更新時(shí)間:2022年11月09日 11:53:00   作者:學(xué)習(xí)使我快樂(lè)T  
自動(dòng)裝配就是指?Spring?容器在不使用?<constructor-arg>?和<property>?標(biāo)簽的情況下,可以自動(dòng)裝配(autowire)相互協(xié)作的?Bean?之間的關(guān)聯(lián)關(guān)系,將一個(gè)?Bean?注入其他?Bean?的?Property?中

一、基于xml的自動(dòng)裝配之場(chǎng)景模擬:

自動(dòng)裝配:

根據(jù)指定的策略,在IOC容器中匹配某一個(gè)bean,自動(dòng)為指定的bean中所依賴的類類型或接口類 型屬性賦值

場(chǎng)景模擬

①創(chuàng)建類UserController

public class UserController {
    private UserService userService;
    public UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void saveUser() {
        userService.saveUser();
    }
}

創(chuàng)建接口UserService

public interface UserService {
    /**
        保存用戶信息
     */
    void saveUser();
}

創(chuàng)建類UserServiceImpl實(shí)現(xiàn)接口UserService

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void saveUser() {
        System.out.println("保存成功");
    }
}

創(chuàng)建接口UserDao

public interface UserDao {
    /**
     * 保存用戶信息
     */
    void saveUser();
}

創(chuàng)建類UserDaoImpl實(shí)現(xiàn)接口UserDao

public class UserDaoImpl implements UserDao {
    @Override
    public void saveUser() {
        System.out.println("保存成功");
    }
}

②配置bean

    <bean id="userController" class="com.tian.spring.controller.UserController">
        <property name="userService" ref="userService"></property>
    </bean>
    <bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>

③測(cè)試類:

public class AutowireByXMLTest {
    @Test
    public void testAutowire() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        userController.saveUser();
    }
}

結(jié)果:

保存成功

二、基于xml的自動(dòng)裝配之byType

可以通過(guò)bean標(biāo)簽中的autowire屬性設(shè)置自動(dòng)裝配的策略

自動(dòng)裝配的策略:

1.no,default:表示不裝配,即bean中的屬性不會(huì)自動(dòng)匹配某個(gè)bean為屬性賦值,此時(shí)屬性使用默認(rèn)值

2.byType:根據(jù)要賦值的屬性的類型,在IOC容器中匹配某個(gè)bean,為屬性賦值

注意:

(一些用byType進(jìn)行自動(dòng)裝配的問(wèn)題,當(dāng)然不容易見(jiàn)到,這里我也不去演示,知道就可以):

a>若通過(guò)類型沒(méi)有找到任何一個(gè)類型匹配的bean,此時(shí)不裝配,屬性使用默認(rèn)值

b>若通過(guò)類型找到了多個(gè)類型匹配的bean,此時(shí)會(huì)拋出異常:NoUniqueBeanDefinitionException

總結(jié):

當(dāng)使用byType實(shí)現(xiàn)自動(dòng)裝配時(shí),IOC容器中有且只有一個(gè)類型匹配的bean能夠?yàn)閷傩再x值

3.byName:將要賦值的屬性的屬性名作為bean的id在IOC容器中匹配某個(gè)bean,為屬性賦值

總結(jié):

當(dāng)類型匹配的bean有多個(gè)時(shí),此時(shí)可以使用byName實(shí)現(xiàn)自動(dòng)裝配

配置bean

    <bean id="userController" class="com.tian.spring.controller.UserController" autowire="byType">
<!--        <property name="userService" ref="userService"></property>-->
    </bean>
    <bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byType">
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
    <bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>

經(jīng)過(guò)測(cè)試發(fā)現(xiàn)也是可以進(jìn)行輸出的

保存成功

三、基于xml的自動(dòng)裝配之byName

    <bean id="userController" class="com.tian.spring.controller.UserController" autowire="byName">
<!--        <property name="userService" ref="userService"></property>-->
    </bean>
    <bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byName">
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
    <bean id="service" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byName">
        <!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
    <bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>
    <bean id="dao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>

經(jīng)過(guò)測(cè)試發(fā)現(xiàn)也是可以進(jìn)行輸出的

保存成功

四、基于注解管理bean之功能分析

@Component:將類標(biāo)識(shí)為普通組件

@Controller:將類標(biāo)識(shí)為控制層組件

@Service:將類標(biāo) 識(shí)為業(yè)務(wù)層組件

@Repository:將類標(biāo)識(shí)為持久層組件

通過(guò)注解+掃描所配置的bean的id,默認(rèn)值為類的小駝峰,即類的首字母為小寫的結(jié)果

可以通過(guò)標(biāo)識(shí)組件的注解的value屬性值設(shè)置bean的自定義的id

①創(chuàng)建maven工程,并引入相關(guān)依賴

    <dependencies>
        <!-- 基于Maven依賴傳遞性,導(dǎo)入spring-context依賴即可導(dǎo)入當(dāng)前所需所有jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
        <!-- junit測(cè)試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

②創(chuàng)建組件

創(chuàng)建控制層

@Controller("controller")
public class UserController {
}

創(chuàng)建業(yè)務(wù)層

UserService接口

@Repository
public interface UserDao {
}

UserServiceImpl實(shí)現(xiàn)類 

public class UserDaoImpl implements UserDao {
}

創(chuàng)建持久層

UserDao接口

public interface UserDao {
}

UserDaoImpl實(shí)現(xiàn)類 

@Repository
public class UserDaoImpl implements UserDao {
}

③創(chuàng)建配置文件spring-ioc-annotation.xml

<context:component-scan base-package="com.tian.spring"></context:component-scan>

測(cè)試類:

public class IOCByAnnotationTest {
    @Test
    public void test() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
        UserController userController = ioc.getBean("controller" ,UserController.class);
        System.out.println(userController);
        UserService userService = ioc.getBean("userServiceImpl",UserService.class);
        System.out.println(userService);
        UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);
        System.out.println(userDao);
    }
}

五、基于注解管理bean之掃描組件

context:exclude-filter:排除掃描

type:設(shè)置排除掃描的方式 type="annotation/assignable" annotation:根據(jù)注解的類型進(jìn)行排除,expression需要設(shè)置排除的注解的全類名 assignable:根據(jù)類的類型進(jìn)行排除,expression需要設(shè)置排除的類的全類名

context:include-filter:包含掃描

注意:需要在context:component-scan標(biāo)簽中設(shè)置use-default-filters="false" use-default-filters="true"(默認(rèn)),所設(shè)置的包下所有的類都需要掃描,此時(shí)可以使用排除掃描 use-default-filters="false",所設(shè)置的包下所有的類都不需要掃描,此時(shí)可以使用包含掃描

情況一,最基本的掃描方式:

<context:component-scan base-package="com.tian.spring"></context:component-scan>

情況二:指定要排除的組件

<context:component-scan base-package="com.tian.spring" use-default-filters="false">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

情況三:僅掃描指定組件

    <context:component-scan base-package="com.tian.spring" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

六、基于注解的自動(dòng)裝配之@Autowired注解能夠標(biāo)識(shí)的位置及其原理和注意事項(xiàng)

@Autowired:實(shí)現(xiàn)自動(dòng)裝配功能的注解

1)@Autowired注解能夠標(biāo)識(shí)的位置

a>標(biāo)識(shí)在成員變量上,此時(shí)不需要設(shè)置成員變量的set方法

b>標(biāo)識(shí)在set方法上

c>為當(dāng)前成員變量賦值的有參構(gòu)造上

2)@Autowired注解的原理

a>默認(rèn)通過(guò)byType的方式,在IOC容器中通過(guò)類型匹配某個(gè)bean為屬性賦值

b>若有多個(gè)類型匹配的bean,此時(shí)會(huì)自動(dòng)轉(zhuǎn)換為byName的方式實(shí)現(xiàn)自動(dòng)裝配的效果

即將要賦值的屬性的屬性名作為bean的id匹配某個(gè)bean為屬性賦值

c>若byType和byName的方式都無(wú)法實(shí)現(xiàn)自動(dòng)裝配,即IOC容器中有多個(gè)類型匹配的bean

且這些bean的id和要賦值的屬性的屬性名都不一致,此時(shí)拋異常:NoUniqueBeanDefinitionException

d>此時(shí)可以在要賦值的屬性上,添加注解@Qualifier

通過(guò)該注解的value屬性值,指定某個(gè)bean的id,將這個(gè)bean為屬性賦值

3)注意:

若IOC容器中沒(méi)有任何一個(gè)類型匹配的bean,此時(shí)拋出異常NoSuchBeanDefinitionException

在@Autowired注解中有個(gè)屬性required,默認(rèn)值為true,要求必須完成自動(dòng)裝配

可以將required設(shè)置為false,此時(shí)能裝配則裝配,無(wú)法裝配則使用屬性的默認(rèn)值

(由于一個(gè)類型的bean不可能在IOC容器中配置多次,所以這種情況一般不會(huì)出現(xiàn))

1)@Autowired:實(shí)現(xiàn)自動(dòng)裝配功能的注解

方式一:

    @Autowired
    private UserService userService;

方式二:

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

方式三:

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

到此這篇關(guān)于Spring框架基于xml實(shí)現(xiàn)自動(dòng)裝配流程詳解的文章就介紹到這了,更多相關(guān)Spring自動(dòng)裝配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于SpringCloud手寫一個(gè)簡(jiǎn)易版Sentinel

    基于SpringCloud手寫一個(gè)簡(jiǎn)易版Sentinel

    SpringCloud Alibaba Sentinel是當(dāng)前最為流行一種熔斷降級(jí)框架,簡(jiǎn)單易用的方式可以快速幫助我們實(shí)現(xiàn)服務(wù)的限流和降級(jí),保證服務(wù)的穩(wěn)定性。
    2021-05-05
  • java集合類HashMap源碼解析

    java集合類HashMap源碼解析

    這篇文章主要介紹了Java集合之HashMap用法,結(jié)合實(shí)例形式分析了java map集合中HashMap定義、遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2021-06-06
  • hibernate4快速入門實(shí)例詳解

    hibernate4快速入門實(shí)例詳解

    Hibernate是一個(gè)輕量級(jí)的ORMapping框架,本文重點(diǎn)給大家介紹hibernate4 入門實(shí)例詳細(xì),需要的朋友參考下吧
    2017-09-09
  • SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog

    SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog

    binlog用來(lái)實(shí)現(xiàn)主從復(fù)制,也常用來(lái)誤刪數(shù)據(jù)庫(kù)找回丟失的記錄,本文主要介紹了SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot?對(duì)接飛書多維表格事件回調(diào)監(jiān)聽(tīng)流程分析

    SpringBoot?對(duì)接飛書多維表格事件回調(diào)監(jiān)聽(tīng)流程分析

    本文介紹了如何通過(guò)飛書事件訂閱機(jī)制和SpringBoot項(xiàng)目集成,對(duì)多維表數(shù)據(jù)的記錄變更進(jìn)行對(duì)接的詳細(xì)流程,包括如何創(chuàng)建應(yīng)用、配置參數(shù)、編寫訂閱代碼、訂閱文檔事件以及在SpringBoot工程中集成的步驟,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Struts中使用validate()輸入校驗(yàn)方法詳解

    Struts中使用validate()輸入校驗(yàn)方法詳解

    這篇文章主要介紹了Struts中使用validate()輸入校驗(yàn)方法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • Spring Data Jpa多表查詢返回自定義實(shí)體方式

    Spring Data Jpa多表查詢返回自定義實(shí)體方式

    這篇文章主要介紹了Spring Data Jpa多表查詢返回自定義實(shí)體方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java利用冒泡排序?qū)?shù)組進(jìn)行排序

    java利用冒泡排序?qū)?shù)組進(jìn)行排序

    這篇文章主要介紹了java利用冒泡排序?qū)?shù)組進(jìn)行排序的方法,實(shí)例分析了冒泡排序的概念與java實(shí)現(xiàn)方法,以及java操作數(shù)組的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • java實(shí)現(xiàn)后臺(tái)數(shù)據(jù)顯示在前端

    java實(shí)現(xiàn)后臺(tái)數(shù)據(jù)顯示在前端

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)后臺(tái)數(shù)據(jù)顯示在前端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式

    SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式

    Spring Boot是一個(gè)用于構(gòu)建獨(dú)立的、可執(zhí)行的Spring應(yīng)用程序的框架,結(jié)合使用Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中本文,主要介紹了SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式,感興趣的可以了解一下
    2024-01-01

最新評(píng)論

茌平县| 凤庆县| 新余市| 台东县| 永平县| 信阳市| 阿坝县| 明水县| 龙泉市| 忻州市| 唐海县| 綦江县| 壶关县| 罗定市| 绥棱县| 宜兰市| 宾阳县| 华亭县| 阳新县| 神农架林区| 海林市| 德令哈市| 华池县| 威宁| 阳新县| 丰顺县| 鄂托克前旗| 临安市| 龙川县| 新密市| 潼南县| 安福县| 静乐县| 旬邑县| 贺兰县| 嘉祥县| 临桂县| 北宁市| 曲水县| 修水县| 措勤县|