5

アプリケーションに言語変更イベントのインターフェースがあるとします (Vaadin に基づいています)。

public interface ILanguageChangeListener{
    @Subscribe onLanguageChange(LanguageChangeEvent event);
}

そして、@Component で注釈が付けられたこのインターフェースを実装する多くの Bean があるため、Spring IoC で使用できます。EventBus Bean もあります。

<bean id="languageSwitcher" class="com.google.common.eventbus" scope="session" />

ここで、IoC から任意の Bean のインスタンスを取得した後、languageSwitcher のインスタンスも取得し、新しく作成された Bean を次のように登録する必要があります。

languageSwitcher.register(myNewBean);

このイベントを受け取るために。IoC に、ILanguageChangeListener を実装するすべての新しい Bean で languageSwitcher Bean の register メソッドを呼び出したいと伝えることは可能ですか?

4

4 に答える 4

9

OK、BeanPostProcessor を使用して、インターフェースのすべての Bean を登録します。

public class EventBusRegisterBeanPostProcessor implements BeanPostProcessor,
        ApplicationContextAware {

    private ApplicationContext context;

    @Autowired
    private EventBus eventBus; // The only event bus i assume...

    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {

        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {

        if (bean instanceof ILanguageChangeListener) {
            registerToEventBus(bean);
        }

        return bean;
    }

    private void registerToEventBus(Object bean) {
        this.eventBus.register(bean);
    }

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        this.context = applicationContext;
    }

}

多数の EventBus Bean がある場合は、 を使用しApplicationContext.getBean(String)て必要な EventBus を取得する必要があることに注意してください。

javadocから引用します:

FactoryBean の場合、このコールバックは FactoryBean インスタンスと FactoryBean によって作成されたオブジェクトの両方に対して呼び出されます (Spring 2.0 以降)。ポストプロセッサは、対応する Bean インスタンスの FactoryBean チェックを通じて、FactoryBean または作成されたオブジェクトのいずれか、または両方に適用するかどうかを決定できます。

于 2012-12-10T19:51:23.150 に答える
1

イベントバスにファクトリBeanを使用し、コンテキスト内のすべてのILanguageChangeListenerBeanのリストを挿入します。

public class EventBusFactoryBean implements FactoryBean<EventBus> {

    @Autowired
    private List<ILanguageChangeListener> languageChangeListeners;

    private EventBus instance;

    @PostConstruct
    public void init() {

        this.instance = new EventBus();

        for (ILanguageChangeListener listener : this.languageChangeListeners) {
            this.instance.register(listener);
        }
    }

    public EventBusFactoryBean() {

    }

    public EventBus getObject() throws Exception {
        return this.instance;
    }

    public Class<?> getObjectType() {
        return EventBus.class;
    }

    public boolean isSingleton() {
        return true;
    }

    public List<ILanguageChangeListener> getLanguageChangeListeners() {
        return languageChangeListeners;
    }

    public void setLanguageChangeListeners(
            List<ILanguageChangeListener> languageChangeListeners) {
        this.languageChangeListeners = languageChangeListeners;
    }

}

次に、Spring Bean定義ファイルでBeanを定義するか、次のように注釈を付けます。@Component

于 2012-12-10T19:25:47.487 に答える
0

1 つの方法は、インターフェイスInitializingBeanを使用して、言語スイッチャーを Bean に挿入することです。このようなもの:

public class NotVeryUsefulLanguageListener implements ILanguageChangeListener,
        InitializingBean {

    @Autowired
    private EventBus languageSwitcher;

    public void afterPropertiesSet() throws Exception {

        this.languageSwitcher.register(this);
    }

    //... getters, setters, etc

}

シングルトンの場合NotVeryUsefulLanguageLisetener、それは一度だけ発生します...プロトタイプの場合、Springからインスタンスを取得するたびに

XML を使用している場合は、次のようなものを使用できます。

<bean id="languageListenerA" init-method="afterPropertiesSet" class="org.company.whatever.NotVeryUsefulLanguageListener">
        <!-- stuff -->
    </bean>
于 2012-12-10T16:44:35.187 に答える