Spring AOP入門(二)ダイナミックエージェント


動的エージェントとは、1つのエージェントを通じて必要なトラフィックオブジェクトを作成し、その後、このエージェントオブジェクトにおいて、さまざまな要求を一括して処理することをいう.
1.クラスを書いて対応するInvocationHandlerインターフェースを実現します.
public class LogProxy implements InvocationHandler {
	
	//2.         .             ,     Object
	private Object target;
	
	private LogProxy(){}
	
	//3.            ,              
	// getInstance            。
	public static Object getInstance(Object o){
	    	//3.1   LogProxy  
			LogProxy proxy=new LogProxy();
			
			//3.2         
			proxy.target=o;
			
			//3.3   Proxy         ,            classloader。
			//                  。
			//          InvocationHandler   。
			//    result        ,    o
			Object result=Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), proxy);
			return result;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Logger.info("        ");
		System.out.println("method name= "+method.getName());
		Object obj=method.invoke(target, args);
		return obj;
	}

}
2.beans.xmlに動的daoを配置する:
 <!--       dao,  LogProxy   -->      <!--   factory-method             -->
         <bean id="userDynamicDao" class="com.lj.proxy.LogProxy" factory-method="getInstance">
         	<constructor-arg ref="userDao"/>  
         	<!--    userDao  com.lj.dao.UserDao  @Repository("userDao") -->
         </bean>
ここはLogProxyの中の方法を通じて(通って)IUserDao userDynamicDaoを創建しましたに相当します.
この時、私達はservice階ではアメリカのerDaoを使わず、アメリカのerDynamicDaoです.
3.UserService.javaを変更する:
@Resource(name="userDynamicDao")
	private IUserDao userDao;
以上の操作により、UserServiceのいずれかのuserDaoの操作が記録されます.
=========================================================================================================
Annotationsクラスによって方法が記録されているかどうかを決定することもできます.
@Retention(RetentionPolicy.RUNTIME)
public @interface LogInfo {
	public String value() default "";
}
IUserDaoを見つけて、コメントを入れます.
@LogInfo("          by @LogInfo")
	public List<User> list();
最後に代理類LogProxyを修正します.
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//Logger.info("        ");
		if(method.isAnnotationPresent(LogInfo.class)){
			System.out.println(method.getAnnotation(LogInfo.class).value());
		}
		
		System.out.println("method name= "+method.getName());
		Object obj=method.invoke(target, args);
		return obj;
	}
最後にリスト方法を実行すると、見られます.
すべてのユーザーが検索されました.by@LogInfo
method name=list