您当前的位置: 首页 >  宝哥大数据 spring

Spring06---动态代理

宝哥大数据 发布时间:2017-09-01 06:39:29 ,浏览量:3

一、动态代理步骤

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

关注
打赏
查看更多评论

宝哥大数据

暂无认证

  • 3浏览

    0关注

    985博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录