1. 程式人生 > >spring中depends-on與look-up的作用

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-up

look-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








相關推薦

springdepends-onlook-up作用

depends-on的作用depends-on的作用一般是一個bean依賴於另外一個bean,被依賴的bean一般用於一些初始化和收尾的工作  如在這個例子中,DependentBean依賴於ResourceBean,  ResourceBean主要用於指定檔案路徑、開啟檔案

Springdepends-on作用是什麼?

http://yanln.iteye.com/blog/2210723 spring的IOC容器負責bean的管理,當例項化一個bean是,spring保證該Bean所依賴的其他bean已經初始化。一般情況下,用<ref>元素建立對其他bean的依賴關係。

java面試題:spring的BeanFactoryApplicationContext的作用和區別?

          2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:                  a. 國際化支援                        b. 資源訪問:Resource rs = ctx. getR

spring的BeanFactoryApplicationContext的作用和區別?

BeanFactory類關係繼承圖 1. BeanFactory類結構體系: BeanFactory介面及其子類定義了Spring IoC容器體系結構,由於BeanFactory體系非常的龐大和複雜,因此要理解Spring IoC,需要先理清BeanFactory

SpringAOP簡介使用

註釋 修改 http 修飾 width get 出現 dynamic value Spring中AOP簡介與使用 什麽是AOP? Aspect Oriented Programming(AOP),多譯作 “面向切面編程”,也就是說,對一段程序,從側面插入,進行操做。即通過預

SQL夯實基礎(二):連接操作使用onwhere篩選的差異

img 範圍 ins name -s insert 如何 篩選條件 utf 一、on篩選和where篩選   在連接查詢語法中,另人迷惑首當其沖的就要屬on篩選和where篩選的區別了,如果在我們編寫查詢的時候, 篩選條件的放置不管是在on後面還是where後面, 查出來

?springafterPropertiesSet方法init-method配置描述

.post -m sse vax 註解 ota troy 一次 exc spring中afterPropertiesSet方法與init-method配置描述 1. InitializingBean.afterPropertiesSet()Spring中Initializi

springafterPropertiesSet方法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的FactoryBeanObjectFactory的區別

一、介面定義 : public interface FactoryBean<T> { //獲取物件的工廠方法 @Nullable T getObject() throws Exception; //物件型別 @Nullable

JavaWeb-Spring註解大全詳解

可以通過該型別 status 物件顯式結束表單的處理,這相當於觸發 session 清除其中的通過@SessionAttributes 定義的屬性  請求處理方法返回值的可選型別 • void 此時邏輯檢視名由請求處理方法對應的 URL 確定,如以下的方法: @RequestMapping("/welc

(六)關於spring的FactoryBeanObjectFactory以及其區別

1.檢視介面定義以及其區別 public interface FactoryBean<T> { //獲取物件的工廠方法 @Nullable T getObjec

學習筆記:Springdefault-autowireautowire區別

  default-autowire與autowire主要用於Spring的IOC的註解注入,明白兩者的區別和用法將使你的開發事半功倍。   Spring 提供了Resource、Autowired這兩個註解用於注入,另外在xml配置檔案中,beans標籤下有

Springdepends-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的AOPAspectJ的區別?

根據我看spring官方文件的理解(不出意外是最正確的答案):①選擇spring的AOP還是AspectJ?spring確實有自己的AOP。功能已經基本夠用了,除非你的要在介面上動態代理或者方法攔截精確到getter和setter。這些都是寫奇葩的需求,一般不使用。②在使用