一、动态代理步骤
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;
//创建一个类实现java.lang.reflect.InvocationHandler
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 logProxy = new LogProxy();
logProxy.target = o;
//通过Proxy的方法创建代理对象,
Object result = Proxy.newProxyInstance(
o.getClass().getClassLoader(), //被代理对象的classLoader
o.getClass().getInterfaces() //被代理对象的接口
, logProxy); //实现InvocationHandler的对象
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”进行注入。
@Resource(name="messageDynamicLogProxy")
2.1.2、在SpringBean.xml中注入
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的方法添加了日志