spring中depends-on與look-up的作用
depends-on的作用
depends-on的作用一般是一個bean依賴於另外一個bean,被依賴的bean一般用於一些初始化和收尾的工作
如在這個例子中,DependentBean依賴於ResourceBean,ResourceBean主要用於指定檔案路徑、開啟檔案、和關閉檔案流
而DependentBean只負責寫檔案,這樣更能體現單一職責
另外需要關注兩個bean的init和destory的執行順序
先執行被依賴bean的init方法,然後執行依賴bean的方法
先執行依賴bean的destory方法,後執行被依賴bean的destory方法
/** * * * <pre>HISTORY * **************************************************************************** * ID DATE PERSON REASON * 1 2018年1月17日 Simba.Hua Create * **************************************************************************** * </pre> * @author Simba.Hua */ public class DependentBean { private ResourceBean resourceBean; public void write(String str) throws IOException { System.out.println("DependentBean寫資源" + str); resourceBean.getFos().write(str.getBytes()); } public void init() throws IOException { System.out.println("DependentBean:初始化"); resourceBean.getFos().write("DependentBean:初始化\r\n".getBytes()); } public void destroy() throws IOException { System.out.println("DependentBean:銷燬資源"); resourceBean.getFos().write("DependentBean:銷燬資源\r\n".getBytes()); } public ResourceBean getResourceBean() { return resourceBean; } public void setResourceBean(ResourceBean resourceBean) { this.resourceBean = resourceBean; } }
package com.shux.springsource.depends.on; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * 描述:測試spring中,depends-on的作用 * * * <pre>HISTORY * **************************************************************************** * ID DATE PERSON REASON * 1 2018年1月17日 Simba.Hua Create * **************************************************************************** * </pre> * @author Simba.Hua */ public class ResourceBean { private FileOutputStream fos; private File file; public void init() { System.out.println("ResourceBean初始化"); System.out.println("ResourceBean載入資源,做一些預操作"); try { this.fos = new FileOutputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } } public void destroy() { System.out.println("ResourceBean銷燬"); System.out.println("ResourceBean釋放資源,進行一些清理操作"); try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } public FileOutputStream getFos() { return fos; } public void setFos(FileOutputStream fos) { this.fos = fos; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } }
<!-- 測試depends-on --> <bean id="resourceBean" class="com.shux.springsource.depends.on.ResourceBean" init-method="init" destroy-method="destroy"> <property name="file" value="D:/test.txt"></property> </bean> <bean id="dependentBean" class="com.shux.springsource.depends.on.DependentBean" init-method="init" destroy-method="destroy" depends-on="resourceBean"> <property name="resourceBean" ref="resourceBean"></property> </bean>
@Test
public void testDependsOn() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");
context.registerShutdownHook();
DependentBean dependentBean = context.getBean("dependentBean",DependentBean.class);
try {
dependentBean.write("hello,是我正在寫入哦\r\n");
} catch (IOException e) {
e.printStackTrace();
}
}
look-uplook-up 用於解決當一個單例的bean的屬性中存在一個prototype的屬性bean,如果用set,get注入
* 則prototype的屬性也會跟單例bean的生命週期一樣,即屬性bean只會產生一個例項bean,這不是我們想要的,
* 我們想要的是可以產生不同的例項,而look-up就是解決這一問題的,用look-up即使宿主bean是單例的,只要屬性bean是
* prototype型別的,就可以產生多個例項.
如下例子,例子來自http://jinnianshilongnian.iteye.com/blog/1415461
package com.shux.springsource.lookup;
/**
* 描述:
*
* <pre>HISTORY
* ****************************************************************************
* ID DATE PERSON REASON
* 1 2018年1月18日 Simba.Hua Create
* ****************************************************************************
* </pre>
* @author Simba.Hua
*/
public interface HelloApi {
void sayHello();
}
package com.shux.springsource.lookup;
/**
* 描述:
*
* <pre>HISTORY
* ****************************************************************************
* ID DATE PERSON REASON
* 1 2018年1月18日 Simba.Hua Create
* ****************************************************************************
* </pre>
* @author Simba.Hua
*/
public class Printer {
private int counter;
public void print(String type) {
System.out.println(type + " printer " + counter ++);
}
}
package com.shux.springsource.lookup;
/**
*
* <pre>HISTORY
* ****************************************************************************
* ID DATE PERSON REASON
* 1 2018年1月18日 Simba.Hua Create
* ****************************************************************************
* </pre>
* @author Simba.Hua
*/
public abstract class HelloImpl implements HelloApi{
private Printer printer;
@Override
public void sayHello() {
printer.print("setter");
createPrototypePrinter().print("prototype");
createSingletonPrinter().print("singleton");
}
public abstract Printer createPrototypePrinter();
public Printer createSingletonPrinter() {
System.out.println("該方法不會被執行,如果執行了就出錯了");
return new Printer();
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
<!-- 測試look-up -->
<bean id="prototypePrinter" class="com.shux.springsource.lookup.Printer" scope="prototype"></bean>
<bean id="singletonPrinter" class="com.shux.springsource.lookup.Printer" scope="singleton"></bean>
<bean id="prototypeHelloApi" class="com.shux.springsource.lookup.HelloImpl" scope="prototype">
<property name="printer" ref="prototypePrinter"></property>
<lookup-method name="createPrototypePrinter" bean="prototypePrinter"/>
<lookup-method name="createSingletonPrinter" bean="singletonPrinter"/>
</bean>
<bean id="singletonHelloApi" class="com.shux.springsource.lookup.HelloImpl" scope="singleton">
<property name="printer" ref="prototypePrinter"></property>
<lookup-method name="createPrototypePrinter" bean="prototypePrinter"/>
<lookup-method name="createSingletonPrinter" bean="singletonPrinter"/>
</bean>
@Test
public void testLookUp() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");
System.out.println("------------Singleton sayHello-----------");
HelloApi singletonHelloApi = context.getBean("singletonHelloApi", HelloApi.class);
singletonHelloApi.sayHello();
singletonHelloApi = context.getBean("singletonHelloApi", HelloApi.class);
singletonHelloApi.sayHello();
System.out.println("------------Prototype sayHello-----------");
HelloApi prototypeHelloApi = context.getBean("prototypeHelloApi", HelloApi.class);
prototypeHelloApi.sayHello();
prototypeHelloApi = context.getBean("prototypeHelloApi", HelloApi.class);
prototypeHelloApi.sayHello();
}
列印結果如下:------------Singleton sayHello-----------
setter printer 0
prototype printer 0
singleton printer 0
setter printer 1
prototype printer 0
singleton printer 1
------------Prototype sayHello-----------
setter printer 0
prototype printer 0
singleton printer 2
setter printer 0
prototype printer 0
singleton printer 3
相關推薦
spring中depends-on與look-up的作用
depends-on的作用depends-on的作用一般是一個bean依賴於另外一個bean,被依賴的bean一般用於一些初始化和收尾的工作 如在這個例子中,DependentBean依賴於ResourceBean, ResourceBean主要用於指定檔案路徑、開啟檔案
Spring中depends-on的作用是什麼?
http://yanln.iteye.com/blog/2210723 spring的IOC容器負責bean的管理,當例項化一個bean是,spring保證該Bean所依賴的其他bean已經初始化。一般情況下,用<ref>元素建立對其他bean的依賴關係。
java面試題:spring中的BeanFactory與ApplicationContext的作用和區別?
2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能: a. 國際化支援 b. 資源訪問:Resource rs = ctx. getR
spring中的BeanFactory與ApplicationContext的作用和區別?
BeanFactory類關係繼承圖 1. BeanFactory類結構體系: BeanFactory介面及其子類定義了Spring IoC容器體系結構,由於BeanFactory體系非常的龐大和複雜,因此要理解Spring IoC,需要先理清BeanFactory
Spring中AOP簡介與使用
註釋 修改 http 修飾 width get 出現 dynamic value Spring中AOP簡介與使用 什麽是AOP? Aspect Oriented Programming(AOP),多譯作 “面向切面編程”,也就是說,對一段程序,從側面插入,進行操做。即通過預
SQL夯實基礎(二):連接操作中使用on與where篩選的差異
img 範圍 ins name -s insert 如何 篩選條件 utf 一、on篩選和where篩選 在連接查詢語法中,另人迷惑首當其沖的就要屬on篩選和where篩選的區別了,如果在我們編寫查詢的時候, 篩選條件的放置不管是在on後面還是where後面, 查出來
?spring中afterPropertiesSet方法與init-method配置描述
.post -m sse vax 註解 ota troy 一次 exc spring中afterPropertiesSet方法與init-method配置描述 1. InitializingBean.afterPropertiesSet()Spring中Initializi
spring中afterPropertiesSet方法與init-method配置描述
daemon sset end msg redis his === all HR ---恢復內容開始--- 今天看了前輩們寫的代碼用到了afterPropertiesSet()的方法,就好好整理了spring的bean加載 1. InitializingBean.after
轉:Spring中 @Autowired標籤與 @Resource標籤 的區別
Spring不但支援自己定義的@Autowired註解,還支援由JSR-250規範定義的幾個註解,如:@Resource、 @PostConstruct及@PreDestroy。 1. @Autowired @Autowired是Spring 提供的,需匯入  
Spring 中的註解與分層思想
在Spring框架中最常見的幾個註解 @Controller, @Service, @Component, @Repository 其中@Component是一種通用名稱,泛指任意可以通過Spring來管理的元件,@Controller, @Service, @Rep
spring中的@Bean與@Configuration
在使用spring的過程中,一直都看到寫程式碼時@Bean總是與@Configuration一起使用,那麼是否真的是使用@Bean一定需要@Configuration呢?? 查了很多資料,終於找到了。鑑於大部分國內查到的資料不沒有關於這個問題的解釋,即一篇部落格記錄下來,有同類疑惑的人可以看一下。
Spring中 @Autowired標籤與 @Resource標籤 的區別
Spring不但支援自己定義的@Autowired註解,還支援由JSR-250規範定義的幾個註解,如:@Resource、 @PostConstruct及@PreDestroy。 1. @Autowired @Autowire
spring中的FactoryBean與ObjectFactory的區別
一、介面定義 : public interface FactoryBean<T> { //獲取物件的工廠方法 @Nullable T getObject() throws Exception; //物件型別 @Nullable
JavaWeb-Spring中註解大全與詳解
可以通過該型別 status 物件顯式結束表單的處理,這相當於觸發 session 清除其中的通過@SessionAttributes 定義的屬性 請求處理方法返回值的可選型別 • void 此時邏輯檢視名由請求處理方法對應的 URL 確定,如以下的方法: @RequestMapping("/welc
(六)關於spring中的FactoryBean與ObjectFactory以及其區別
1.檢視介面定義以及其區別 public interface FactoryBean<T> { //獲取物件的工廠方法 @Nullable T getObjec
學習筆記:Spring中default-autowire與autowire區別
default-autowire與autowire主要用於Spring的IOC的註解注入,明白兩者的區別和用法將使你的開發事半功倍。 Spring 提供了Resource、Autowired這兩個註解用於注入,另外在xml配置檔案中,beans標籤下有
Spring的depends-on屬性Bean依賴
Spring核心研究-管理bean之間的關係一(depends-on) depend-on用來表示一個Bean的例項化依靠另一個Bean先例項化。如果在一個bean A上定義了depend-on B那麼就表示:A 例項化前先例項化 B。這種情況下,A可能根本不需要持有一個
【淺談JavaEE框架】Spring中@Autowired標籤與@Resource標籤的區別
@Autowired Spring 2.5 引入了 @Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。 要實現我們要精簡程式的目的。 @Autowired預設
Spring 中的byName與 byType
在應用中,我們常常使用<ref>標籤為JavaBean注入它依賴的物件。但是對於一個大型的系統,這個操作將會耗費我們大量的資源,我們不得不花費大量的時間和精力用於建立和維護系統中的<ref>標籤。實際上,這種方式也會在另一種形式上增加了應用程式的複
spring中的AOP與AspectJ的區別?
根據我看spring官方文件的理解(不出意外是最正確的答案):①選擇spring的AOP還是AspectJ?spring確實有自己的AOP。功能已經基本夠用了,除非你的要在介面上動態代理或者方法攔截精確到getter和setter。這些都是寫奇葩的需求,一般不使用。②在使用