singleton对象中注入prototype对象的四种方法
一、实现 ApplicationContextAware接口 ,耦合性较高
public class RequestHandler {
RequestHandler(){
System.out.println("In Request Handler Constructor");
}
public void handleRequest(){
System.out.println("Handling request");
}
}
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class RequestManager implements ApplicationContextAware{
private RequestHandler requestHandler;
private ApplicationContext applicationContext;
public void handleRequest(){
requestHandler = getRequestHandler();
requestHandler.handleRequest();
}
// method to return new instance
public RequestHandler getRequestHandler() {
return applicationContext.getBean("requestHandler", RequestHandler.class);
//return requestHandler;
}
/*public void setRequestHandler(RequestHandler requestHandler) {
this.requestHandler = requestHandler;
}*/
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}
applicationContext.xml配置文件
<bean id="requestManager" class="org.netjs.prog.RequestManager"></bean>
<bean id="requestHandler" class="org.netjs.prog.RequestHandler" scope="prototype"></bean>
二、使用lookup标签
public class RequestHandler {
RequestHandler(){
System.out.println("In Request Handler Constructor");
}
public void handleRequest(){
System.out.println("Handling request");
}
}
public class RequestManager{
private RequestHandler requestHandler;
public void handleRequest(){
requestHandler = getRequestHandler();
requestHandler.handleRequest();
}
// dummy implementation, configured as look-up method
public RequestHandler getRequestHandler() {
return null;
}
}
或者把RequestManager做成抽象的
public abstract class RequestManager{
private RequestHandler requestHandler;
public void handleRequest(){
requestHandler = getRequestHandler();
requestHandler.handleRequest();
}
public abstract RequestHandler getRequestHandler();
}
applicationContext.xml配置文件
<bean id="requestManager" class="org.netjs.prog.RequestManager">
<lookup-method name="getRequestHandler" bean="requestHandler"/>
</bean>
<bean id="requestHandler" class="org.netjs.prog.RequestHandler" scope="prototype" />
或者使用注解的方式,如下:
@Component
@Scope("prototype")
public class RequestHandler {
RequestHandler(){
System.out.println("In Request Handler Constructor");
}
public void handleRequest(){
System.out.println("Handling request");
}
}
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Component;
@Component
public class RequestManager{
private RequestHandler requestHandler;
public void handleRequest(){
requestHandler = getRequestHandler();
requestHandler.handleRequest();
}
@Lookup
public RequestHandler getRequestHandler() {
return null;
}
}
三、使用< aop:scoped-proxy/> 标签
public class RequestManager{
private RequestHandler requestHandler;
public void handleRequest(){
requestHandler.handleRequest();
}
public RequestHandler getRequestHandler() {
return requestHandler;
}
public void setRequestHandler(RequestHandler requestHandler) {
this.requestHandler = requestHandler;
}
}
public class RequestHandler {
RequestHandler(){
System.out.println("In Request Handler Constructor");
}
public void handleRequest(){
System.out.println("Handling request");
}
}
applicationContext.xml配置文件
<bean id="requestManager" class="org.netjs.prog.RequestManager">
<property name="requestHandler" ref="requestHandler"/>
</bean>
<bean id="requestHandler" class="org.netjs.prog.RequestHandler" scope="prototype">
<aop:scoped-proxy/>
</bean>
或者使用注解的方式,如下:
@Component
public class RequestManager{
@Autowired
private RequestHandler requestHandler;
public void handleRequest(){
requestHandler.handleRequest();
}
}
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestHandler {
RequestHandler(){
System.out.println("In Request Handler Constructor");
}
public void handleRequest(){
System.out.println("Handling request");
}
}
四、使用ObjectFactory接口
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class RequestManager{
@Autowired
private ObjectFactory<ReqHandler> reqHandlerObjectFactory;
public void handleRequest(){
reqHandlerObjectFactory.getObject().handleRequest();
}
}