我正在使用spring3。我有以下课程。
package com.net.core.ioc;
public interface Transport {
public void doSave();
}
package com.net.core.ioc;
public class Car implements Transport{
String name;
public Car(String name){
this.name=name;
}
public void doSave(){
//saving logic using name
}
}
package com.net.core.ioc;
public class Bus implements Transport {
String id;
public Bus(String id){
this.id=id;
}
public void doSave() {
//saving logic using id
}
package com.net.core.ioc;
public class ServiceLocator {
private static ServiceLocator service = new ServiceLocator ();
//Static factory method
public static ServiceLocator createService(){
return service;
}
//Instance factory methods
public Transport createCarInstance(String name){
return new Car(name);
}
public Transport createBusInstance(String id){
return new Bus(id);
}
}
}
<context:component-scan base-package="com.net.core.ioc"/>
<bean id="serviceLocator" class="com.net.core.ioc.ServiceLocator"factory-method="createService"/>
<bean id="springServiceCarInstance" factory-bean="serviceLocator" factory-method="createCarInstance" scope="prototype"/>
<bean id="springServiceBusInstance" factory-bean="serviceLocator" factory-method="createBusInstance" scope="prototype"/>
</beans>
现在我得到的豆子如下:
Transport request = (Transport)applicationContext.getBean("springServiceCarInstance","someName");
request.doSave();
现在我可以在这里使用春季交易吗?我的意思是我可以使用@Transactional注释Car and Bus类吗?
答案 0 :(得分:2)
没有。由于汽车和公共汽车不是由弹簧工厂创建的,因此您获得的实例将不是交易编织代理,因此注释将毫无意义。
您希望使用initializeBean或createBean通过spring上下文创建它。有关更多详细信息,请查看AutoWireCapableBeanFactory上的java文档。
或者,您可以使用spring上下文将Can和Bus注册为原型bean,只需使用getBean(“beanName”,BeanType.class),spring将始终返回它们的新实例。
@Component
@Scope("singleton")
public class CarFactory {
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
public Car create( Make make, Model model, Year year ) {
Car car = new Car( make, model, year );
// this will apply the post processors including ones that might wrap the original bean
// such as transaction interceptors etc.
Car carProxy = Car.class.cast(autowireCapableBeanFactory.configureBean(car, "carBean"));
return carProxy;
}
}
答案 1 :(得分:2)
Car
和Bus
是对象模型中的实体。实体通常不是交易性的。创建一个能够持久存储这些实体类型的存储库/服务bean,然后使该bean成为事务性的。
这将允许您删除doSave
方法,这将消除将这些实体声明为bean的需要。
@Component
public class CarRepository{
@Transactional
public void doSave(Car car){
}
}