Spring06---动态代理

xiaoxiao2021-02-28  98

一、动态代理步骤

   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”进行注入。

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的方法添加了日志

转载请注明原文地址: https://www.6miu.com/read-65035.html

最新回复(0)