Springによるjavaオブザーバーモードの柔軟性の向上


前のブログで Javaオブザーバーモードで古典的な3層アーキテクチャをデカップリングする 最後に、Clientクラスを使用してListenerの実装クラスをLoginEventSourceクラスに登録し、新しいロジックを追加し、新しいlistenerクラスを追加した後、Clientクラスを修正する必要がある場合は、springが提供するコンテナを使用して、観察者モードを改善することができます.
springでsrcの下でspringプロファイルを作成する

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>

	</bean>
	<!-- EventSource -->
	<bean id="loginEventSource" class="com.tgb.chargeSystem.LoginEventSource">
	</bean>
	
	<!-- Listener -->
	<bean id="loginLogListener" class="com.tgb.chargeSystem.LoginLogListener">
	</bean>
	<bean id="loginVerificationListener" class="com.tgb.chargeSystem.LoginVerificationListener">
	</bean>
	
	
	<bean id="registerLoginVerificationListener" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetObject">
			<ref local="loginEventSource" />
		</property>
		<property name="targetMethod">
			<value>registerListener</value>
		</property>
		<property name="arguments">
			<list>
				<ref bean="loginVerificationListener" />
			</list>
		</property>
	</bean>
	
	<bean id="registerLoginLogListener" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetObject">
			<ref local="loginEventSource" />
		</property>
		<property name="targetMethod">
			<value>registerListener</value>
		</property>
		<property name="arguments">
			<list>
				<ref bean="loginLogListener" />
			</list>
		</property>
	</bean>
は、MethodInvokingFactoryBeanを介して、プロファイルを介してListenerを対応するイベントソースに登録することができ、クラス内のハードコーディングを回避することができます.
クライアントコードは
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		LoginEventSource loginEventSource=(LoginEventSource)ctx.getBean("loginEventSource");
		loginEventSource.notifyListenner();