静态跟动态代理

1、实现静态代理类 

                

 实现静态代理类

package cn.yix.spring.service;

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class EmpServiceConfig {
    /**
     *  代理类的接口
     */
    private EmpService empService;

    /**
     * 使用构造方法 注入 代理类
     * @param empService
     */
    public EmpServiceConfig(EmpService empService){
        this.empService=empService;
    }

    /**
     * 代理模块
     */
    public void getconnect(){
        System.out.println("取得连接");
    }
    public void  colosconnect(){
        System.out.println("关闭连接");
    }

    /**
     * 实现代理
     */
    public void addEmp(){
        this.getconnect();
        this.empService.insertEmp();
        this.colosconnect();
    }
}

运行代理类

1() 分析静态代理类的不足  其一 耦合性过高 我可以观察 静态代理实现类中 我们是通过构造方法注入 被代理类的接口 来注入完成代理的这一个过程 所以 加入我们需要代理大量的类的情况下静态代理显然不能满足我们开发者的需求 对于后期的维护更新也会造成影响。 解决方法:动态代理

2、实现动态代理类(InvocationHandler-proxy) 

        

package cn.yix.spring.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 *
 */
public class ObjcetProxy implements InvocationHandler {
    //代理类真实体类做主体增强
    private Object object;
    public ObjcetProxy(Object object){
        this.object=object;
    }

    /**
     * 前置增强
     */
    public void getconnect(){
        System.out.println("取得连接");
    }

    /**
     * 后置增强
     */
    public void  colosconnect(){
        System.out.println("关闭连接");
    }

    /**
     *
     * @param proxy  被代理对象
     *
     * @param method 要执行的目标方法(切点)
     *
     * @param args 传递给目标方法的参数
     *
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.getconnect();
        //指定目标方法
        Object invoke = method.invoke(object, args);
        this.colosconnect();
        return invoke;
    }
}
package cn.yix.spring;

import cn.yix.spring.service.EmpService;
import cn.yix.spring.service.EmpServiceproxy;
import cn.yix.spring.service.Impl.EmpserviceImpl;
import cn.yix.spring.service.ObjcetProxy;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;


public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTest.class);
        EmpserviceImpl bean = applicationContext.getBean(EmpserviceImpl.class);
        //创建被代理类实体对象
        EmpService empservice = new EmpserviceImpl();
        /**通过 invocationHandler 取得真实主体类对象的代理对象
         *  第一个参数:类的加载器
         *  第二个参数: 真实主题类的所有接口类型
         *  第三个参数 : 代理类对象
         */
        InvocationHandler handler = new ObjcetProxy(empservice);
        EmpService proxyInstance = (EmpService) Proxy
                .newProxyInstance(handler.getClass().getClassLoader(),
                        empservice.getClass().getInterfaces(),
                        handler);
        System.out.println("========================");
        proxyInstance.insertEmp();


    }
}

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值