栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021.10.14 Spring中的AOP

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021.10.14 Spring中的AOP

1.关于AOP

1)AOP→Aspect Oriented Programing 面向切面编程

AOP采取横向抽取机制,取代传统纵向继承体系重复性代码,一般用于鉴权,事务管理,通知,日志记录等

SpringAop使用纯Java实现,不需要专门编译过程和类加载,在运行期通过代理方式向目标类织入增强代码

2)AOP底层原理即动态代理

动态代理分两种:JDK动态代理和cglib动态代理

        JDK动态代理通过jdk完成,通过反射执行的,加载速度快,执行效率低,只能实现有实现接口的目标对象

        cglib动态代理是通过asm技术生成相对应目标类的子类的字节码文件,加载速度慢,执行效率高,无论目标对象是否实现接口。 

2.AOP中的术语

Joinpoint(连接点):指被拦截到的点.在Spring中,这些点指的是方法。

Pointcut(切入点):指对哪些Joinpoint进行拦截的定义。

Advice(通知/增强):通知是指拦截到Joinpoint之后所要做的事情就是通知(分前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能))。

Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或Fileld。

Target(目标对象):代理的目标对象。

Weaving(织入):是把增强应用到目标对象来创建新的代理对象的过程,Spring采用动态代理织入,而Aspect采用编译期织入和类装载织入。

Proxy(代理):一个类被AOP织入增强后,产生一个结果代理类

Aspect(切面):是切入点和通知(引介)的结合

3.举例在idea中实现

1)创建一个接口和一个实现类

//接口
//UserService->目标对象
public interface UserService {

    //未曾强的方法为连接点:JoinPoint
    //已增强的方法叫做切入点:PointCut
    public void add();
    public void delete();
}


//实现类
public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("添加");
    }

    @Override
    public void delete() {
        System.out.println("删除");
    }
}

在pom.xml中导入相关依赖

        
            org.springframework
            spring-context
            5.3.10
        

        
        
            org.aspectj
            aspectjweaver
            1.9.6
        

        
            junit
            junit
            4.13.2
        

2)创建MyAdvice类

//通知类,增强的方法:Advice
public class MyAdvice {
    public void before(){ System.out.println("目标对象调用方法前执行");}

    public void after(){
        System.out.println("后置通知(最终通知),目标对象调用方法后执行,无论是否发生异常都执行");
    }

    public void after_returning(){
        System.out.println("后置通知,目标对象调用方法后执行,发生异常不执行");
    }

    public void after_throwing(){
        System.out.println("异常通知,发生异常执行");
    }

    public void around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("环绕通知,目标对象调用方法之前");
        joinPoint.proceed();
        System.out.println("环绕通知,目标对象调用方法之后");


    }
}

3)配置文件applicationContext.xml


 

        

        

        

                

                


                        

                        

                        

                        
 
                        
                
        

4)测试类测试

public class SpringTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService =
                (UserService) applicationContext.getBean("userService");
        userService.add();
        System.out.println("----------------------------------------");
        userService.delete();

    }
}

得到结果:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324461.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号