Mybatis之jdk动态代理和cglib动态代理

Posted 爽走不解释

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis之jdk动态代理和cglib动态代理相关的知识,希望对你有一定的参考价值。

一、导入jar包

相关jar包可去maven中央仓库找====》由此去

二、jdk动态代理

1、首先编写实现类和接口

 接口
public interface UserDao 
    int add(int a,int b);


 实现类
 @Component
public class UsreDaoImpl implements UserDao 
    public int add(int a, int b) 
        System.out.println("执行添加");
        return a+b;
    

二、要编写用来一个用来拦截请求的类(这里就称为黑客类)

核心是实现InvocationHandler接口

public class JdkHk<T> implements InvocationHandler 
    private Object target;
    public JdkHk(Object target)
        this.target=target;
    
    //生产代理对象
   public Object createProxy()
        return Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[] UserDao.class,this);
   
    //入侵的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
        System.out.println("开始入侵!");
        args[0]=122;
        args[1]=22;
        Object invoke = method.invoke(target, args);
        System.out.println("入侵结束!");
        return invoke;
    

三、编写我们的测试类

public class hkTest 
    @Test
    public void TestHk()
//        目标对象
        UserDao dao = new UsreDaoImpl();
//        黑客对象
        JdkHk <UserDao> jdkHk = new JdkHk <>(dao);
//        代理对象
        UserDao proxy = (UserDao) jdkHk.createProxy();
//        入侵
        System.out.println(proxy.add(9,5));
    

三、cglib动态代理(也叫spring)

1、首先编写我们cglib黑客类

public class SpringHk implements MethodInterceptor 
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable 
        System.out.println("开始入侵");
        Object proceed = methodInvocation.proceed();
        System.out.println("入侵结束");
        return proceed;
    

二、使用jdk动态代理类的实现类

@Component
public class UsreDaoImpl  
    public int add(int a, int b) 
        System.out.println("执行添加");
        return a+b;
    
jdk动态代理和cglib动态代理最大的区别就体现在这,不用去实现User类的接口

三、编写测试类

@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:beans.xml")
public class SpringHk 

    @Autowired
    @Qualifier("userDaoProxy")
	//@Resource(name = "userDaoProxy")
    UsreDaoImpl usreDao;
    @Test
    public void testSpring()
        int add = usreDao.add(588, 5);
        System.out.println("结果=="+add);
    

四、图解

以上是关于Mybatis之jdk动态代理和cglib动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis之jdk动态代理和cglib动态代理

Mybatis之jdk动态代理和cglib动态代理

AOP之JDK动态代理和CGLib动态代理

MyBatis之Mapper动态代理

动态代理之 CGLIB 动态代理

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)