簡體   English   中英

使用spring實例化靜態工廠方法?

[英]Using spring to instantiate with static factory methods?

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

Transport.java

package com.net.core.ioc;

public interface Transport {
  public void getTransport();
}

汽車.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類進行注釋。 可能嗎?

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" />

現在,您可以在代碼中進行查找,並將參數傳遞給lookup方法(請參閱javadoc )。

@Autowired
private ApplicationContext ctx;

public void myMethod() {
    Car car = ctx.getBean(Car.class, "Mercedes"); 
}

上面的代碼應為您提供一個名為Mercedes的新Car實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM