国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發(fā) > Java > 正文

spring裝配bean的3種方式總結

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

前言

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

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

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

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

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

第一種:

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

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

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

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

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

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

也可能出現spring沒有查找到匹配的bean會拋出異常,在@Autowired加上required=false,如果沒有匹配的bean時,spring會使這個bean處于未裝配的狀態(tài),沒有裝配成功。還有可能會出現相同名字的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方式。但是其實可以創(chuàng)建自定義的限定符注解。這里就不介紹啦。

第二種:

通過java代碼裝配bean

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

@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的內容。這里是引入的是動態(tài)實現的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教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
99re6在线视频精品免费| 成人免费一区二区三区牛牛 | 国产精品合集一区二区| 中文字幕不卡| 国产视频资源| 亚洲尤物在线视频| 男人天堂99| 国产色a在线| 日本卡一卡2卡3卡4精品卡网站| 日本成人a视频| 国产亚洲精品久久久久久移动网络| 最近中文字幕av免费高清| 国产三级在线免费观看| 在线免费观看污| 丁香婷婷在线观看| 国产福利热线视频| 日本动漫同人动漫在线观看| 99视频免费在线观看| 在线午夜影院| 午夜视频在线看| 性网站在线看| 国产成人午夜| 国产丝袜在线观看视频| 四虎精品视频| 99热国产在线| 国产porn在线| 国产精品你懂的在线观看| www.色五月| av日韩在线免费| 国产福利视频在线| 国产视频福利在线| 国产免费av在线| 欧美日韩一区二区三区在线播放| 国产黄色在线网站| 国产激情在线观看| 国产精品bbw一区二区三区| 五月伊人六月| 国产性色视频| 中文字幕亚洲精品视频| 国产精品一区二区三区视频网站| 亚色视频在线观看| 96久久久久久| av男人的天堂网| 国产www视频在线观看| 最近中文字幕mv免费高清视频8| 人人澡人人爽| 久久久久久久久久久久久91| 日本黄色免费网址| 狠狠操视频网| 中文字幕高清av| 国产二级片在线| 亚洲大香人伊一本线| 日本一本久久| 国产免费麻豆视频| 99视频在线观看地址| 国产精品麻豆一区二区三区| 国产高清av在线| 影音先锋日韩| 就爱干草视频| 国产精品69xx| 精品乱码一区二区三四区视频| 在线中文字幕视频观看| yjizz视频网站在线播放| 国产在线日本| 精品国产二区三区| 日本h片在线观看| 国产无遮挡又黄又爽免费软件 | 精品视频vs精品视频| 精品视频三区| 久热中文字幕精品视频在线| 国产三区在线观看| 精品一区二区三区高清免费不卡 | 日本一卡二卡四卡精品| 国产有码在线| 伊人狠狠av| 国产青青草在线| 亚洲成a人v欧美综合天堂麻豆| 国产在线资源| gogo在线高清视频| 国产福利一区二区在线精品| 免费观看久久久久| 中文在线视频| 国产精品jvid在线观看| 国产在线视频网站| 影音先锋中文字幕在线| 国产亚洲精品久久久久久青梅| 天天插天天射| 伊人影院在线视频| 国产成在线观看免费视频| 国产理论片免费观看| 欧美精品小视频| gogogogo高清视频在线| 在线天堂中文www视软件| 国产丝袜视频在线播放| 午夜视频在线免费| 日本中文字幕高清视频| 国产在线传媒| 国产精品综合久久久久| 国产免费一级片| 欧美婷婷久久五月精品三区| 在线免费观看你懂的| 精品av中文字幕在线毛片| 国产欧美日韩第一页| 国产精选一区二区三区不卡催乳| 免费看的毛片| 99热在线观看免费| 国产无套粉嫩白浆在线2022年 | 国产又色又爽又黄刺激在线视频| 制服丝袜中文字幕在线观看| 国产va在线观看| 中文字幕av在线| baoyu777.永久免费视频| 中文天堂av| 夜色资源网av在先锋网站观看| 在线视频xx| 开心婷婷激情五月| 国产一级黄色大片| 中文资源在线网| 免费看av大片| 国产欧美日韩精品综合| 伊人电影在线观看| 久久精品视频免费看| 国产一级片麻豆| 在线久久视频| 天堂中文在线视频| 中文字幕av高清| 国产主播色在线| 国产天堂视频| 四虎免费播放| 国产日产精品久久久久久婷婷| 精品黄色免费中文电影在线播放| www.蜜桃av| 91亚洲天堂| 丁香花视频在线观看| 在线国产91| 国产三级在线| 男女午夜视频在线观看| 国产精品剧情一区二区三区| 日日夜夜中文字幕| 国产日韩网站| 成年女人在线视频| 亚洲成人福利| 国产成人无吗| 国产网站麻豆精品视频| 免费在线黄色av| 影音先锋日韩| 国产黄a三级三级三级av在线看| 青草视频在线播放| 99久久99热久久精品免费看| 最新国产在线精品91尤物| 免费女人毛片视频| 在线播放黄色网址| 中文av在线播放| 国产三级自拍| 国产福利在线看| √天堂资源中文www| 国产性网软件大全| 欧美人成在线观看网站高清| 在线免费看黄网站| 在线亚洲电影| av在线中文| 激情视频国产| 中文字幕在线免费| 国产黄色免费电影| 国产98在线| 中文在线观看视频| 精品视频一二三| eeuss在线观看| 久久综合精品视频| 国产嫩草在线视频| 国产午夜视频在线观看| 国产一级性片| 91精品国产高久久久久久五月天| 国产无套粉嫩白浆在线2022年| 国产小视频在线| 99精品老司机免费视频| av在线不卡免费| 福利视频在线看| 精品一区二区三区高清免费不卡| 精品国产丝袜高跟鞋| 日p在线观看| 国产极品一区二区三区| 在线黄色av| 黄色片视频在线观看| 国产日产一区二区| wwwww在线观看免费视频| 国产91大片| 国产精品麻豆一区二区三区| 在线欧美一级视频| 国产美女自拍视频| 18激情网站| 福利在线国产| 一区二区三区四区在线免费视频| 青娱乐在线视频观看| 中文字幕免费中文| 性国产高清在线观看| 国产一级黄色| 久久精品视频观看| 亚洲国产aⅴ精品| 国产超碰在线观看|