繁体   English   中英

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

[英]Using spring @Transactional for the beans created using factory method?

我正在使用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和Bus类吗?

不会。由于汽车和公共汽车不是由弹簧工厂创建的,因此您获得的实例将不是交易编织代理,因此注释将毫无意义。

您希望使用initializeBean或createBean通过spring上下文创建它。 有关更多详细信息,请查看AutoWireCapableBeanFactory上的java doc。

或者,您可以使用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;
    }
}

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

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

@Component
public class CarRepository{

    @Transactional
    public void doSave(Car car){

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM