Spring Bean с динамическим значением конструктора - PullRequest
15 голосов
/ 07 января 2012

Мне нужно создать объект, который будет неполным без аргумента конструктора.Примерно так:

Class A  {
  private final int timeOut
  public A(int timeout)
  {
     this.timeOut = timeout;
   }
 //...
}

Я бы хотел, чтобы этим Бином управлял Spring, чтобы я мог использовать Spring AOP позже.

<bean id="myBean" class="A" singleton="false">
</bean>

Однако моему бобу необходимо передать тайм-аут как динамическое значение - есть ли способ создать управляемый бин с пружинным динамическим значением в конструкторе?

Ответы [ 3 ]

25 голосов
/ 08 января 2012

BeanFactory имеет метод getBean(String name, Object... args), который, в соответствии с javadoc , позволяет указывать аргументы конструктора, которые используются для переопределения собственных аргументов определения компонента.Таким образом, вы можете поместить значение по умолчанию в файл bean, а затем указать «реальные» значения времени выполнения, когда это необходимо, например,

<bean id="myBean" class="A" scope="prototype">
   <constructor-arg value="0"/> <!-- dummy value -->
</bean>

, а затем:

getBean("myBean", myTimeoutValue);

У меня нетпопробовал сам, но это должно сработать.

PS scope="prototype" теперь предпочтительнее singleton="false", что является устаревшим синтаксисом - он более явный, но делает то же самое.

1 голос
/ 08 января 2012

Сделайте это явно:

interface Bean {
    void setTimeout(int timeout);
}

class BeanImpl implements Bean {
    private int timeout;

    @Override
    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }
    ...
}

<bean id="bean" class="BeanImpl" scope="prototype">
    ...
    <!-- Nothing about timeout here -->
    ...
</bean>

class Client {
    private Bean bean;
    public void setBean(Bean bean) {
        this.bean = bean;
    }
    ...
    public void methodThatUsesBean() {
        int timeout = calculateTimeout();
        bean.setTimeout(timeout);
        ...
    }
}
1 голос
/ 07 января 2012

Два варианта пружины (без каламбура) на ум:


1.создайте фабрику тайм-аута и используйте ее в качестве параметра конструктора. Вы можете создать bean-компонент, который реализует FactoryBean , и его задачей является создание других bean-компонентов.Поэтому, если у вас есть что-то, что генерирует соли для шифрования, вы можете получить это из getObject () объекта EncryptionSalt.В вашем случае вы хотите сгенерировать целые числа.

Вот пример: http://www.java2s.com/Code/Java/Spring/SpringFactoryBeanDemo.htm


2.создайте bean-объект timeout, который оборачивает динамически установленный int, и оставьте его в состоянии «prototype», чтобы он создавался каждый раз Вместо того, чтобы тратить время на создание фабрики, объект EncryptionSalt можно просто объявить как прототипbean, поэтому, когда он вводится, каждый раз создается новый объект.Поместите логику в конструктор или куда-нибудь еще.


Это в некоторой степени зависит от того, какое значение вы хотите, чтобы тайм-аут на самом деле был.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...