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

spring中ioc是什么

 更新時(shí)間:2017年09月18日 10:31:46   投稿:mrr  
IoC是一種讓服務(wù)消費(fèi)者不直接依賴于服務(wù)提供者的組件設(shè)計(jì)方式,是一種減少類與類之間依賴的設(shè)計(jì)原則。下面通過(guò)本文給大家分享spring中ioc的概念,感興趣的朋友一起看看吧

IoC——Inversion of Control,控制反轉(zhuǎn)

在Java開(kāi)發(fā)中,IoC意味著將你設(shè)計(jì)好的類交給系統(tǒng)去控制,而不是在你的類內(nèi)部控制。IoC是一種讓服務(wù)消費(fèi)者不直接依賴于服務(wù)提供者的組件設(shè)計(jì)方式,是一種減少類與類之間依賴的設(shè)計(jì)原則。 

DI——Dependency Injection(依賴注入)

即組件之間的依賴關(guān)系由容器在運(yùn)行期決定,形象的來(lái)說(shuō),即由容器動(dòng)態(tài)的將某種依賴關(guān)系注入到組件之中。
依賴注入的目標(biāo)并非為軟件系統(tǒng)帶來(lái)更多的功能,而是為了提升組件重用的概率,并為系統(tǒng)搭建一個(gè)靈活、可擴(kuò)展的平臺(tái)。通過(guò)依賴注入機(jī)制,我們只需要通過(guò)簡(jiǎn)單的配置,而無(wú)需任何代碼就可指定目標(biāo)需要的資源,完成自身的業(yè)務(wù) 邏輯,而不用關(guān)心具體的資源來(lái)自何處、由誰(shuí)實(shí)現(xiàn)。

1:控制反轉(zhuǎn):

誰(shuí)控制誰(shuí)?控制什么?為何叫反轉(zhuǎn)(對(duì)應(yīng)于正向)?哪些方面反轉(zhuǎn)了 ?為何需要反轉(zhuǎn)?

2:依賴:

什么是依賴(按名詞理解,按動(dòng)詞理解)?誰(shuí)依賴于誰(shuí)?為什么需要依賴?依賴什么東西?

3:注入:

誰(shuí)注入于誰(shuí)?注入什么東西?為何要注入?

4:依賴注入和控制反轉(zhuǎn)是同一概念嗎?

5:參與者都有哪些?

6:IoC/DI是什么?能做什么?怎么做?用在什么地方?

還不能完全回答和理解,沒(méi)有關(guān)系,先來(lái)看看IoC/DI的基本思想演變,然后再回頭來(lái)回答這些問(wèn)題



IoC容器

簡(jiǎn)單的理解就是:實(shí)現(xiàn)IoC思想,并提供對(duì)象創(chuàng)建、對(duì)象裝配以及對(duì)象生命周期管理的軟件就是IoC容器。

IoC理解

1:應(yīng)用程序無(wú)需主動(dòng)new對(duì)象;而是描述對(duì)象應(yīng)該如何被創(chuàng)建即可

IoC容器幫你創(chuàng)建,即被動(dòng)實(shí)例化;

2:應(yīng)用程序不需要主動(dòng)裝配對(duì)象之間的依賴關(guān)系,而是描述需要哪個(gè)服務(wù)

IoC容器會(huì)幫你裝配(即負(fù)責(zé)將它們關(guān)聯(lián)在一起),被動(dòng)接受裝配;

3:主動(dòng)變被動(dòng),體現(xiàn)好萊塢法則:別打電話給我們,我們會(huì)打給你

4:體現(xiàn)迪米特法則(最少知識(shí)原則):應(yīng)用程序不知道依賴的具體實(shí)現(xiàn),只知道需要提供某類服務(wù)的對(duì)象(面向接口編程);并松散耦合,一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解,不和陌生人(實(shí)現(xiàn))說(shuō)話

5:是一種讓服務(wù)消費(fèi)者不直接依賴于服務(wù)提供者的組件設(shè)計(jì)方式,是一種減少類與類之間依賴的設(shè)計(jì)原則。

使用IoC/DI容器開(kāi)發(fā)需要改變的思路

1:應(yīng)用程序不主動(dòng)創(chuàng)建對(duì)象,但要描述創(chuàng)建它們的方式。

2:在應(yīng)用程序代碼中不直接進(jìn)行服務(wù)的裝配,但要描述哪一個(gè)組件需要哪一項(xiàng)服務(wù),由容器負(fù)責(zé)將這些裝配在一起。

也就是說(shuō):所有的組件都是被動(dòng)的,組件初始化和裝配都由容器負(fù)責(zé),應(yīng)用程序只是在獲取相應(yīng)的組件后,實(shí)現(xiàn)應(yīng)用的功能即可。 

提醒一點(diǎn)

IoC/DI是思想,不是純實(shí)現(xiàn)技術(shù)。IoC是框架共性,只是控制權(quán)的轉(zhuǎn)移,轉(zhuǎn)移到框架,所以不能因?yàn)閷?shí)現(xiàn)了IoC就叫IoC容器,而一般除了實(shí)現(xiàn)了IoC外,還具有DI功能的才叫IoC容器,因?yàn)槿萜鞒艘?fù)責(zé)創(chuàng)建并裝配組件關(guān)系,還需要管理組件生命周期。

n工具準(zhǔn)備

1:Eclipse + Jdk6.0 ,示例用的Eclipse是Eclipse Java EE IDE for Web Developers,Version: Helios Service Release 1

2:spring-framework-3.1.0.M2-with-docs.zip

構(gòu)建環(huán)境

1:在Eclipse里面新建一個(gè)工程,設(shè)若名稱是Spring3test

2:把發(fā)行包里面的dist下面的jar包都添加到Eclipse里面

3:根據(jù)Spring的工程來(lái)獲取Spring需要的依賴包,在聯(lián)網(wǎng)的情況下,通過(guò)Ant運(yùn)行projects/build-spring-framework/build.xml,會(huì)自動(dòng)去下載所需要的jar包,下載后的包位于projects/ivy-cache/repository下面。

4:為了方便,把這些jar包也添加到Eclipse里面

開(kāi)發(fā)接口

java代碼:

public interface HelloApi { 
public String helloSpring3(int a); 
}

開(kāi)發(fā)實(shí)現(xiàn)類

java代碼:

public class HelloImpl implements HelloApi{ 
public String helloSpring3(int a){ 
System.out.println("hello Spring3==="+a); 
return "Ok,a="+a; 
} 
} 

配置文件

1:在src下面新建一個(gè)文件叫applicationContext.xml

2:在Spring發(fā)行包里面搜索一個(gè)例子,比如使用:projects\org.springframework.context\src\test\java\org\springframework\jmx下的applicationContext.xml,先把里面的配置都刪掉,留下基本的xml定義和根元素就可以了,它是一個(gè)DTD版的,而且還是2.0版的。

建議使用Spring3的Schema版本,示例如下:  

java代碼:

<?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:context="http://www.springframework.org/schema/context" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation=" 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
"> 
……………………… 
</beans> 

4:配置applicationContext.xml如下:

java代碼:

<bean name="helloBean" class="com.bjpowernode.Spring3.hello.HelloImpl"></bean> 

編寫(xiě)客戶端如下:

java代碼:

package com.bjpowernode.Spring3.hello;  
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
public class Client { 
public static void main(String[] args) { 
ApplicationContext context = new ClassPathXmlApplicationContext( 
 new String[] {"applicationContext.xml"}); 
HelloApi api = (HelloApi)context.getBean("helloBean"); 
String s = api.helloSpring3(3); 
System.out.println("the s="+s); 
} 
} 

審視和結(jié)論

1:所有代碼中(除測(cè)試代碼之外),并沒(méi)有出現(xiàn)Spring的任何組件 。

2:客戶代碼(這里就是我們的測(cè)試代碼)僅僅面向接口編程,而無(wú)需知道實(shí)現(xiàn)類的具體名稱。同時(shí),我們可以很簡(jiǎn)單的通過(guò)修改配置文件來(lái)切換具體的底層實(shí)現(xiàn)類 。 

結(jié)論

1:首先,我們的組件并不需要實(shí)現(xiàn)框架指定的接口,因此可以輕松的將組件從Spring脫離,甚至不需要任何修改(這在基于EJB架實(shí)現(xiàn)的應(yīng)用中是難以想象的)。

2:其次,組件間的依賴關(guān)系減少,極大改善了代碼的可重用性和可維護(hù)性

3:面向接口編程

什么是Spring中的Bean

在Spring中,那些組成應(yīng)用的主體及由Spring IoC容器所管理的對(duì)象被稱之為bean。簡(jiǎn)單地講,bean就是由Spring容器初始化、裝配及被管理的對(duì)象,除此之外,bean就沒(méi)有特別之處了(與應(yīng)用中的其他對(duì)象沒(méi)有什么區(qū)別)。而bean定義以及bean相互間的依賴關(guān)系將通過(guò)配置元數(shù)據(jù)來(lái)描述。

為什么使用Bean這個(gè)名字

使用‘bean'這個(gè)名字而不是‘組件'(component) 或‘對(duì)象'(object)的動(dòng)機(jī)源于Spring框架本身(部分原因則是相對(duì)于復(fù)雜的EJB而言的)。

Spring的IoC容器

org.springframework.beans.factory.BeanFactory是Spring IoC容器的實(shí)際代表者,IoC容器負(fù)責(zé)容納bean,并對(duì)bean進(jìn)行管理。

Spring IoC容器將讀取配置元數(shù)據(jù);并通過(guò)它對(duì)應(yīng)用中各個(gè)對(duì)象進(jìn)行實(shí)例化、配置以及組裝。通常情況下我們使用簡(jiǎn)單直觀的XML來(lái)作為配置元數(shù)據(jù)的描述格式。在XML配置元數(shù)據(jù)中我們可以對(duì)那些我們希望通過(guò)Spring IoC容器管理的bean進(jìn)行定義。

IoC/DI是Spring最核心的功能之一, Spring框架所提供的眾多功能之所以能成為一個(gè)整體正是建立在IoC的基礎(chǔ)之上

BeanFactory和ApplicationContext

org.springframework.beans及org.springframework.context包是Spring IoC容器的基礎(chǔ)。BeanFactory提供的高級(jí)配置機(jī)制,使得管理任何性質(zhì)的對(duì)象成為可能。 ApplicationContext是BeanFactory的擴(kuò)展,功能得到了進(jìn)一步增強(qiáng),比如更易與Spring AOP集成、消息資源處理(國(guó)際化處理)、事件傳遞及各種不同應(yīng)用層的context實(shí)現(xiàn)(如針對(duì)web應(yīng)用的WebApplicationContext)。

接口選擇之惑

在實(shí)際應(yīng)用中,用戶有時(shí)候不知道到底是選擇BeanFactory接口還是ApplicationContext接口。但是通常在構(gòu)建JavaEE應(yīng)用時(shí),使用ApplicationContext將是更好的選擇,因?yàn)樗粌H提供了BeanFactory的所有特性,同時(shí)也允許使用更多的聲明方式來(lái)得到我們想要的功能。

簡(jiǎn)而言之,BeanFactory提供了配制框架及基本功能,而ApplicationContext則增加了更 多支持企業(yè)核心內(nèi)容的功能。ApplicationContext完全由BeanFactory擴(kuò)展而來(lái),因而B(niǎo)eanFactory所具備的能力和行為也適用于ApplicationContext。

Spring IoC容器的實(shí)例化非常簡(jiǎn)單,如下面的例子:

1:第一種:

java代碼:

Resource resource = new FileSystemResource("beans.xml"); 
BeanFactory factory = new XmlBeanFactory(resource); 

2:第二種:

java代碼:

ClassPathResource resource = new ClassPathResource("beans.xml"); 
BeanFactory factory = new XmlBeanFactory(resource); 

3:第三種:

java代碼:

ApplicationContext context = new ClassPathXmlApplicationContext( 
 new String[] {"applicationContext.xml", "applicationContext-part2.xml"}); 
// of course, an ApplicationContext is just a BeanFactory 
BeanFactory factory = (BeanFactory) context; 

讀取多個(gè)配置文件

第一種方法:

為了加載多個(gè)XML文件生成一個(gè)ApplicationContext實(shí)例,可以將文件路徑作為字符串?dāng)?shù)組傳給ApplicationContext構(gòu)造器。而bean factory將通過(guò)調(diào)用bean defintion reader從多個(gè)文件中讀取bean定義。通常情況下,Spring團(tuán)隊(duì)傾向于上述做法,因?yàn)檫@樣各個(gè)配置并不會(huì)查覺(jué)到它們與其他配置文件的組合。

第二種方法:

使用一個(gè)或多個(gè)的<import/>元素來(lái)從另外一個(gè)或多個(gè)文件加載bean定義。所有的<import/>元素必須放在<bean/>元素之前以完成bean定義的導(dǎo)入。 讓我們看個(gè)例子:

java代碼:

<beans><import resource="services.xml"/> 
 <import resource=“/resources/messageSource.xml"/> 
 <import resource="/resources/themeSource.xml"/> 
 <bean id="bean1" class="..."/> 
 <bean id="bean2" class="..."/> 
 </beans> 

配置文件中常見(jiàn)的配置內(nèi)容

在IoC容器內(nèi)部,bean的定義由BeanDefinition 對(duì)象來(lái)表示,該定義將包含以下信息:

1:全限定類名:這通常就是已定義bean的實(shí)際實(shí)現(xiàn)類。如果通過(guò)調(diào)用static factory方法來(lái)實(shí)例化bean,而不是使用常規(guī)的構(gòu)造器,那么類名稱實(shí)際上就是工廠類的類名。

2:bean行為的定義,即創(chuàng)建模式(prototype還是singleton)、自動(dòng)裝配模式、依賴檢查模式、初始化以及銷毀方法。這些定義將決定bean在容器中的行為。

3:用于創(chuàng)建bean實(shí)例的構(gòu)造器參數(shù)及屬性值。比如使用bean來(lái)定義連接池,可以通過(guò)屬性或者構(gòu)造參數(shù)指定連接數(shù),以及連接池大小限制等。

4:bean之間的關(guān)系,即協(xié)作 (或者稱依賴)。

Bean的命名

每個(gè)bean都有一個(gè)或多個(gè)id(或稱之為標(biāo)識(shí)符或名稱,在術(shù)語(yǔ)上可以理解成一回事),這些id在當(dāng)前IoC容器中必須唯一。

當(dāng)然也可以為每個(gè)bean定義一個(gè)name,但是并不是必須的,如果沒(méi)有指定,那么容器將為其生成一個(gè)惟一的name。對(duì)于不指定name屬性的原因我們會(huì)在后面介紹(比如內(nèi)部bean就不需要)。

Bean命名的約定

bean的命名采用標(biāo)準(zhǔn)的Java命名約定,即小寫(xiě)字母開(kāi)頭,首字母大寫(xiě)間隔的命名方式。如accountManager、 accountService等等。

對(duì)bean采用統(tǒng)一的命名約定將會(huì)使配置更加簡(jiǎn)單易懂。而且在使用Spring AOP,這種簡(jiǎn)單的命名方式將會(huì)令你受益匪淺。

Bean的別名

一個(gè)Bean要提供多個(gè)名稱,可以通過(guò)alias屬性來(lái)加以指定 ,示例如下:

<alias name="fromName" alias="toName"/>

容器如何實(shí)例化Bean

當(dāng)采用XML描述配置元數(shù)據(jù)時(shí),將通過(guò)<bean/>元素的class屬性來(lái)指定實(shí)例化對(duì)象的類型。class屬性主要有兩種用途:在大多數(shù)情況下,容器將直接通過(guò) 反射調(diào) 用指定類的構(gòu)造器來(lái)創(chuàng)建bean(這有點(diǎn)等類似于在Java代碼中使用new操作符);在極少數(shù)情況下,容器將調(diào)用類的靜態(tài)工廠方法來(lái)創(chuàng)建bean實(shí)例,class屬性將用來(lái)指定實(shí)際具有靜態(tài)工廠方法的類(至于調(diào)用靜態(tài)工廠方法創(chuàng)建的對(duì)象類型是當(dāng)前class還是其他的class則無(wú)關(guān)緊要)。

用構(gòu)造器來(lái)實(shí)例化Bean ,前面的實(shí)例就是

使用靜態(tài)工廠方法實(shí)例化

采用靜態(tài)工廠方法創(chuàng)建bean時(shí),除了需要指定class屬性外,還需要通過(guò)factory-method屬性來(lái)指定創(chuàng)建bean實(shí)例的工廠方法,示例如下:

<bean id="exampleBean"
 class="examples.ExampleBean2"
 factory-method="createInstance"/>

使用實(shí)例工廠方法實(shí)例化

使用此機(jī)制,class屬性必須為空,而factory-bean屬性必須指定為當(dāng)前(或其祖先)容器中包含工廠方法的bean的名稱,而該工廠bean的工廠方法本身必須通過(guò)factory-method屬性來(lái)設(shè)定,并且這個(gè)方法不能是靜態(tài)的,示例如下:

<bean id="exampleBean" factory-bean="myFactoryBean" factory-method="createInstance"/>

使用容器

從本質(zhì)上講,BeanFactory僅僅只是一個(gè)維護(hù)bean定義以及相互依賴關(guān)系的高級(jí)工廠接口。使用getBean(String)方法就可以取得bean的實(shí)例;BeanFactory提供的方法極其簡(jiǎn)單。n依賴注入(DI) 背后的基本原理
是對(duì)象之間的依賴關(guān)系(即一起工作的其它對(duì)象)只會(huì)通過(guò)以下幾種方式來(lái)實(shí)現(xiàn): 構(gòu)造器的參數(shù)、 工廠方法的參數(shù),或 給由構(gòu)造函數(shù)或者工廠方法創(chuàng)建的對(duì)象設(shè) 置屬性。

因此,容器的工作就是創(chuàng)建bean時(shí)注入那些依賴關(guān)系。相對(duì)于由bean自己來(lái)控制其實(shí)例化、直接在構(gòu)造器中指定依賴關(guān)系或則類似服務(wù)定位器(Service Locator)模式這3種自主控制依賴關(guān)系注入的方法來(lái)說(shuō),控制從根本上發(fā)生了倒轉(zhuǎn),這也正是控制反轉(zhuǎn)IoC名字的由來(lái)。

應(yīng)用依賴注入(DI)的好處、

應(yīng)用DI原則后,代碼將更加清晰。而且當(dāng)bean自己不再擔(dān)心對(duì)象之間的依賴關(guān)系(以及在何時(shí)何地指定這種依賴關(guān)系和依賴的實(shí)際類是什么)之后,實(shí)現(xiàn)更高層次的 松耦合將易如反掌。
依賴注入(DI)基本的實(shí)現(xiàn)方式

DI主要有兩種注入方式,即 Setter注入和 構(gòu)造器注入。

通過(guò)調(diào)用無(wú)參構(gòu)造器或無(wú)參static工廠方法實(shí)例化bean之后,調(diào)用該bean的setter方法,即可實(shí)現(xiàn)基于setter的DI。 示例如下:

示例——Java類

java代碼:

public class HelloImpl implements HelloApi{ 
private String name = ""; 
public void setName(String name){ 
this.name = name; 
} 
public String helloSpring3(int a){ 
System.out.println("hello Spring3==="+a+",name="+name); 
return "Ok,a="+a; 
} 
} 

示例——配置文件

<bean name="helloBean" class="com.bjpowernode.Spring3.hello.HelloImpl">
<property name="name"><value>bjpowernode Spring3</value></property>
</bean>

示例——Java類

java代碼:

public class HelloImpl implements HelloApi{ 
private String name = ""; 
public HelloImpl(String name){ 
this.name = name; 
} 
public String helloSpring3(int a){ 
System.out.println("hello Spring3==="+a+",name="+name); 
return "Ok,a="+a; 
} 
} 

示例——配置文件

java代碼:

<bean name="helloBean" class="com.bjpowernode.Spring3.hello.HelloImpl"> 
<constructor-arg><value>bjpowernode Spring3</value></constructor-arg> 
</bean> 

默認(rèn)解析方式

構(gòu)造器參數(shù)將根據(jù)類型來(lái)進(jìn)行匹配。如果bean定義中的構(gòu)造器參數(shù)類型明確,那么bean定義中的參數(shù)順序就是對(duì)應(yīng)構(gòu)造器參數(shù)的順序

構(gòu)造器參數(shù)類型匹配

可以使用type屬性來(lái)顯式的指定參數(shù)所對(duì)應(yīng)的簡(jiǎn)單類型。例如:

java代碼:

<bean id="exampleBean" class="examples.ExampleBean"> 
<constructor-arg type="int" value="7500000"/> 
<constructor-arg type="java.lang.String" value="42"/> 
</bean> 

構(gòu)造器參數(shù)的索引

使用index屬性可以顯式的指定構(gòu)造器參數(shù)出現(xiàn)順序。例如:

java代碼:

<bean id="exampleBean" class="examples.ExampleBean"> 
<constructor-arg index="0" value="7500000"/> 
<constructor-arg index="1" value="42"/> 
</bean> 

構(gòu)造器參數(shù)的名稱

在Spring3里面,可以使用構(gòu)造器參數(shù)的名稱來(lái)直接賦值。例如:

java代碼:

<bean id="exampleBean" class="examples.ExampleBean"> 
<constructor-arg name="years" value="7500000"/> 
<constructor-arg name="ultimateanswer" value="42"/> 
</bean> 

直接量(基本類型、Strings類型等)

<value/>元素通過(guò)字符串來(lái)指定屬性或構(gòu)造器參數(shù)的值。JavaBean屬性編輯器將把字符串從java.lang.String類型轉(zhuǎn)化為實(shí)際的屬性或參數(shù)類型。示例:

java代碼:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
<property name="driverClassName"> 
<value>oracle.jdbc.driver.OracleDriver</value> 
</property> 
<property name="url"> 
<value>jdbc:oracle:thin:@localhost:1521:orcl</value>
</property> 
<property name="username"> <value>test</value> </property> 
<property name="password" value=“test"/> 
</bean> 

Value可以做為子元素或者是屬性使用。

nidref元素

idref元素用來(lái)將容器內(nèi)其它bean的id傳給<constructor-arg/> 或 <property/>元素,同時(shí)提供錯(cuò)誤驗(yàn)證功能。 idref元素和<value>差不多,只是傳遞 一個(gè)字符串,用來(lái)方便xml檢查。示例如下:

java代碼:

<bean id="theTargetBean" class="..."/> 
<bean id="theClientBean" class="..."> 
<property name="targetName"> <idref bean="theTargetBean" /> </property> 
</bean> 
上述bean定義片段完全地等同于(在運(yùn)行時(shí))以下的片段 
<bean id="theTargetBean" class="..."/> 
<bean id="client" class="..."> 
<property name="targetName"> <value>theTargetBean</value> </property> 
</bean> 

idref元素 續(xù)

第一種形式比第二種更可取的主要原因是,使用idref標(biāo)記允許容器在部署時(shí) 驗(yàn)證所被引用的bean是否存在。而第二種方式中,傳給client bean的targetName屬性值并沒(méi)有被驗(yàn)證。任何的輸入錯(cuò)誤僅在client bean實(shí)際實(shí)例化時(shí)才會(huì)被發(fā)現(xiàn)(可能伴隨著致命的錯(cuò)誤)。如果client bean 是prototype類型的bean,則此輸入錯(cuò)誤(及由此導(dǎo)致的異常)可能在容器部署很久以后才會(huì)被發(fā)現(xiàn)。

如果被引用的bean在同一XML文件內(nèi),且bean名字就是bean id,那么可以使用local屬性,此屬性允許XML解析器在解析XML文件時(shí)來(lái)對(duì)引用的bean進(jìn)行驗(yàn)證 ,示例如下:

<property name="targetName">
<idref local="theTargetBean"/>
</property>

引用其它的bean(協(xié)作者) ——ref元素

盡管都是對(duì)另外一個(gè)對(duì)象的引用,但是通過(guò)id/name指向另外一個(gè)對(duì)象卻有三種不同的形式,不同的形式將決定如何處理作用域及驗(yàn)證。

1:第一種形式也是最常見(jiàn)的形式是使用<ref/>標(biāo)記指定目標(biāo)bean,示例:

<ref bean=“someBean”/> 

2:第二種形式是使用ref的local屬性指定目標(biāo)bean,它可以利用XML解析器來(lái)驗(yàn)證所引用的bean是否存在同一文件中。示例:

<ref local="someBean"/>

3:第三種方式是通過(guò)使用ref的parent屬性來(lái)引用當(dāng)前容器的父容器中的bean,并不常用。示例:

java代碼:

<bean id="accountService" class="com.foo.SimpleAccountService"> </bean> 
<bean id=“accountService” <-- 注意這里的名字和parent的名字是一樣的--> class="org.springframework.aop.framework.ProxyFactoryBean"> 
 <property name="target"><ref parent="accountService"/> </property> 
</bean> 

內(nèi)部Bean

所謂的內(nèi)部bean(inner bean)是指在一個(gè)bean的<property/>或 <constructor-arg/>元素中使用<bean/>元素定義的bean。內(nèi)部bean定義不需要有id或name屬性,即使指定id 或 name屬性值也將會(huì)被容器忽略。示例:

java代碼:

<bean id="outer" class="..."> 
<property name="target"> 
<bean class="com.mycompany.Person"> 
<property name="name" value="Fiona Apple"/> 
<property name="age" value="25"/> 
</bean> 
</property> 
</bean> 

相關(guān)文章

  • 基于Java實(shí)現(xiàn)的Dijkstra算法示例

    基于Java實(shí)現(xiàn)的Dijkstra算法示例

    這篇文章主要介紹了基于Java實(shí)現(xiàn)的Dijkstra算法示例,一個(gè)比較典型的算法示例,需要的朋友可以參考下
    2014-07-07
  • App登陸java后臺(tái)處理和用戶權(quán)限驗(yàn)證

    App登陸java后臺(tái)處理和用戶權(quán)限驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了App登陸java后臺(tái)處理和用戶權(quán)限驗(yàn)證,感興趣的朋友可以參考一下
    2016-06-06
  • Java編程之jdk1.4,jdk1.5和jdk1.6的區(qū)別分析(經(jīng)典)

    Java編程之jdk1.4,jdk1.5和jdk1.6的區(qū)別分析(經(jīng)典)

    這篇文章主要介紹了Java編程之jdk1.4,jdk1.5和jdk1.6的區(qū)別分析,結(jié)合實(shí)例形式較為詳細(xì)的分析說(shuō)明了jdk1.4,jdk1.5和jdk1.6版本的使用區(qū)別,需要的朋友可以參考下
    2015-12-12
  • java?hutool工具類處理JSON的使用方法

    java?hutool工具類處理JSON的使用方法

    hutool是一個(gè)java基礎(chǔ)工具類,該工具類經(jīng)過(guò)長(zhǎng)期的發(fā)展,API已經(jīng)非常齊全,下面這篇文章主要給大家介紹了關(guān)于java?hutool工具類處理JSON的使用方法,需要的朋友可以參考下
    2024-04-04
  • 使用@TransactionalEventListener監(jiān)聽(tīng)事務(wù)教程

    使用@TransactionalEventListener監(jiān)聽(tīng)事務(wù)教程

    這篇文章主要介紹了使用@TransactionalEventListener監(jiān)聽(tīng)事務(wù)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • jstl標(biāo)簽基礎(chǔ)開(kāi)發(fā)步驟(詳解)

    jstl標(biāo)簽基礎(chǔ)開(kāi)發(fā)步驟(詳解)

    下面小編就為大家?guī)?lái)一篇jstl標(biāo)簽基礎(chǔ)開(kāi)發(fā)步驟(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java中 this和super的用法與區(qū)別小結(jié)

    Java中 this和super的用法與區(qū)別小結(jié)

    在Java的學(xué)習(xí)與開(kāi)發(fā)者我們經(jīng)常遇到this和super關(guān)鍵字,本文主要介紹了Java中 this和super的用法與區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • java中的i++和++i的區(qū)別詳解

    java中的i++和++i的區(qū)別詳解

    這篇文章主要介紹了java中的i++和++i的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 關(guān)于SpringBoot大文件RestTemplate下載解決方案

    關(guān)于SpringBoot大文件RestTemplate下載解決方案

    這篇文章主要介紹了SpringBoot大文件RestTemplate下載解決方案,最近結(jié)合網(wǎng)上案例及自己總結(jié),寫(xiě)了一個(gè)分片下載tuling/fileServer項(xiàng)目,需要的朋友可以參考下
    2021-10-10
  • 教你如何在Intellij IDEA中集成Gitlab

    教你如何在Intellij IDEA中集成Gitlab

    今天來(lái)簡(jiǎn)單說(shuō)下,如何在IDEA中集成gitlab項(xiàng)目,默認(rèn)情況下IDEA中的 VCS => Checkout From Version Control 選項(xiàng)中是沒(méi)有g(shù)itlab這一項(xiàng)的,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10

最新評(píng)論