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

Spring基于注解管理bean實(shí)現(xiàn)方式講解

 更新時(shí)間:2023年01月03日 14:21:27   作者:熱愛(ài)編程的小白白  
很多時(shí)候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來(lái)選擇是否在容器中加載某個(gè)Bean,這就是Bean的加載控制,一般我們可以通過(guò)編程式或注解式兩種不同的方式來(lái)完成Bean的管理

一、標(biāo)記與掃描

①注解

和 XML 配置文件一樣,注解本身并不能執(zhí)行,注解本身僅僅只是做一個(gè)標(biāo)記,具體的功能是框架檢測(cè)到注解標(biāo)記的位置,然后針對(duì)這個(gè)位置按照注解標(biāo)記的功能來(lái)執(zhí)行具體操作。 本質(zhì)上:所有一切的操作都是 Java 代碼來(lái)完成的, XML 和注解只是告訴框架中的 Java 代碼如何執(zhí)行。 舉例:元旦聯(lián)歡會(huì)要布置教室,藍(lán)色的地方貼上元旦快樂(lè)四個(gè)字,紅色的地方貼上拉花,黃色的地方貼上氣球。

班長(zhǎng)做了所有標(biāo)記,同學(xué)們來(lái)完成具體工作。墻上的標(biāo)記相當(dāng)于我們?cè)诖a中使用的注解,后面同學(xué)們做的工作,相當(dāng)于框架的具體操作。

②掃描

Spring 為了知道程序員在哪些地方標(biāo)記了什么注解,就需要通過(guò)掃描的方式,來(lái)進(jìn)行檢測(cè)。然后根據(jù)注解進(jìn)行后續(xù)操作。

③標(biāo)識(shí)組件的常用注解

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

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

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

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

問(wèn):以上四個(gè)注解有什么關(guān)系和區(qū)別?

通過(guò)查看源碼我們得知, @Controller 、 @Service 、 @Repository 這三個(gè)注解只是在 @Component 注解的基礎(chǔ)上起了三個(gè)新的名字。

對(duì)于 Spring 使用 IOC 容器管理這些組件來(lái)說(shuō)沒(méi)有區(qū)別。所以 @Controller 、 @Service @Repository 這三個(gè)注解只是給開發(fā)人員看的,讓我們能夠便于分辨組件的作用。 注意:雖然它們本質(zhì)上一樣,但是為了代碼的可讀性,為了程序結(jié)構(gòu)嚴(yán)謹(jǐn)我們肯定不能隨便胡亂標(biāo)記。

④創(chuàng)建組件

創(chuàng)建控制層組件

@Controller
public class UserController {
}

創(chuàng)建接口 UserService

public interface UserService {
}

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

@Service
public class UserServiceImpl implements UserService {
}

創(chuàng)建接口 UserDao

public interface UserDao {
}

創(chuàng)建持久層組件 UserDaoImpl

@Repository
public class UserDaoImpl implements UserDao {
}

⑤掃描組件

情況一:最基本的掃描方式(beans里面配置)

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

測(cè)試:

    @Test
    public void test2(){
        ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        System.out.println(userController);
        UserDaoImpl userDao = ioc.getBean(UserDaoImpl.class);
        System.out.println(userDao);
        UserService userService = ioc.getBean(UserService.class);
        System.out.println(userService);
    }

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

type="annotation",根據(jù)注解排除,expression中設(shè)置要排除的注解的全類名:

    <!-- context:exclude-filter標(biāo)簽:指定排除規(guī)則 -->
    <!--
    type:設(shè)置排除或包含的依據(jù)
    type="annotation",根據(jù)注解排除,expression中設(shè)置要排除的注解的全類名
    type="assignable",根據(jù)類型排除,expression中設(shè)置要排除的類型的全類名
    -->
    <context:component-scan base-package="com.atguigu.spring">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    public void test2(){
        ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        System.out.println(userController);
        UserDaoImpl userDao = ioc.getBean(UserDaoImpl.class);
        System.out.println(userDao);
        UserService userService = ioc.getBean(UserService.class);
        System.out.println(userService);
    }

將UserController 注釋:

    public void test2(){
        ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
//        UserController userController = ioc.getBean(UserController.class);
//        System.out.println(userController);
        UserDaoImpl userDao = ioc.getBean(UserDaoImpl.class);
        System.out.println(userDao);
        UserService userService = ioc.getBean(UserService.class);
        System.out.println(userService);
    }

type="assignable",根據(jù)類型排除,expression中設(shè)置要排除的類型的全類名 :

    <context:component-scan base-package="com.atguigu.spring">
<!--        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
      <context:exclude-filter type="assignable" expression="com.atguigu.spring.Dao.impl.UserDaoImpl"/>
    </context:component-scan>
    public void test2(){
        ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        System.out.println(userController);
        UserDaoImpl userDao = ioc.getBean(UserDaoImpl.class);
        System.out.println(userDao);
        UserService userService = ioc.getBean(UserService.class);
        System.out.println(userService);
    }

將UserDaoImpl 注釋掉:

    public void test2(){
        ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        System.out.println(userController);
//        UserDaoImpl userDao = ioc.getBean(UserDaoImpl.class);
//        System.out.println(userDao);
        UserService userService = ioc.getBean(UserService.class);
        System.out.println(userService);
    }

情況三:僅掃描指定組件

<context:component-scan base-package="com.atguigu" use-default-filters="false">
<!-- context:include-filter標(biāo)簽:指定在原有掃描規(guī)則的基礎(chǔ)上追加的規(guī)則 -->
<!-- use-default-filters屬性:取值false表示關(guān)閉默認(rèn)掃描規(guī)則 -->
<!-- 此時(shí)必須設(shè)置use-default-filters="false",因?yàn)槟J(rèn)規(guī)則即掃描指定包下所有類 -->
<!--
type:設(shè)置排除或包含的依據(jù)
type="annotation",根據(jù)注解排除,expression中設(shè)置要排除的注解的全類名
type="assignable",根據(jù)類型排除,expression中設(shè)置要排除的類型的全類名
-->
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<!--<context:include-filter type="assignable"
expression="com.atguigu.controller.UserController"/>-->
</context:component-scan>

⑥組件所對(duì)應(yīng)的 bean 的 id 在我們使用 XML 方式管理 bean 的時(shí)候,每個(gè) bean 都有一個(gè)唯一標(biāo)識(shí),便于在其他地方引用?,F(xiàn)在使用注解后,每個(gè)組件仍然應(yīng)該有一個(gè)唯一標(biāo)識(shí)。

默認(rèn)情況

類名首字母小寫就是 bean 的 id 。例如: UserController 類對(duì)應(yīng)的 bean 的 id 就 userController 。

自定義 bean 的 id

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

@Service("userService")

// 默認(rèn)為 userServiceImpl

public class UserServiceImpl implements UserService {}

    public void test2(){
        ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean("userController",UserController.class);
        System.out.println(userController);
        UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);
        System.out.println(userDao);
        UserService userService = ioc.getBean("userServiceImpl",UserService.class);
        System.out.println(userService);
    }

二、基于注解的自動(dòng)裝配

①場(chǎng)景模擬

參考基于 xml 的自動(dòng)裝配

在 UserController 中聲明 UserService 對(duì)象

在 UserServiceImpl 中聲明 UserDao 對(duì)象

②@Autowired注解

在成員變量上直接標(biāo)記 @Autowired 注解即可完成自動(dòng)裝配,不需要提供 setXxx() 方法。以后我們?cè)陧?xiàng)目中的正式用法就是這樣。

@Controller
public class UserController {
@Autowired
private UserService userService;
public void saveUser(){
userService.saveUser();
}
}
public interface UserService {
void saveUser();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void saveUser() {
userDao.saveUser();
}
}
public interface UserDao {
void saveUser();
}
@Repository
public class UserDaoImpl implements UserDao {
@Override
public void saveUser() {
System.out.println("保存成功");
}
}

③@Autowired注解其他細(xì)節(jié)

@Autowired 注解可以標(biāo)記在構(gòu)造器和 set 方法上

@Controller
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService){
this.userService = userService;
}
public void saveUser(){
userService.saveUser();
}
}
@Controller
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
public void saveUser(){
userService.saveUser();
}
}

④@Autowired工作流程

首先根據(jù)所需要的組件類型到 IOC 容器中查找

  • 能夠找到唯一的bean:直接執(zhí)行裝配
  • 如果完全找不到匹配這個(gè)類型的bean:裝配失敗
  • 和所需類型匹配的bean不止一個(gè)

→沒(méi)有@Qualifier注解:根據(jù)@Autowired標(biāo)記位置成員變量的變量名作為bean的id進(jìn)行匹配

能夠找到:執(zhí)行裝配

找不到:裝配失敗

→使用@Qualifier 注解:根據(jù) @Qualifier 注解中指定的名稱作為 bean 的 id 進(jìn)行匹配

能夠找到:執(zhí)行裝配

找不到:裝配失敗

@Controller
public class UserController {
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;
public void saveUser(){
userService.saveUser();
}
}

@Autowired中有屬性required,默認(rèn)值為true,因此在自動(dòng)裝配無(wú)法找到相應(yīng)的bean時(shí),會(huì)裝配失敗

可以將屬性 required 的值設(shè)置為 true ,則表示能裝就裝,裝不上就不裝,此時(shí)自動(dòng)裝配的屬性為默認(rèn)值

但是實(shí)際開發(fā)時(shí),基本上所有需要裝配組件的地方都是必須裝配的,用不上這個(gè)屬性。

到此這篇關(guān)于Spring基于注解管理bean實(shí)現(xiàn)方式講解的文章就介紹到這了,更多相關(guān)Spring管理bean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Scala異常處理的方法深入分析

    Scala異常處理的方法深入分析

    Scala是一種多范式的編程語(yǔ)言,支持面向?qū)ο蠛秃瘮?shù)式編程。Scala也支持異常處理,即在程序運(yùn)行過(guò)程中發(fā)生意外或錯(cuò)誤時(shí),采取相應(yīng)的措施
    2023-04-04
  • Java?導(dǎo)出?CSV?文件操作詳情

    Java?導(dǎo)出?CSV?文件操作詳情

    這篇文章主要介紹了Java導(dǎo)出CSV文件操作詳情,文章通過(guò)導(dǎo)入坐標(biāo)展開詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 你要知道IDEA的這些必備插件

    你要知道IDEA的這些必備插件

    這篇文章主要介紹了你要知道IDEA的這些必備插件,文中有非常詳細(xì)的圖文示例及代碼,對(duì)正在使用IDEA的小伙伴們有很好的幫助喲,需要的朋友可以參考下
    2021-05-05
  • Java使用JavaMail API發(fā)送和接收郵件的代碼示例

    Java使用JavaMail API發(fā)送和接收郵件的代碼示例

    JavaMail是Oracle甲骨文開發(fā)的Java郵件類API,支持多種郵件協(xié)議,這里我們就來(lái)看一下Java使用JavaMail API發(fā)送和接收郵件的代碼示例
    2016-06-06
  • Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法

    Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • MyBatis-Plus邏輯刪除和字段自動(dòng)填充的實(shí)現(xiàn)

    MyBatis-Plus邏輯刪除和字段自動(dòng)填充的實(shí)現(xiàn)

    本文主要介紹了MyBatis-Plus邏輯刪除和字段自動(dòng)填充的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java 中的位運(yùn)算與移位運(yùn)算詳解

    Java 中的位運(yùn)算與移位運(yùn)算詳解

    這篇文章主要為大家介紹了Java 中的位運(yùn)算與移位運(yùn)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • java 直接調(diào)用python腳本,并傳遞參數(shù)代碼實(shí)例

    java 直接調(diào)用python腳本,并傳遞參數(shù)代碼實(shí)例

    這篇文章主要介紹了java調(diào)用python腳本傳遞參數(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • spring 和 spring boot 中的屬性配置方式

    spring 和 spring boot 中的屬性配置方式

    這篇文章主要介紹了spring 和 spring boot 中的屬性配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring MVC返回的json去除根節(jié)點(diǎn)名稱的方法

    Spring MVC返回的json去除根節(jié)點(diǎn)名稱的方法

    這篇文章主要介紹了Spring MVC返回的json去除根節(jié)點(diǎn)名稱的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09

最新評(píng)論