亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

spring裝配bean的3種方式總結

2024-07-14 08:43:51
字體:
來源:轉載
供稿:網友

前言

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

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

依賴注入的出現可以很好地解決這個問題,依賴注入就是由系統負責協調類的依賴對象的創建,我們無需自己去顯示的創建依賴對象,而是由系統給我們注入這個對象,系統控制了這個對象的創建,也稱為控制反轉。

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

  • 隱式的bean掃描發現機制和自動裝配
  • 在java中進行顯示配置
  • 在XML中進行顯示配置

第一種:

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

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

package bbs.dao;@Componentpublic interface Postdao { /* *用戶發帖 ,post表添加帖子信息 */ public int addpost(@Param("title") String title,@Param("content") String content,@Param("userid") int userid);}package bbs.dao;@Componentpublic interface Userdao { /* * 用戶發帖后,user表將用戶發帖數加一 */ public int addpost(int userid);}

再在bbs.service包中創建一個postservice接口及其實現類,依賴Postdao和Userdao。

package bbs.service;public interface PostService { /* 用戶發帖后,先添加帖子信息再更新用戶發帖數量 */ public void addpost(String title,String content,int userid);}package bbs.service;@Componentpublic 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("發帖成功"); else  System.out.println("發帖失敗"); }}

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

也可能出現spring沒有查找到匹配的bean會拋出異常,在@Autowired加上required=false,如果沒有匹配的bean時,spring會使這個bean處于未裝配的狀態,沒有裝配成功。還有可能會出現相同名字的bean有很多個,會產生歧義,一般在組件類上添加注解@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不允許在同一個條目上重復出現相同類型的多個注解,所有注入采用set方式。但是其實可以創建自定義的限定符注解。這里就不介紹啦。

第二種:

通過java代碼裝配bean

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

@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。可參考這篇文章,寫的挺清楚的。

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

不過在這里要注意進行測試時,由于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的標簽中,ref指的是依賴的bean的ID。如果是在javaConfig中配置的,就寫@Bean的內容。如果是@Component就寫@Qualifier的內容。這里是引入的是動態實現的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注解

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品人伦一区二区三区蜜桃免费| 91麻豆桃色免费看| 国产精品天天狠天天看| 欧美日韩精品在线视频| 亚洲图片欧美日产| 国产精品久久久久久亚洲调教| 日韩在线观看电影| 日韩av不卡电影| 成人黄色短视频在线观看| 中文欧美日本在线资源| 国产精国产精品| 91在线视频精品| 国产精品第3页| 国产免费一区二区三区在线能观看| 国产亚洲欧美日韩美女| 欧美日韩爱爱视频| 久久成人这里只有精品| 欧美日韩综合视频| 91香蕉嫩草神马影院在线观看| 中文字幕日本精品| 国产在线观看一区二区三区| 亚洲女人天堂网| 国产99久久精品一区二区永久免费| 亚洲欧美日韩久久久久久| 精品国产31久久久久久| 国产精品视频免费在线| 成人黄色免费网站在线观看| 日本高清不卡在线| 亚洲高清免费观看高清完整版| 日韩中文在线中文网三级| 欧美性在线观看| 亚洲成人aaa| 91视频-88av| 精品动漫一区二区| 日韩中文字幕精品视频| 国产成人精品亚洲精品| 国产精品高精视频免费| 正在播放亚洲1区| 91在线视频导航| 欧美激情欧美激情| 国产香蕉一区二区三区在线视频| 亚洲精品久久久久久久久久久久| 国产美女久久精品香蕉69| 久久久久久中文字幕| 欧美日韩福利视频| 久久99久久99精品免观看粉嫩| 成人欧美一区二区三区黑人| 清纯唯美日韩制服另类| 九色成人免费视频| 久久精品美女视频网站| 精品动漫一区二区三区| 久久久久久久91| 国产精欧美一区二区三区| 奇米四色中文综合久久| 狠狠做深爱婷婷久久综合一区| 国产精品成人一区二区三区吃奶| 亚洲女人天堂视频| 亚洲人成自拍网站| 欧美人在线观看| 1769国内精品视频在线播放| 日韩精品视频在线观看网址| 欧美一区二粉嫩精品国产一线天| 4438全国亚洲精品在线观看视频| 欧美黄色三级网站| 国产91九色视频| 日韩av在线免播放器| 国产69精品久久久| 日本道色综合久久影院| 日韩在线观看电影| 欧美激情视频网| 国产91免费观看| 久久亚洲精品一区| 欧美成人免费一级人片100| 日本亚洲欧美三级| 日韩av第一页| 在线观看精品国产视频| 97色伦亚洲国产| 国产中文字幕91| 久久精品国产69国产精品亚洲| 亚洲午夜久久久久久久| 在线观看91久久久久久| 欧美激情国产高清| 国内外成人免费激情在线视频| 亚洲欧美成人网| 亚洲视频在线观看网站| 亚洲国产精品网站| 性欧美激情精品| 欧美极品第一页| 久久av中文字幕| 国产在线拍揄自揄视频不卡99| 成人日韩在线电影| 久久全国免费视频| 最近2019免费中文字幕视频三| 懂色aⅴ精品一区二区三区蜜月| 日韩女在线观看| 日韩中文在线观看| 亚洲国产成人精品电影| 俺去亚洲欧洲欧美日韩| 九九热在线精品视频| 亚洲欧美另类中文字幕| 成人国产精品久久久久久亚洲| 国产精品免费福利| 国产精品青青在线观看爽香蕉| 久久夜精品香蕉| 92福利视频午夜1000合集在线观看| 神马国产精品影院av| www.日韩av.com| 在线播放日韩欧美| 亚洲18私人小影院| 欧美日韩另类在线| 中文字幕欧美亚洲| 尤物yw午夜国产精品视频明星| 欧美成人精品一区| 亚洲欧洲国产精品| 91精品综合久久久久久五月天| 日韩av在线导航| 亚洲免费视频一区二区| 欧美在线免费看| 91成人在线观看国产| 日韩视频永久免费观看| 欧洲精品毛片网站| 国产精品日韩在线播放| 日本成人激情视频| 51色欧美片视频在线观看| 色哟哟网站入口亚洲精品| 国产午夜精品免费一区二区三区| 欧美中文字幕在线| 成人亚洲综合色就1024| 精品欧美国产一区二区三区| 欧美黑人巨大精品一区二区| 91精品国产高清自在线| 精品国产精品自拍| 中文字幕日韩视频| 亚洲女人被黑人巨大进入| 91精品久久久久久久久青青| 精品久久国产精品| 国产日韩换脸av一区在线观看| 国产日韩在线播放| 亚洲va久久久噜噜噜| 亚洲性猛交xxxxwww| 国产不卡av在线| **欧美日韩vr在线| 成人午夜一级二级三级| 精品欧美一区二区三区| 亚洲欧美日韩国产精品| 在线观看中文字幕亚洲| 国产精品久久视频| 久久精品国产亚洲精品| 91精品国产综合久久久久久久久| www.xxxx欧美| 2019最新中文字幕| 欧美激情第一页xxx| 亚洲欧美色图片| 亚洲成av人乱码色午夜| 久久久99久久精品女同性| 亚洲成人激情图| 91精品国产综合久久香蕉| 最近2019中文免费高清视频观看www99| 日韩免费av一区二区| 国产精品∨欧美精品v日韩精品| 国产日韩欧美中文在线播放| 国产精品6699| 久久精品国产亚洲| 在线观看欧美视频|