Spring AOP入門(二)ダイナミックエージェント
動的エージェントとは、1つのエージェントを通じて必要なトラフィックオブジェクトを作成し、その後、このエージェントオブジェクトにおいて、さまざまな要求を一括して処理することをいう.
1.クラスを書いて対応するInvocationHandlerインターフェースを実現します.
この時、私達はservice階ではアメリカのerDaoを使わず、アメリカのerDynamicDaoです.
3.UserService.javaを変更する:
=========================================================================================================
Annotationsクラスによって方法が記録されているかどうかを決定することもできます.
すべてのユーザーが検索されました.by@LogInfo
method name=list
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