Spring学习之旅-核心高级篇(4)

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情


写在前面

作为一个java程序员,spring应该都不会陌生了吧?

对于大部分程序员来说,spring的入门,估计跑起一个框架,熟悉一下开发的流程,基本上就掌握spring框架的开发了。

随着开发年限的变大,我们不能仅仅是掌握到这个地步,更应该深入的学习spring框架。

这不,接下来就是spring框架的学习之旅了,希望可以帮助到大家。

一、AOP介绍

1.1 AOP实现之Spring AOP

1.1.1 实现原理分析

  • Spring AOP是通过动态代理技术实现的
  • 而动态代理是基于反射设计的。( 关于反射的知识。请自行学习)
  • 动态代理技术的实现方式有两种: 基于接口的JDK动态代理 和 基于继承的CGLib动态代理。

image.png

  • JDk动态代理

目标对象必须实现接口

1.使用Proxy类来生成代理对象的一些代码如下:

/**
 * 使用JDK的方式生成代理对象
 * @author llsydn
 */
public class MyProxyUtils {
    public static UserService getProxy(final UserService service) {
        //使用Proxy类生成代理对象
        Userservice proxy = (userservice) Proxy.newProxyInstance(
            service.getClass().getClassloader(),
            service.getClass().getInterfaces(),
            new InvocationHandler() {
                //代理对象方法一执行,invoke方法就会执行-次
                public Object invoke(object proxy, Method method, object[] args) throws Throwable {
                    if("save".equals(method.getName()){
                        system.out.println("记录日志...");
                        // 开启事务
                    }    
                    // 提交事务
                    // 让service类的save或者update方法正常的执行下去
                    return method.invoke(service, args);
                }
            });
        //返回代理对象
        return proxy;
    }
}
  • cglib动态代理

目标对象不需要实现接口

底层是通过继承目标对象产生代理子对象(代理子对象中继承了目标对象的方法,并可以对该方法进行增强)

2.使用CGLIB类来生成代理对象的一些代码如下:

public static UserService getProxy(){
    // 创建CGLIB核心的类
    Enhancer enhancer = new Enhancer();
    // 设置父类
    enhancer.setSuperclass(UserServiceImpl.class);
    // 设置回调函数
    enhancer.setCallback(new MethodInterceptor(){
        @Override
        public Object intercept(object obj, Method method, object[] args, MethodProxy methodProxy) throws Throwable {
            if("save".equals(method.getName())) {
                //记录日志
                system.out.println("记录日志了...");
            }
            return methodProxy.invokeSuper(obj, args);
        }
    });
    //生成代理对象
    UserService proxy = (UserService) enhancer.create();
    return proxy;
}

1.1.2 使用

  • 其使用ProxyFactoryBean创建:
  • 使用 aop:advisor 定义通知器的方式实现AOP需要通知类实现Advice接口
  • 增强(通知)的类型有:

- 前置通知: org.springframework.aop.MethodBeforeAdvice
- 后置通知: org.springframework.aop.AfterReturningadvice
- 环绕通知: org.aopalliance.intercept.MethodInterceptor
- 异常通知: org.springframework.aop.Throwsadvice

好了,以上就是Spring学习之旅-核心高级篇(4) 的全部内容了。

今天就先到这里了,后面的内容,留下次分享了,先溜了!!!^_^

如果觉得写得不错的,帮忙点赞、评论、收藏一下呗!!!

image.png