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

Spring注解配置IOC,DI的方法詳解

 更新時間:2022年01月20日 09:53:16   作者:YSOcean  
這篇文章主要為大家介紹了vue組件通信的幾種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴性,甚至執(zhí)行基本編譯時檢查。注解是以‘@注解名’在代碼中存在的。

前面講解 IOC 和 DI 都是通過 xml 文件來進(jìn)行配置的,我們發(fā)現(xiàn) xml 配置還是比較麻煩的,那么如何簡化配置呢?答案就是使用注解!

1、注解 @Component

我們這里有個類 Person

package com.ys.annotation;
public class Person {
    private int pid;
    private String pname;
    private String psex;
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public String getPsex() {
        return psex;
    }
    public void setPsex(String psex) {
        this.psex = psex;
    }
}

如果我們不使用注解,通過前面講解的,要想讓 Spring 容器幫我們產(chǎn)生 Person 對象,我們要進(jìn)行如下配置:

applicationContext.xml 配置:

<bean id="person" class="com.ys.annotation.Person"></bean>

如果使用注解呢?

第一步:在 applicationContext.xml 中引入命名空間

這里我們簡單講解一下這里引入的命名空間,簡單來說就是用來約束xml文件格式的。第一個 xmlns:context ,這表示標(biāo)簽格式應(yīng)該是<context:標(biāo)簽名>

第二步:在 applicationContext.xml 文件中引入注解掃描器

<!-- 組件掃描,掃描含有注解的類 -->
    <context:component-scan base-package="com.ys.annotation"></context:component-scan>

base-package:表示含有注解類的包名

如果掃描多個包,則上面的代碼書寫多行,改變 base-package 里面的內(nèi)容即可!

第三步:在 Person 類中添加注解@Component

第四步:測試

@Test
    public void testAnnotation(){
        //1、啟動 spring 容器
        //2、從 spring 容器中取出數(shù)據(jù)
        //3、通過對象調(diào)用方法
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = (Person) context.getBean("person");
        System.out.println(person.getPname());
    }

如果看完上面的注解配置,你一臉懵逼,那沒關(guān)系,我們下面來詳細(xì)講解。

@Component

如果一個類上加了@Component注解,就會進(jìn)行如下的法則

      如果其value屬性的值為""
      @Component
      publicclassPerson{}
        等價于
      <beanid="person"class="..Person"> 

     如果其value屬性的值不為""
      @Component("p")
      publicclassPerson{}
        等價于
      <beanid="p"class="..Person">

那么這就很好理解測試程序中,我們直接 context.getBean("person") 這樣寫。

2、@Repository @Service @Controller

此外:下面三個注解是 @Component 注解的衍生注解,功能一樣

@Repository :dao層
@Service:service層
@Controller:web層

3、注解@Resource

@Resource 注解,它可以對類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動裝配的工作。 通過 @Resource 的使用來消除 set ,get方法。

首先創(chuàng)建一個 學(xué)生類 Student.java

然后在 Person 類中添加一個屬性 Student

那么我們?nèi)绾潍@取 Person 對象,并調(diào)用 showStudent()方法呢?這個問題簡化就是如何給屬性 Student 實例化,也就是依賴注入

不使用注解:

<property name="students">
    <ref bean="student"/>
</property>
<bean id="student" class="com.ys.annotation_di.Student"></bean>
  使用注解:

使用注解:

@Resource注解以后,判斷該注解name的屬性是否為""(name沒有寫)

①、如果沒有寫name屬性,則會讓屬性的名稱的值和spring配置文件bean中ID的值做匹配(如果沒有進(jìn)行配置,也和注解@Component進(jìn)行匹配),如果匹配成功則賦值,如果匹配不成功,則會按照spring配置文件class類型進(jìn)行匹配,如果匹配不成功,則報錯

②、如果有name屬性,則會按照name屬性的值和spring的bean中ID進(jìn)行匹配,匹配成功,則賦值,不成功則報錯

4、注解 @Autowired

功能和注解 @Resource 一樣,可以對類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動裝配的工作。只不過注解@Resource 是按照名稱來進(jìn)行裝配,而@Autowired 則是按照類型來進(jìn)行裝配。

第一步:創(chuàng)建接口 PersonDao

package com.ys.autowired;
public interface PersonDao {
    public void savePerson();
}

第二步:創(chuàng)建一個接口實現(xiàn)類 PersonDaoImplOne

package com.ys.autowired;
import org.springframework.stereotype.Component;
@Component("personDaoImplOne")
public class PersonDaoImplOne implements PersonDao{
    @Override
    public void savePerson() {
        System.out.println("save Person One");
    }
}

第三步:創(chuàng)建PersonService

package com.ys.autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("personService")
public class PersonService{
    @Autowired
    private PersonDao personDao;
    public void savePerson() {
        this.personDao.savePerson();
    }
}

注意:這里我們在private PesronDao personDao 上面添加了注解 @Autowired,它首先會根據(jù)類型去匹配,PersonDao 是一個接口,它的實現(xiàn)類是 PesronDaoImpOne,那么這里的意思就是:PersonDao personDao = new PersonDaoImpOne();

那么問題來了,如果 PersonDao 的實現(xiàn)類有多個呢?我們創(chuàng)建第一個實現(xiàn)類 PersonDaoImpTwo

如果還是向上面那樣寫,那么測試就會報錯。怎么解決呢?

第一種方法:更改名稱

第二種方法:@Autowired 和 @Qualifier("名稱") 配合使用

在使用@Autowired時,首先在容器中查詢對應(yīng)類型的bean

  • 如果查詢結(jié)果剛好為一個,就將該bean裝配給@Autowired指定的數(shù)據(jù)
  • 如果查詢的結(jié)果不止一個,那么@Autowired會根據(jù)名稱來查找。
  • 如果查詢的結(jié)果為空,那么會拋出異常。解決方法時,使用required=false

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java?Optional用法面試題精講

    Java?Optional用法面試題精講

    這篇文章主要為大家介紹了Java?Optional用法面試題精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Hadoop MultipleOutputs輸出到多個文件中的實現(xiàn)方法

    Hadoop MultipleOutputs輸出到多個文件中的實現(xiàn)方法

    這篇文章主要介紹了 Hadoop MultipleOutputs輸出到多個文件中的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • Java 實戰(zhàn)項目錘煉之在線購書商城系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)項目錘煉之在線購書商城系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+mysql+servlet+ajax實現(xiàn)一個在線購書商城系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • 簡單講解奇偶排序算法及在Java數(shù)組中的實現(xiàn)

    簡單講解奇偶排序算法及在Java數(shù)組中的實現(xiàn)

    這篇文章主要介紹了奇偶排序算法及Java數(shù)組的實現(xiàn),奇偶排序的時間復(fù)雜度為O(N^2),需要的朋友可以參考下
    2016-04-04
  • Java使用線程池批量處理數(shù)據(jù)操作具體流程

    Java使用線程池批量處理數(shù)據(jù)操作具體流程

    這篇文章主要給大家介紹了關(guān)于Java使用線程池批量處理數(shù)據(jù)操作的相關(guān)資料,Java多線程編程中線程池是一個非常重要的概念,線程池可以提高線程的復(fù)用率和任務(wù)調(diào)度的效率,尤其是當(dāng)需要查詢大批量數(shù)據(jù)時,需要的朋友可以參考下
    2023-06-06
  • Spring Boot中使用Server-Sent Events (SSE) 實現(xiàn)實時數(shù)據(jù)推送教程

    Spring Boot中使用Server-Sent Events (SSE) 實

    Server-Sent Events (SSE) 是HTML5引入的一種輕量級的服務(wù)器向瀏覽器客戶端單向推送實時數(shù)據(jù)的技術(shù),本文主要介紹了Spring Boot中使用Server-Sent Events (SSE) 實現(xiàn)實時數(shù)據(jù)推送教程,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Java轉(zhuǎn)義字符詳細(xì)介紹

    Java轉(zhuǎn)義字符詳細(xì)介紹

    這篇文章主要介紹了Java轉(zhuǎn)義字符的相關(guān)資料,包括換行符、回車符、換頁符、退格符、空字符、空格、制表符、單引號、雙引號、反斜杠以及八進(jìn)制和十六進(jìn)制字符,通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • Java的MyBatis框架中對數(shù)據(jù)庫進(jìn)行動態(tài)SQL查詢的教程

    Java的MyBatis框架中對數(shù)據(jù)庫進(jìn)行動態(tài)SQL查詢的教程

    這篇文章主要介紹了Java的MyBatis框架中對數(shù)據(jù)庫進(jìn)行動態(tài)SQL查詢的教程,講解了MyBatis中一些控制查詢流程的常用語句,需要的朋友可以參考下
    2016-04-04
  • SpringBoot項目中引入本地JAR包配置的幾種方法

    SpringBoot項目中引入本地JAR包配置的幾種方法

    SpringBoot有時需要引入本地JAR包以便重用已有的代碼庫或者第三方庫,本文主要介紹了SpringBoot項目中引入本地JAR包配置的幾種方法,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • 關(guān)于MVC與SpringMVC的介紹、區(qū)別、執(zhí)行流程

    關(guān)于MVC與SpringMVC的介紹、區(qū)別、執(zhí)行流程

    這篇文章主要介紹了關(guān)于MVC與SpringMVC的介紹、區(qū)別、執(zhí)行流程,MVC框架的主要目標(biāo)是將應(yīng)用程序的業(yè)務(wù)邏輯(Model)與用戶界面(View)分離開來,從而提高應(yīng)用程序的可維護(hù)性和可擴(kuò)展性,需要的朋友可以參考下
    2023-05-05

最新評論

抚顺市| 海阳市| 永丰县| 湄潭县| 都兰县| 广饶县| 汾西县| 石棉县| 凭祥市| 桂东县| 常德市| 上饶县| 赣榆县| 海口市| 湾仔区| 闸北区| 神池县| 巴中市| 乌拉特中旗| 监利县| 澎湖县| 泰顺县| 伊春市| 沽源县| 南城县| 西贡区| 河北区| 阳高县| 连州市| 闽侯县| 拉孜县| 望谟县| 会泽县| 隆回县| 乐昌市| 会东县| 赤壁市| 抚顺市| 宝兴县| 黑龙江省| 合水县|