您当前的位置: 首页 >  spring

宝哥大数据

暂无认证

  • 3浏览

    0关注

    1029博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

这里写图片描述

关注
打赏
1587549273
查看更多评论
立即登录/注册

微信扫码登录

0.2280s