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

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

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

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

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

1、注解 @Component

我們這里有個(gè)類 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 對(duì)象,我們要進(jìn)行如下配置:

applicationContext.xml 配置:

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

如果使用注解呢?

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

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

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

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

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

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

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

第四步:測(cè)試

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

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

@Component

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

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

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

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

2、@Repository @Service @Controller

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

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

3、注解@Resource

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

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

然后在 Person 類中添加一個(gè)屬性 Student

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

不使用注解:

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

使用注解:

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

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

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

4、注解 @Autowired

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

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

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

第二步:創(chuàng)建一個(gè)接口實(shí)現(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();
    }
}

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

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

如果還是向上面那樣寫,那么測(cè)試就會(huì)報(bào)錯(cuò)。怎么解決呢?

第一種方法:更改名稱

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

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

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

總結(jié)

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

相關(guān)文章

  • Java Swing組件下拉菜單控件JComboBox用法示例

    Java Swing組件下拉菜單控件JComboBox用法示例

    這篇文章主要介紹了Java Swing組件下拉菜單控件JComboBox用法,結(jié)合具體實(shí)例形式分析了Swing組件下拉菜單控件JComboBox的具體定義、使用方法及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下
    2017-11-11
  • 詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

    詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

    本文就在項(xiàng)目中來(lái)集成 UidGenerator這一工程來(lái)作為項(xiàng)目的全局唯一 ID生成器。接下來(lái)通過實(shí)例代碼給大家詳解詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟,感興趣的朋友一起看看吧
    2018-10-10
  • mybatis分頁(yè)及模糊查詢功能實(shí)現(xiàn)

    mybatis分頁(yè)及模糊查詢功能實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)為大家詳細(xì)介紹了mybatis實(shí)現(xiàn)分頁(yè)及模糊查詢功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java異常和錯(cuò)誤類總結(jié)(必看篇)

    java異常和錯(cuò)誤類總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇java異常和錯(cuò)誤類總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-09-09
  • java封裝全局異常處理深入詳解

    java封裝全局異常處理深入詳解

    這篇文章主要為大家介紹了java封裝全局異常處理的深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Eclipse2020安裝了最新版本的JDK卻無(wú)法打開的問題

    Eclipse2020安裝了最新版本的JDK卻無(wú)法打開的問題

    這篇文章主要介紹了Eclipse2020安裝了最新版本的JDK卻無(wú)法打開,提示版本太老的完美解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 使用vscode搭建javaweb項(xiàng)目的詳細(xì)步驟

    使用vscode搭建javaweb項(xiàng)目的詳細(xì)步驟

    我個(gè)人是很喜歡VsCode的,開源免費(fèi)、功能全面,所以為了方便,我把我?guī)缀跛械倪\(yùn)行都集成到了VsCode上來(lái),JavaWeb也不例外,下面這篇文章主要給大家介紹了關(guān)于使用vscode搭建javaweb項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 解決@Scope(“prototype“)不生效的問題

    解決@Scope(“prototype“)不生效的問題

    這篇文章主要介紹了解決@Scope(“prototype“)不生效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java設(shè)計(jì)模式之動(dòng)態(tài)代理

    Java設(shè)計(jì)模式之動(dòng)態(tài)代理

    今天小編就為大家分享一篇關(guān)于Java設(shè)計(jì)模式之動(dòng)態(tài)代理,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java多線程的同步優(yōu)化的6種方案

    Java多線程的同步優(yōu)化的6種方案

    大家使用多線程無(wú)非是為了提高性能,在Java中,有多線程并發(fā)時(shí),我們可以使用多線程同步的方式來(lái)解決內(nèi)存一致性的問題。本文就詳細(xì)的介紹了Java多線程同步優(yōu)化,感興趣的可以了解一下
    2021-05-05

最新評(píng)論