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

spring裝配bean的3種方式總結(jié)

 更新時間:2019年03月11日 09:45:58   作者:max-先生  
這篇文章主要給大家介紹了關(guān)于spring裝配bean的3種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

這段時間在學(xué)習(xí)Spring,依賴注入DI和面向切面編程AOP是Spring框架最核心的部分。這次主要是總結(jié)依賴注入的bean的裝配方式。

什么是依賴注入呢?也可以稱為控制反轉(zhuǎn),簡單的來說,一般完成稍微復(fù)雜的業(yè)務(wù)邏輯,可能需要多個類,會出現(xiàn)有些類要引用其他類的實例,也可以稱為依賴其他類。傳統(tǒng)的方法就是直接引用那個類對象作為自己的一個屬性,但如果我們每次創(chuàng)建這個類的對象時,都會創(chuàng)建依賴的類的對象,還有如果那個類將來可能不用了,還需要到這個類去刪除這個對象,那破壞了代碼的復(fù)用性和導(dǎo)致高度耦合!

依賴注入的出現(xiàn)可以很好地解決這個問題,依賴注入就是由系統(tǒng)負(fù)責(zé)協(xié)調(diào)類的依賴對象的創(chuàng)建,我們無需自己去顯示的創(chuàng)建依賴對象,而是由系統(tǒng)給我們注入這個對象,系統(tǒng)控制了這個對象的創(chuàng)建,也稱為控制反轉(zhuǎn)。

Spring給我們注入對象有三種方式:

  • 隱式的bean掃描發(fā)現(xiàn)機制和自動裝配
  • 在java中進(jìn)行顯示配置
  • 在XML中進(jìn)行顯示配置

第一種:

spring從兩個角度實現(xiàn)自動化裝配:組件掃描和自動裝配。

當(dāng)對一個類標(biāo)注@Component注解時,表明該類會作為組件類,spring將為這個類創(chuàng)建bean。當(dāng)在應(yīng)用文中引用這個bean,spring會自動掃描事先指定的包查找這個 bean。但spring默認(rèn)是不啟用組件掃描的,可以在XML中配置加上<context:component-scan base-package="xx"/> 。還有一種方法:在新建一個配置類,類中可以什么不用寫,在配置類上加上@ComponentScan注解,spring會自動掃描改配置類所在的包,一般應(yīng)該傾向xml配置。下面是一個bbs論壇系統(tǒng)用戶發(fā)帖的功能小例子:

package bbs.dao;
@Component
public interface Postdao {
 /*
 *用戶發(fā)帖 ,post表添加帖子信息
 */
 public int addpost(@Param("title") String title,@Param("content") String content,@Param("userid") int userid);
}

package bbs.dao;
@Component
public interface Userdao {
 /*
 * 用戶發(fā)帖后,user表將用戶發(fā)帖數(shù)加一
 */
 public int addpost(int userid);
}

再在bbs.service包中創(chuàng)建一個postservice接口及其實現(xiàn)類,依賴Postdao和Userdao。

package bbs.service;
public interface PostService {
 /*
 用戶發(fā)帖后,先添加帖子信息再更新用戶發(fā)帖數(shù)量
 */
 public void addpost(String title,String content,int userid);
}

package bbs.service;
@Component
public class PostserviceImpl implements PostService {

 private Postdao postdao;
 private Userdao userdao;

// @Autowired
// public void setPostdao(Postdao postdao)
// {
// this.postdao=postdao;
// }
//
// @Autowired
// public void setUserdao(Userdao userdao)
// {
// this.userdao=userdao;
// }

 @Autowired
 public PostserviceImpl(Postdao postdao,Userdao userdao)
 {
 this.userdao=userdao;
 this.postdao=postdao;
 }

 public void addpost(String title, String content, int userid) {
 int i=postdao.addpost(title, content, userid);
 int j=userdao.addpost(userid);
 if(i==1&j==1)
  System.out.println("發(fā)帖成功");
 else
  System.out.println("發(fā)帖失敗");
 }
}

@Component在接口實現(xiàn)上注解就可以,但發(fā)現(xiàn)在userdao、postdao接口也加上了,其實可以去掉,因為我采用mybatis在xml中配置數(shù)據(jù)庫的操作,動態(tài)實現(xiàn)dao接口。等下會提到。上面代碼出現(xiàn)的@Autowired注解實現(xiàn)bean自動裝配,會在spring應(yīng)用上下文中的組件類尋找需求的bean。一般有兩種裝配方式:構(gòu)造器和Setter方法(其他方法名也行,只要能夠使注入的bean成為這個類的屬性就行)

也可能出現(xiàn)spring沒有查找到匹配的bean會拋出異常,在@Autowired加上required=false,如果沒有匹配的bean時,spring會使這個bean處于未裝配的狀態(tài),沒有裝配成功。還有可能會出現(xiàn)相同名字的bean有很多個,會產(chǎn)生歧義,一般在組件類上添加注解@Qualifier()括號寫這個bean的id,在注入時也加上@Qualifier() ,寫上bean的id。像下面:

@Component
@Qualifier("postdao")
public interface Postdao{
. . . . 
}
 
@Component
@Qualifier("userdao")
public interface Userdao{
. . . . 
}

@Autowired
@Qualifier("usedao")
public void setUserdao(Userdao userdao)
{. . . 
}
 
@Autowired
@Qualifier("postdao")
public void setUserdao(Postdao postdao)
{. . . 
}

由于java不允許在同一個條目上重復(fù)出現(xiàn)相同類型的多個注解,所有注入采用set方式。但是其實可以創(chuàng)建自定義的限定符注解。這里就不介紹啦。

第二種:

通過java代碼裝配bean

一般通過組件掃描和自動裝配方式就比較方便了,但如果由于需求我們要使用第三方的庫的類,在這種情況沒有辦法到第三方庫中去給類加注解,就不能使用第一種方法了。這時得采用顯示裝配,可以采用java代碼或xml顯示裝配bean。使用java代碼,先新建一個配置類JavaConfig,里面都是配置所需的bean,不應(yīng)該有業(yè)務(wù)邏輯代碼,所以單獨建一個類。

@Configuration
@ContextConfiguration(locations = {"classpath:spring/spring-dao.xml","classpath:scan.xml"})
public class bbsConfig{
  private Postdao postdao;
  private Userdao userdao;
  @Bean(name="postservice")
 public PostService getPost()
  {
  return new PostserviceImpl(postdao,userdao);
  }

在對PostService的bean注入時,同時又依賴了兩個bean,postdao和userdao。直接引用beanID就可以,spring會自動地從容器中獲取這些bean,只要他們的配置是正確的就行。這個例子中userdao、postdao是Mybatis配置自動掃描將dao接口生成代理注入到spring的,其實也算是xml裝配bean??蓞⒖歼@篇文章,寫的挺清楚的。 http://m.fzitv.net/article/157618.htm

這里如果再聲明一個bean,返回的仍是postserviceImpl對象,和之前的那個bean完全一樣,是同一個實例。一般spring@bean如果是同一個beanID,默認(rèn)返回的是一個單例bean,注入的是同一個實例。如果修改其中一個會都改變的。

不過在這里要注意進(jìn)行測試時,由于spring的單元測試和springIoc容器是完全獨立的,postdao和userdao注入檢測時是使用locations加載xml文件,而postservice使用classes加載config類的,但是兩個不能同時混用在@ContextConfiguration中。所以非要都測試的話,就分開測試吧。

第三種:

在XML中裝配bean

<?xml version="1.0" encoding="UTF-8" ?>
<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
  http://www.springframework.org/schema/context">
 <import resource="spring/spring-dao.xml"/>

 <bean id="postservice" class="com.bbs.service.impl.PostserviceImpl">
  <constructor-arg ref="postdao"/>
  <constructor-arg ref="userdao"/>
 </bean>
</beans>

配置postservice的bean時需要引入兩個bean,postdao和userdao,放到constructor-arg的標(biāo)簽中,ref指的是依賴的bean的ID。如果是在javaConfig中配置的,就寫@Bean的內(nèi)容。如果是@Component就寫@Qualifier的內(nèi)容。這里是引入的是動態(tài)實現(xiàn)的dao接口的bean,是在spring-dao.xml中配置的,引入這個配置文件就可以自動獲得beanID。

 混合使用三種裝配:

1.在類上可以使用@ import(bbsConfig.class)組合其他java注解

2.在類上使用@ imortResource("classpath:spring-dao.xml")組合其他xml注解

3.在類上可以使用@ContenxtConfiguration包含class或者xml

4.在xml中可以用<import resource="spring-dao.xml">引入xml注解,也可以使用<bean class="com.bbs.dao.Userdao">引入java注解

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Intellij IDEA使用restclient測試的教程圖解

    Intellij IDEA使用restclient測試的教程圖解

    這篇文章主要介紹了Intellij IDEA使用restclient測試的教程圖解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java中對集合的元素排序操作方法

    Java中對集合的元素排序操作方法

    本文介紹了Java中對集合元素進(jìn)行排序的幾種常見方法,包括使用Collections.sort()、List.sort()、StreamAPI以及對Map的鍵或值進(jìn)行排序,每種方法都有其適用的場景和使用方式,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Spring Cloud Config與Bus整合實現(xiàn)微服務(wù)配置自動刷新功能

    Spring Cloud Config與Bus整合實現(xiàn)微服務(wù)配置自動刷新功能

    通過整合SpringCloud Config與Spring Cloud Bus,實現(xiàn)了微服務(wù)配置的自動刷新功能,這個機制允許一個微服務(wù)實例在配置更新時通過消息總線通知其他所有實例同步更新,從而保持配置的一致性并提升系統(tǒng)的運維效率
    2024-10-10
  • springboot?使用mybatis查詢的示例代碼

    springboot?使用mybatis查詢的示例代碼

    這篇文章主要介紹了springboot?使用mybatis查詢功能,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Java微服務(wù)Filter過濾器集成Sentinel實現(xiàn)網(wǎng)關(guān)限流過程詳解

    Java微服務(wù)Filter過濾器集成Sentinel實現(xiàn)網(wǎng)關(guān)限流過程詳解

    這篇文章主要介紹了Java微服務(wù)Filter過濾器集成Sentinel實現(xiàn)網(wǎng)關(guān)限流過程,首先Sentinel規(guī)則的存儲默認(rèn)是存儲在內(nèi)存的,應(yīng)用重啟之后規(guī)則會丟失。因此我們通過配置中心Nacos保存規(guī)則,然后通過定時拉取Nacos數(shù)據(jù)來獲取規(guī)則配置,可以做到動態(tài)實時的刷新規(guī)則
    2023-02-02
  • maven-assembly-plugin報紅無法加載報錯:Plugin?‘maven-assembly-plugin:‘?not?found

    maven-assembly-plugin報紅無法加載報錯:Plugin?‘maven-assembly-plugin

    maven-assembly-plugin是一個常用的打包插件,但是在使用過程中經(jīng)常會遇到各種報錯,本文就來介紹一下maven-assembly-plugin報紅無法加載報錯,具有一定的參考價值
    2023-08-08
  • Java中的SpringAOP、代理模式、常用AspectJ注解詳解

    Java中的SpringAOP、代理模式、常用AspectJ注解詳解

    這篇文章主要介紹了Java中的SpringAOP、代理模式、常用AspectJ注解詳解,Spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù),例如審計和事務(wù)管理進(jìn)行內(nèi)聚性的開發(fā),需要的朋友可以參考下
    2023-09-09
  • Mybatis實戰(zhàn)之TypeHandler高級進(jìn)階

    Mybatis實戰(zhàn)之TypeHandler高級進(jìn)階

    本文主要介紹了自定義的枚舉TypeHandler的相關(guān)知識,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • StringBuffer與StringBuilder底層擴容機制與常用方法

    StringBuffer與StringBuilder底層擴容機制與常用方法

    這篇文章主要給大家介紹了StringBuffer、StringBuilder底層擴容機制與常用方法,有感興趣的小伙伴跟著小編一起來學(xué)習(xí)吧
    2023-07-07
  • java靈活使用mysql中json類型字段存儲數(shù)據(jù)詳解

    java靈活使用mysql中json類型字段存儲數(shù)據(jù)詳解

    在數(shù)據(jù)庫設(shè)計中,面對一對多的關(guān)系,如訂單和商品,可以考慮使用單表存儲而非傳統(tǒng)的分表方式,這篇文章主要介紹了java靈活使用mysql中json類型字段存儲數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2024-09-09

最新評論

扬州市| 肇东市| 石泉县| 牡丹江市| 吴旗县| 浦北县| 绥芬河市| 红原县| 汝阳县| 涟源市| 辽中县| 邻水| 绵竹市| 陆河县| 万载县| 新丰县| 阳谷县| 高尔夫| 汉中市| 奉新县| 龙游县| 山东省| 鹤岗市| 凤凰县| 滦平县| 南投县| 陆川县| 盈江县| 大竹县| 高唐县| 隆子县| 上饶县| 明水县| 纳雍县| 定西市| 禄劝| 伊吾县| 讷河市| 红原县| 连江县| 辽中县|