• 面向切面编程


    概念

    AOP(Aspect Oriented Programming),即面向切面编程,利用一种称为"横切"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

    APO开发术语

    • 连接点(Joinpoint):连接点是程序类中客观存在的方法,可被Spring拦截并切入内容。

    • 切入点(Pointcut):被Spring切入连接点。

    • 通知、增强(Advice):可以为切入点添加额外功能,分为:前置通知、后置通知 返回通知、异常通知、环绕通知。

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

    • 引介(Introduction):一种特殊的增强,可在运行期为类动态添加Field和Method。

    • 织入(Weaving):把通知应用到具体的类,进而创建新的代理类的过程。

    • 代理(Proxy):被AOP织入通知后,产生的结果类。

    • 切面(Aspect):由切点和通知组成,将横切逻辑织入切面所指定的连接点中。

    引入环境

    AOP依赖

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-aspectsartifactId>
    4. <version>5.1.6.RELEASEversion>
    5. dependency>

    spring-context.xml引入AOP命名空间

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    6. xsi:schemaLocation="
    7. http://www.springframework.org/schema/beans
    8. http://www.springframework.org/schema/beans/spring-beans.xsd
    9. http://www.springframework.org/schema/aop
    10. http://www.springframework.org/schema/aop/spring-aop.xsd
    11. ">
    12. beans>

    在写时  让idea自动导入命名空间

     
    

    AOP无入侵,能在不修改源代码的情况加插入一些辅助功能/非核心业务功能

    aop作用:Spring的AOP编程即是通过动态代理类为原始类的方法添加辅助功能。

    切面:保存多个通知的类叫做切面

    开发流程

    定义原始类

     

     定义通知类增加额外功能

     定义bean标签

     定义切入点(PointCut)

    上图必须写UserService.add()   描述了增强的位置,增强那个方法。

       测试

    上图ac.getBean(UserService.class),可以直接返回UserSercvice对象,不用强转了。

    也可以写*(),表示UserService里的所有空参方法,在测试类里直接改法,service.add()、service.update()、等等,如果是有参构造,写

    两个参数

     有没有参数都行  add(..)

    返回值是 void  Integer   String等等

     service下的所有方法

     包及子包

     

     或者定义一个切面类

    1. public class UserServiceImpl implements UserService {
    2. @Override
    3. public void add() {
    4. System.out.println("add............");
    5. }
    6. @Override
    7. public void delete() {
    8. System.out.println("delete..........");
    9. // int i =1/0;
    10. }
    11. @Override
    12. public void update() {
    13. System.out.println("update................");
    14. }
    15. @Override
    16. public int query() {
    17. System.out.println("query.............");
    18. int i =1/0;
    19. return 1;
    20. }
    21. @Override
    22. public void getAll() {
    23. System.out.println("getAll.............");
    24. }
    25. }
    1. public class MyAspect {
    2. public void before(){
    3. System.out.println("前置通知执行了");
    4. }
    5. public void bbbb(){
    6. System.out.println("后置通知执行了");
    7. }
    8. public void afterReturning(){
    9. System.out.println("返回通知执行了");
    10. }
    11. public void afterThrowing(){
    12. System.out.println("目标方法出错了 我来救场...");
    13. }
    14. public void around(ProceedingJoinPoint pjp){
    15. System.out.println("start:" + System.currentTimeMillis());
    16. try {
    17. pjp.proceed();
    18. } catch (Throwable throwable) {
    19. throwable.printStackTrace();
    20. }
    21. System.out.println("end:" + System.currentTimeMillis());
    22. }
    23. }

     上图也可以进行前置通知方法

     

     前置:在切点方法之前执行。

     后置:在切点方法之后执行。

    返回通知:有异常不执行。

    异常通知:有异常才执行 。

    环绕通知:在切点方法前后  模拟一次切点方法执行  可以在方法前后记录方法执行时间。

  • 相关阅读:
    如何查看SAP版本及HANA版本?
    Jenkins(1)基础概念 与 安装部署简单说明
    element 封装弹窗
    PDF转换器用什么好?这款一定能够帮到你
    西瓜书笔记
    Matlab,Python(Linux):mat文件无法被linux的loadmat识别
    springBoot如何编写一个webService服务呢?
    工业互联网企业身份与访问控制课题研究与探索
    Java:本地文件通过表单参数接口发送后大小变成0
    java计算机毕业设计家教信息管理系统(附源码、数据库)
  • 原文地址:https://blog.csdn.net/weixin_60934893/article/details/127418402