Spring(19) 協調不同作用域的bean
阿新 • • 發佈:2018-12-10
- 這個標題是照著課本來的,但是理解了以後就是給那些 單例模式的bean A 在 每次 執行 其中 需要 非單例模式的bean B 的方法的時候,每次都傳一個新的 非單例模式bean B 的例項進去。
- 實現的方法是在配置檔案中,將需要不同bean B的方法放在lookup-metho標籤中。並且將需要的非例項化bean存進去
- 程式碼在這裡~~~
package calleePackage; /** * 這個是被非單例模式的bean */ public class Callee { private String calleeName; public String getCalleeName() { return calleeName; } public void setCalleeName(String calleeName) { this.calleeName = calleeName; } }
package callerPackage; import calleePackage.Callee; /** * 這個是單例模式的bean */ public class Caller { private Callee callee; public Callee getCallee() { return callee; } public void setCallee(Callee callee) { this.callee = callee; } public String whoIsMyCallee(){ return "my callee is " + getCallee().toString(); } }
<?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!--就是通過lookup-method標籤來讓spring知道哪個方法需要新的非單例模式的bean啦~~--> <bean id="caller" class="callerPackage.Caller"> <lookup-method name="getCallee" bean="callee"/> </bean> <!--spring在預設情況下是將bean設定為單例模式的bean的。要顯式指定scope="prototype" 才會得到非單例模式的bean--> <bean id="callee" class="calleePackage.Callee" scope="prototype"> <property name="calleeName" value="lala"/> </bean> </beans>
package testPackage; import callerPackage.Caller; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { public static void main(String []args){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Caller caller1 = applicationContext.getBean("caller", Caller.class); Caller caller2 = applicationContext.getBean("caller", Caller.class); System.out.println(caller1 == caller2); // caller1和caller2是相等的。 System.out.println(caller1.whoIsMyCallee()); System.out.println(caller2.whoIsMyCallee()); System.out.println(caller1.getCallee() == caller2.getCallee()); // caller1的callee和caller2的callee是不等的 } } //執行程式可以看到輸出 // true // my callee is [email protected] // my callee is [email protected] // false
這是我看李剛編著的《輕量級javaEE企業應用實戰(第五版)-Struts2+Spring5+Hibernate5/JAP2》後總結出來的。