springAop(JDK动态代理和cglib技术)

本文介绍了Spring AOP中两种动态代理技术——JDK动态代理和CGLIB。JDK动态代理要求目标对象实现至少一个接口,而CGLIB则可以在没有接口的情况下生成代理类。AOP原理通过动态代理实现,对于实现接口的目标类使用JDK代理,未实现接口的则利用CGLIB进行代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、JDK动态代理

缺点:目标对象必须实现一个或多个接口,如果没有,可以使cglib技术

Proxy.newProxyInstance(

    classLoader,  //目标类的类加载器

    interfaces,   //目标类的接口列表

    invocationHandler  //交叉业务逻辑

)

代码实现:

UserService userService = (UserService) Proxy.newProxyInstance(
        UserServiceImpl.class.getClassLoader(),//目标类的类加载器
        new Class[]{UserService.class},//目标类的接口列表
        new InvocationHandler() {//交叉业务逻辑
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //1.打印日志
                System.out.println(method.getName()+" 开始 :["+new Date().getTime()+"]");
                //2.执行业务
                Object returnValue = null;
                try {
                    returnValue=method.invoke(new UserServiceImpl(),args);
                    System.out.println("提交事务");
                }catch (Exception e){
                    System.out.println("回滚....");
                    throw e;
                }
                return returnValue;
            }
        }
);

接口

public interface UserService {
    public void login(String username, String password);
    public String logout();
}
public class UserServiceImpl implements UserService {
    @Override
    public void login(String username, String password) {
        System.out.println("登录:"+username+","+password);
    }

    @Override
    public String logout() {
        System.out.println("666");
        return "byebye";
    }
}

二、cglib技术

1.添加jar包,版本随自己喜欢

<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>${cglib.version}</version>
</dependency>

2.用法

Enhancer.create(

class,//目标类的类型

new invocationhandler   //交叉业务逻辑

)

具体实现

public static void main(final String[] args) {
    Hello hello = (Hello) Enhancer.create(
            Hello.class,
            new InvocationHandler() {
                @Override
                public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                    System.out.println(method.getClass()+" start ");
                    return method.invoke(new Hello(),args);
                }
            }
    );
    hello.sayHello();
}

三、AOP原理

AOP原理就是使用动态代理

1.对于实现接口的目标类,使用JDK动态代理

2.对于没有实现接口的目标类可以使用cglib技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值