Spring如何使用私有构造函数(单例模式)和来自工厂的对象实例化cClasses?

时间:2014-11-19 11:04:20

标签: java spring design-patterns singleton factory

我正在研究Spring Core认证,我有以下疑问,它涉及Spring如何使用私有构造函数实例化类(例如Singleton模式),或者如何实例化Factories中的对象(不是Spring上下文)。

例如,我有以下单身工厂:

public class AccountServiceSingleton implements AccountService {

    private static AccountServiceSingleton inst = new AccountServiceSingleton();

    private AccountServiceSingleton() { ... }

    public static AccountService getInstance() {
        // ...
        return inst;
    }
}

这是一个单件工厂,因为它构建了一个私有静态对象,用私有构造函数构建,我有一个公共方法来获取此对象。

所以我认为问题 Spring如何构建这个对象?取决于构造函数是私有的这一事实所以我在 Java配置类中不能做这样的事情

@Confguration
public class ApplicationConfig{

    @Bean
    public AccountServiceSingleton accountServiceSingleton(){
        return new AccountServiceSingleton();
    }
}

因为我无法访问私人 AccountServiceSingleton()构造函数。

同时,出于同样的原因,我无法使用等效的XML配置。

我了解问题是什么,或者我错过了什么?

我认为我遗漏了一些东西,因为在我阅读的文档中,我可以使用以下2个解决方案解决上一个问题:

  1. @Configuration 类中使用 @Bean 方法:所以,阅读它,我认为以前的Java配置类工作......但为什么呢?

  2. XML配置中的XML工厂方法属性,在线搜索我发现必须是这样的,但是如何使用它在XML中配置以前的 AccountServiceSingleton bean配置?

  3. TNX

3 个答案:

答案 0 :(得分:4)

这很简单,你也可以这样做:

Constructor cxor = AccountServiceSingleton.class.getDeclaredConstructor();
cxor.setAccessible(true);
return cxor.newInstance();

答案 1 :(得分:2)

我自己找到答案仍在阅读文档。我认为这个问题的正确答案是:

如果我想将此类配置为Spring bean:

public class AccountServiceSingleton implements AccountService {

    private static AccountServiceSingleton inst = new AccountServiceSingleton();

    private AccountServiceSingleton() { ... }

    public static AccountService getInstance() {
        // ...
        return inst;
    }
}

使用 Java配置我只需在配置类中使用 @Bean 注释相对bean方法。

如果我想使用 XML配置配置bean,我必须使用工厂方法属性,类似于:

<bean id=“accountService” class=“com.acme.AccountServiceSingleton” 
      factory-method="getInstance" />

所以它说将调用getInstance()方法从我的单件工厂中获取单例对象

答案 2 :(得分:0)

这样做怎么样:

@Confguration
public class ApplicationConfig{

    @Bean
    public AccountServiceSingleton accountServiceSingleton(){
        return AccountServiceSingleton.getInstance();
    }
}