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

首頁 > 學院 > 開發設計 > 正文

Spring依賴注入三種方式詳解

2019-11-14 15:29:02
字體:
來源:轉載
供稿:網友

在講解SPRing依賴注入之前的準備工作:

  • 下載包含Spring的工具jar包的壓縮包
  • 解壓縮下載下來的Spring壓縮包文件
  • 解壓縮之后我們會看到libs文件夾下有許多jar包,而我們只需要其中的commons-logging-1.0.4.jar,spring-beans-4.2.1.RELEASE.jar,spring-context-4.2.1.RELEASE.jar,spring-context-support-4.2.1.RELEASE.jar,spring-core-4.2.1.RELEASE.jar,spring-expression-4.2.1.RELEASE.jar
  • 在Eclipse建立一個Dynamic Web Project
  • 將上述必要的幾個jar包導入WEB-INF文件夾下lib文件夾中
  • 在src下建立下面提到的包和類

準備工作做完之后我們就開始依賴注入之旅了:

  • 很多人都有迷惑,到底什么是依賴注入,什么是控制反轉,其實所說的依賴注入(DI)和控制反轉(IOC)是同一概念,他們是不分家的。
  • 通俗來講就是,當某個角色(調用者)需要另一個角色(被調用者)的協助時,在java中,通常需要調用者去創建被調用者的實例,即new一個被調用者的對象,而在Spring中,創建被調用者的工作不由調用者完成,因此稱控制反轉;而創建被調用者的實例由Spring容器來完成,然后注入到調用者,因此也稱依賴注入。
  • Spring采用配置文件或Annotation(注解)來管理Bean的實現類、依賴關系,Spring容器則根據配置文件,利用反射來創建實例,并為之注入依賴關系。
  • 打個比方吧,在古代生產力及低的社會,人們自給自足,去打獵要自己生產工具Arrow(箭)來捕獲自己的獵物,完全是自己動手制造(new)一個箭(對象)。到后來隨著社會的發展,有了制造箭工具的工廠,人們無需自己制造箭,而是去工廠告訴他們你需要什么,然后工廠就會給你相應的工具。再后來,你無須到工廠,坐在家里就可以,要什么發出個指令,箭就會出現,這里人和箭都是有Spring來管理的,二者依賴關系由Spring提供。

 好了,廢話不多說了,下面即將進入我們的正題,依賴注入的三種方式(setter注入、構造注入、接口注入):

  先建立三種方式都會用到的類和接口

    接口:Arrow(箭)、Person(人)

    實現類:ArrowImpl、PersonImpl

    測試類:MainTest

  • setter注入

    Arrow接口:   

package iocdi;public interface Arrow {	public String getArrow();}

    Person接口:

package iocdi;public interface Person {	public void hunt();}

    ArrowImpl類:

package iocdi;public class ArrowImpl implements Arrow {	@Override	public String getArrow() {		return "an arrow";	}}

    PersonImpl類:

package iocdi;public class PersonImpl implements Person {	private Arrow arrow;		@Override	public void hunt() {		System.out.println("I get " + arrow.getArrow() + " to hunt.");	}		//set注入一支箭	public void setArrow(Arrow arrow) {		this.arrow = arrow;	}}

    MainTest類:

package iocdi;import org.springframework.context.applicationContext;import org.springframework.context.support.ClassPathxmlApplicationContext;/** * @author ForeverLover */public class MainTest {	public static void main(String[] args) {		ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");		System.out.println("-----------------setter注入-----------------");		Person p = ac.getBean("PersonImpl",PersonImpl.class);		p.hunt();	}}

    看到測試類會有疑問,ApplicationContext.xml從哪兒冒出來的,這里要說的就是Spring容器幫助我們去創建實例對象bean,在進程啟動時,Spring容器會自動加載此配置文件,解析通過配置文件配置的bean并創建對應類的實例,被調用者使用指定方式注入到調用者中,從而控制反轉和依賴注入。ApplicationContext.xml配置文件內容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xmlns:tx="http://www.springframework.org/schema/tx"	xmlns:aop="http://www.springframework.org/schema/aop"	xsi:schemaLocation="	http://www.springframework.org/schema/beans 	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd	http://www.springframework.org/schema/tx	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd	http://www.springframework.org/schema/aop 	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">		<bean id="ArrowImpl" class="iocdi.ArrowImpl"/>		<bean id="PersonImpl" class="iocdi.PersonImpl">		<!-- setter注入 -->		<property name="arrow" ref="ArrowImpl"/>	</bean>	</beans>

    所有工作都完成了,然后從測試類MainTest的main方法執行一下,從控制臺可以看到結果,是OK的:

    

  • 構造注入

  setter注入講完了,現在我們來聊聊構造注入了,所謂構造注入就是在實例化對象的時候就把參數傳給這個對象,我們知道對于JavaBean都必須有構造器,最少有一個無參構造器,到這我們可以繼續下面的構造注入,與setter注入不同之處在于,PersonImpl獲得ArrowImpl實例的方法,接口Arrow和Person不變,ArrowImpl類也不變,我們修改一下PersonImpl類和ApplicationContext.xml文件:

    修改后的PersonImpl類:

package iocdi;public class PersonImpl implements Person {	private Arrow arrow;		public PersonImpl() {}		public PersonImpl(Arrow arrow) {		this.arrow = arrow;	}		@Override	public void hunt() {		System.out.println("I get " + arrow.getArrow() + " to hunt.");	}	}

    修改后的ApplicationContext.xml文件:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xmlns:tx="http://www.springframework.org/schema/tx"	xmlns:aop="http://www.springframework.org/schema/aop"	xsi:schemaLocation="	http://www.springframework.org/schema/beans 	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd	http://www.springframework.org/schema/tx	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd	http://www.springframework.org/schema/aop 	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">		<bean id="ArrowImpl" class="iocdi.ArrowImpl"/>		<bean id="PersonImpl" class="iocdi.PersonImpl">		<!-- 構造注入 -->		<constructor-arg ref="ArrowImpl"/>	</bean>	</beans>

    然后再次運行一下MainTest測試類,看結果,仍然可行:

    

  • 接口注入

  不同于setter注入和構造注入,接口注入無需在xml文件里配置bean,而利用Java反射創建實現接口類的實例。

    讓我們來修改一下MainTest測試類和PersonImpl類:

    修改的PersonImpl類:

package iocdi;public class PersonImpl implements Person {	private Arrow arrow;		@Override	public void hunt() {		try {			Object obj = Class.forName("iocdi.ArrowImpl").newInstance();			arrow = (Arrow) obj;			System.out.println("I get " + arrow.getArrow() + " to hunt.");		} catch (InstantiationException e) {			e.printStackTrace();		} catch (IllegalaccessException e) {			e.printStackTrace();		} catch (ClassNotFoundException e) {			e.printStackTrace();		}	}	}

    修改的MainTest類:

package iocdi;/** * @author ForeverLover */public class MainTest {	public static void main(String[] args) {		try {			Object obj = Class.forName("iocdi.PersonImpl").newInstance();			Person p = (Person) obj;			System.out.println("-----------------接口注入-----------------");			p.hunt();		} catch (InstantiationException e) {			e.printStackTrace();		} catch (IllegalAccessException e) {			e.printStackTrace();		} catch (ClassNotFoundException e) {			e.printStackTrace();		}	}}

    運行一下測試類,從控制臺得出結果:

    

  • Lookup注入

  說到這順便說一下Lookup方法注入吧,對于Lookup注入需要一下幾個類:

    Arrow類

    Person抽象類

    MainTest測試類

  創建Arrow類:

package iocdi;import java.util.Random;public class Arrow {		private String arrow;	private String[] arrows = {"aaaaArrow", "bbbbArrow", "ccccArrow","ddddArrow","eeeeArrow",			"ffffArrow","ggggArrow","hhhhArrow","iiiiArrow"};		public Arrow() {		this.arrow = arrows[new Random().nextInt(9)];	}		public void getArrow() {		System.out.println("I get a " + arrow);	}	}

  創建Person類:

package iocdi;public abstract class Person {		public abstract Arrow createArrow();		public Arrow getArrow() {		return new Arrow();	}	}

  創建MainTest類:

package iocdi;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * @author ForeverLover */public class MainTest {	public static void main(String[] args) {		ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");		Person p = ac.getBean("Person", Person.class);		Arrow arrow1 = p.getArrow();		Arrow arrow2 = p.getArrow();		System.out.println(arrow1.equals(arrow2));		System.out.println("------------I am a dividing line------------");		Arrow arrow3 = p.createArrow();		Arrow arrow4 = p.createArrow();		System.out.println(arrow3.equals(arrow4));	}}

  修改ApplicationContext.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xmlns:tx="http://www.springframework.org/schema/tx"	xmlns:aop="http://www.springframework.org/schema/aop"	xsi:schemaLocation="	http://www.springframework.org/schema/beans 	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd	http://www.springframework.org/schema/tx	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd	http://www.springframework.org/schema/aop 	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">		<bean id="Arrow" class="iocdi.Arrow"/>	    <bean id="Person" class="iocdi.Person">        <lookup-method name="createArrow" bean="Arrow" />    </bean>	</beans>

  最后測試一下,控制臺查看一下:

  

  先說一下,分隔線前面之所以會輸出false是因為創建的兩個對象的引用不同,雖然這里打印出來是eeeeArrow和ddddArrow結果確實不同,因為是隨機的,即便有可能結果相同,兩個對象的引用也不相同。但是分隔線下面無論如何創建的兩個對象的引用相同。大家也可能會疑惑,為什么在配置文件里配置的抽象類也可以實例化對象,并且抽象類中的抽象方法createArrow()并沒具體實現卻可以創建Arrow實例,這里就跟Spring容器有關,其具體實現了abstarct類,如果createArrow()不是抽象方法,那abstract實現類也會覆蓋這個方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品黄色网| 欧美日韩国产黄| 国产精品偷伦一区二区| 国产啪精品视频网站| 国产视频精品xxxx| 成人高清视频观看www| 丝袜亚洲欧美日韩综合| 日本韩国欧美精品大片卡二| 精品久久在线播放| 国产乱肥老妇国产一区二| 中文字幕成人在线| 精品国产一区二区三区久久狼黑人| 少妇高潮久久77777| 精品国模在线视频| 欧美日韩国产一区二区三区| 搡老女人一区二区三区视频tv| 亚洲精品av在线| 26uuu日韩精品一区二区| 永久免费精品影视网站| 国产成人精品在线观看| 欧美大片在线影院| 亚洲字幕在线观看| 国产成人精品在线视频| 色综合影院在线| 欧美日韩国产精品一区二区不卡中文| 国产欧美精品va在线观看| 91精品国产成人www| 成人久久一区二区| 亚洲精品在线看| 中文字幕一区日韩电影| 亚洲精品成人久久电影| 亚洲欧美在线第一页| 国产aⅴ夜夜欢一区二区三区| 亚洲综合中文字幕68页| 黑人巨大精品欧美一区二区一视频| 亚洲综合色av| 久久全国免费视频| 黑人巨大精品欧美一区二区三区| 日韩电影视频免费| 精品久久久久久亚洲国产300| 亚洲人成电影网站色| 成人国内精品久久久久一区| 亚洲免费中文字幕| 久久久久久久久久婷婷| 国产一区二区美女视频| 成人激情电影一区二区| 欧美视频免费在线| 亚洲人成绝费网站色www| 欧美电影在线免费观看网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 在线成人免费网站| 一本色道久久88精品综合| 欧美壮男野外gaytube| 日韩最新av在线| 韩国美女主播一区| 久久99精品视频一区97| 久久黄色av网站| 国产91久久婷婷一区二区| 国产精品xxxxx| 亚洲综合色av| 亚洲激情久久久| 欧美午夜www高清视频| 久久香蕉国产线看观看av| 日韩中文字幕在线精品| 精品综合久久久久久97| 亚洲2020天天堂在线观看| www.日韩不卡电影av| 欧美日韩aaaa| 国产免费久久av| 一本大道久久加勒比香蕉| 国产精品视频白浆免费视频| 91亚洲国产精品| 亚洲无av在线中文字幕| 亚洲激情视频在线播放| 国产精品网站视频| 奇米成人av国产一区二区三区| 国产一区二区三区18| 亚洲精品wwww| 国产视频丨精品|在线观看| 亚洲高清在线观看| 国产97在线观看| 插插插亚洲综合网| 欧美激情一级欧美精品| 91香蕉国产在线观看| 亚洲精品视频网上网址在线观看| 欧美另类在线观看| 91国产美女在线观看| 成人免费激情视频| 欧美视频一区二区三区…| 日韩天堂在线视频| 日韩精品在线观看一区二区| 国产亚洲一区精品| 亚洲欧美国产精品va在线观看| 国内精品久久久久伊人av| 日韩av成人在线| www.久久草.com| 欧美电影在线播放| 国内精久久久久久久久久人| 色yeye香蕉凹凸一区二区av| 久久综合免费视频影院| 综合av色偷偷网| 欧美精品videosex性欧美| xvideos国产精品| 中文字幕亚洲无线码在线一区| 日韩有码在线观看| 国产精品免费网站| 性欧美视频videos6一9| 在线看福利67194| 精品香蕉在线观看视频一| 最近2019好看的中文字幕免费| 亚洲伊人成综合成人网| 欧美极品少妇与黑人| 亚洲第一男人av| 久久中文字幕在线视频| 国产成人在线一区二区| 日韩在线资源网| 亚洲精品美女网站| 亚洲精品女av网站| 欧美性猛交xxxxx免费看| 欧美日韩裸体免费视频| 国产一区二区三区丝袜| 日韩精品欧美激情| 久久免费国产视频| 欧美黑人一区二区三区| 日韩中文在线不卡| 国产精品精品一区二区三区午夜版| 精品久久久久久亚洲国产300| 国产视频在线观看一区二区| 亚洲丝袜av一区| 好吊成人免视频| 日韩在线观看免费网站| 欧美在线亚洲在线| 国产精品久久久久久久av大片| 美女精品久久久| 国产精品视频免费在线| 亚洲国产精品99久久| 成人激情视频小说免费下载| 国产精欧美一区二区三区| 久久亚洲精品小早川怜子66| 亚洲国产精品久久久久久| 97超级碰碰人国产在线观看| 8050国产精品久久久久久| 91sao在线观看国产| 国产日产亚洲精品| 亚洲国产成人91精品| 久久久在线视频| 日韩中文字幕视频| 成人激情视频网| 精品人伦一区二区三区蜜桃免费| 精品久久久久久久久久| 777777777亚洲妇女| 九九热视频这里只有精品| 精品美女久久久久久免费| 久久久久中文字幕| 午夜伦理精品一区| 中文字幕v亚洲ⅴv天堂| 国产大片精品免费永久看nba| 亚洲精品久久久久久久久久久久久| 视频直播国产精品| 国产精自产拍久久久久久蜜| 亚洲欧美一区二区激情| 久久噜噜噜精品国产亚洲综合| 中文字幕欧美日韩在线| 最新国产成人av网站网址麻豆|