使用spring @Transactional为使用工厂方法创建的bean?

时间:2014-02-18 10:23:56

标签: java spring spring-3

我正在使用spring3。我有以下课程。

Transport.java

package com.net.core.ioc;

public interface Transport {
  public void doSave();
}

Car.java

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

Bus.java

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
        }

SpringService.java

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);
        }

    }
 }

config.xml中

<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类吗?

2 个答案:

答案 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)

CarBus是对象模型中的实体。实体通常不是交易性的。创建一个能够持久存储这些实体类型的存储库/服务bean,然后使该bean成为事务性的。

这将允许您删除doSave方法,这将消除将这些实体声明为bean的需要。

@Component
public class CarRepository{

    @Transactional
    public void doSave(Car car){

    }
}