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

use*_*829 5 java spring spring-3

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

运输工具

package com.net.core.ioc;

public interface Transport {
  public void doSave();
}
Run Code Online (Sandbox Code Playgroud)

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

总线.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
        }
Run Code Online (Sandbox Code Playgroud)

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

    }
 }
Run Code Online (Sandbox Code Playgroud)

配置文件

<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>
Run Code Online (Sandbox Code Playgroud)

现在我得到的豆子如下:

Transport request = (Transport)applicationContext.getBean("springServiceCarInstance","someName");
request.doSave();
Run Code Online (Sandbox Code Playgroud)

现在我可以在这里使用 spring 事务吗?我的意思是我可以使用 @Transactional 注释 Car 和 Bus 类吗?

lsc*_*lin 3

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

您想使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)