package spring.sample.aop.introduction;

import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultIntroductionAdvisor;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;

/**
 * Spring AOPの introductionのサンプルです<br>
 * <PRE>
 *   IMameインタフェースの具象クラスMameと
 *   IMame2インタフェースの具象クラスMame2を合成するサンプルです。
 * </PRE>
 * @author MBeans
 * @version 1.0
 */
public class IntroductionSample {

	public static void main(String[] args) {
		try {
			
			Mame mame = new Mame();
			DelegatingIntroductionInterceptor interceptor = new DelegatingIntroductionInterceptor(new Mame2());
			//MameとMame2を合成させる
			ProxyFactory factory = new ProxyFactory(mame);
			factory.addAdvisor(new DefaultIntroductionAdvisor(interceptor));

			//合成したプロキシオブジェクトを取得する
			Object o = factory.getProxy();

			//AOPの対象とした(Proxy Factoryのコンストラクタで指定した)Mameクラスの機能を使用する
			System.out.print("Mame.foo() : ");
			((IMame) o).foo();

			//合成したMame2クラスの機能を使用する
			 ((IMame2) o).in("JavaWorld");
			System.out.println("IMame2.out() : " + ((IMame2) o).out());

		} catch (Exception e) {
			e.printStackTrace();
		}
	}



}
