一、动态代理步骤
1、写一个类实现java.lang.reflect.InvocationHandler接口
2、创建一个代理对象
3、创建一个方法生成对象,这个方法的参数是被代理的对象, 方法返回的对象就是代理对象:
3.1、创建代理对象
3.2、设置代理对象
3.3、通过Proxy的方法创建代理对象
当有了代理对象, 不管被代理对象执行了什么方法, 都会调用以下的invoke方法
1.1、代理对象
package com.chb.Spring.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.chb.Spring.utils.MyLogger;
public class LogProxy implements InvocationHandler {
private LogProxy(){}
private Object target;
/**
* @param o 被代理的对象
* @return 代理对象
*/
public static Object
getInstance(Object o) {
LogProxy logProxy =
new LogProxy();
logProxy.target = o;
Object result = Proxy.newProxyInstance(
o.getClass().getClassLoader(),
o.getClass().getInterfaces()
, logProxy);
return result;
}
/**
* 当有了代理对象, 不管**被代理对象**执行了什么方法, 都会调用以下的invoke方法
*/
public Object
invoke(Object proxy, Method method, Object[] args)
throws Throwable {
MyLogger.info(
"进行相应的操作");
Object obj = method.invoke(target, args);
return obj;
}
}
1.2、在SpringBean.xml中配置动态代理的bean annotation注入是通过setter, 但是LogProxy中没有setter方法, 只有getInstance() , 而且是静态方法对于静态的注入 通过factory-method=”getInstance”进行注入。
1.3、注入代理对象
测试
2、再增加一个被代理对象
2.1、为了添加相应的日志, 也需要创建一个代理对象
2.1.1、在UserService中添加MessageDao对象设置setter, getter对象, 使用名字注入@Resource(name="messageDynamicLogProxy")
2.1.2、在SpringBean.xml中注入
三、对日志控制,
四、更精确的控制日志
4.1、创建LogInfo
package com.chb.Spring.model;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @
interface LogInfo {
public String
value()
default"";
}
4.2、在被代理类的接口添加注解
package com.chb.Spring.dao;
import com.chb.Spring.model.LogInfo;
public interface IMessageDao {
@LogInfo(
"messageDao 添加一个消息")
public void add();
public void delete();
public void load();
}
只有添加LogInfo的方法添加了日志