我正在使用spring3。我有以下课程。
package com.net.core.ioc;
public interface Transport {
public void getTransport();
}
package com.net.core.ioc;
public class Car implements Transport{
public void getTransport(){
System.out.println("Transport type is Car");
}
}
package com.net.core.ioc;
public class Bus implements Transport {
public void getTransport() {
System.out.println("Transport type is Car");
}
package com.net.core.ioc;
public class SpringService {
private static SpringService service = new SpringService();
//Static factory method
public static SpringService createService(){
return service;
}
//Instance factory methods
public Transport createCarInstance(){
return new Car();
}
public Transport createBusInstance(){
return new Bus();
}
}
}
<context:component-scan base-package="javabeat.net.core.ioc"/>
<bean id="springServiceStaticFactory" factory-method="createService"/>
<bean id="springServiceCarInstance" factory-bean="springServiceStaticFactory" factory-method="createCarInstance"/>
<bean id="springServiceBusInstance" factory-bean="springServiceStaticFactory" factory-method="createBusInstance"/>
</beans>
现在我的问题是spring管理使用SpringService.java类实例化的Car和Bus实例吗?因为我必须使用@Transactional注释来注释Car和Bus类。有可能吗?
答案 0 :(得分:0)
Spring会管理您的Car
和Bus
个实例,因为它们是ApplicationContext
的一部分。你正在做的事情与Spring FactoryBean
通常会发生的情况基本相同,但你现在正在使用自己的机制。
然而,在您当前的设置中,Car
和Bus
bean是单例,因为它们将被创建一次,不确定这是否是您想要的。
如果要将值传递给构造函数,只需修改工厂方法。
public Transport createCarInstance(String name){
return new Car(name);
}
你的bean定义应该告诉它它是一个原型范围的bean
<bean id="springServiceCarInstance" factory-bean="springServiceStaticFactory" factory-method="createCarInstance" scope="prototype" />
现在,在您的代码中,您可以执行查找并将参数传递给查找方法(请参阅javadoc)。
@Autowired
private ApplicationContext ctx;
public void myMethod() {
Car car = ctx.getBean(Car.class, "Mercedes");
}
上面的代码应该为您提供一个名为 Mercedes 的全新Car
实例。