Нулевой внутренний боб с весенним IoC - PullRequest
0 голосов
/ 12 февраля 2009

У меня есть определение одноэлементного компонента:

<bean id="exampleBean" class="com.examples.ExampleBean">
  <property name="exampleBean2">
    <bean class="com.examples.ExampleBean2" />
  </property>
</bean>

, где ExampleBean может быть:

public class ExampleBean {
  private ExampleBean2 exampleBean2;

  public ExampleBean() { }

  public ExampleBean2 getExampleBean2() { return exampleBean2; }
  public void setExampleBean2(ExampleBean2 exampleBean2) { this.exampleBean2 = exampleBean2; }
}

Проблема в том, что при определенных условиях com.examples.ExampleBean2 class может не существовать во время выполнения, что приведет к ошибке при попытке IoC создать экземпляр exampleBean.

Мне нужно игнорировать эту ошибку из IoC и разрешить создание exampleBean, но оставить свойство exampleBean2 null.

Итак, вопрос в том, возможно ли это каким-либо образом?

Спасибо за вашу помощь.

Ответы [ 5 ]

3 голосов
/ 12 февраля 2009

Если вы используете autowire, то, чего вы хотите достичь, возможно.

<bean class="com.examples.ExampleBean" autowire="byType" />
<bean class="com.examples.ExampleBean2" />

Или с помощью аннотаций

@Autowired(required=false)
ExampleBean2 exampleBean2;
1 голос
/ 12 февраля 2009

Если я правильно понял, ExampleBean2 не загружается, когда Spring пытается создать экземпляр bean-компонента. Это правильно? В таком случае я не думаю, что вы могли бы многое сделать со встроенными возможностями Spring.

Возможно, вы могли бы создать контейнерный класс, который будет всегда присутствовать. Этот класс проверит, загружен ли ExampleBean2 и, если да, он создаст его экземпляр. Контейнерный класс будет иметь свойство Object, которое может быть равно нулю или экземпляру ExampleBean2.

1 голос
/ 12 февраля 2009

Есть ли возможность объявить init-метод для вашего ExampleBean, и в этом init-методе проверить, существует ли класс ExampleBean2, и если да, то установить его?

<bean id="exampleBean" class="com.examples.ExampleBean" init-method="init"/>

Возможно, лучший способ сделать это здесь - использовать некоторую форму NullPattern, где вы всегда предоставляете реализацию ExampleBean2, даже если это только его нулевое значение.

0 голосов
/ 12 февраля 2009

Возможно, это будет работать:

public class NullFactoryBean implements FactoryBean {

    @Override
    public Object getObject() throws Exception {
        return null;
    }

    @Override
    public Class<?> getObjectType() {
        return Object.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }

}

А потом ...

public class ClassNotFoundPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanDefinitionName);
            String beanClassName = beanDefinition.getBeanClassName();
            try {
                Class.forName(beanClassName);
            } catch (ClassNotFoundException e) {
                beanDefinition.setBeanClassName(NullFactoryBean.class.getName());
            }
        }
    }

}

А потом ...

<beans>
    <bean id="exampleBean" class="com.examples.ExampleBean">
        <property name="exampleBean2">
            <bean class="com.examples.ExampleBean2" />
        </property>
    </bean>

    <bean class="ClassNotFoundPostProcessor" />
</beans>

РЕДАКТИРОВАТЬ: Извините, похоже, что это не поймал внутренние бобы. Я пропустил эту деталь, когда я проверял это. Ловит только бобы верхнего уровня. Кстати, com.examples.ExampleBean, вероятно, все равно не будет загружаться, поскольку он сам напрямую зависит от класса ExampleBean2, который виртуальная машина не найдет, что вызывает ошибку

0 голосов
/ 12 февраля 2009

возможно lazy-init сделает это, но я думаю, что Spring по крайней мере проверит, доступен ли класс реализации bean при создании контекста приложения

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