使用spring实例化静态工厂方法?

时间:2014-02-18 07:43:52

标签: java spring

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

Transport.java

package com.net.core.ioc;

public interface Transport {
  public void getTransport();
}

Car.java

package com.net.core.ioc;

    public class Car implements Transport{
        public void getTransport(){
            System.out.println("Transport type is Car");
        }
    }

Bus.java

package com.net.core.ioc;

    public class Bus implements Transport {
        public void getTransport() {
            System.out.println("Transport type is Car");
        }

SpringService.java

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

    }
 }

config.xml中

<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类。有可能吗?

1 个答案:

答案 0 :(得分:0)

Spring会管理您的CarBus个实例,因为它们是ApplicationContext的一部分。你正在做的事情与Spring FactoryBean通常会发生的情况基本相同,但你现在正在使用自己的机制。

然而,在您当前的设置中,CarBus 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实例。