Spring注解(AOP)

深入掌握基于注解的Spring AOP实现 面向切面编程(AOP)是软件开发中的一个重要概念,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,以便在系统的多个部分中复用。这些横切关注点包括日志记录、事务管理、安全性和缓存等。面向切面编程(AOP)是一种编程范式,它允许开发者将横切关注点(如日志、事务管理等)与业务逻辑分离。在Spring框架中,AOP主要用于将业务逻辑中散布在多个点的公共行为(如安全、事务等)模块化,以减少代码重复,提高模块的内聚性。 阅读详情

Spring注解(AOP)

底层动态代理

  程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式

 

导入aop的相关模块

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>

 

动态感知业务类运行的状态

    通知: 前置 @Before  后置 @After  环绕 @Around 异常@AfterThrowing  返回 @AfterReturning

    补充环绕通知: 动态代理,手动推进目标方法运行(joinPoint.proceed() )

 

步骤:

编写切面类

在切面类里面  把每个方法 何时何地切入都指定好

将切面类和业务逻辑类 都添加到容器中

告诉容器 哪个是切面类@Aspect

 

在 xml中  <aop: aspectj-autoproxy> </aop:aspectj-autoproxy>    开启基于注解版的切面功能

注解中: 在当前的配置类加入  @EnableAspectJAutoProxy 启用基于注解的aop模式

 

正常代码:

 

@Component
public class Mathcalculator {
     public int div(int i , int j) {
         System.out.println("Mathcalculator--div被调用");
         return i/j;
     }
}

 

切面类:

 

@EnableAspectJAutoProxy
@Configuration
public class AOPConfig {
   @Bean  //业务逻辑类注册到容器
    public Mathcalculator mathcalculator() {
        return new Mathcalculator();
    }
   
   @Bean  // 切面类注册到容器中
   public LogAspects logAspects() {
       return new LogAspects();
   }
}

 

测试:

 

public class test {
    @Test 
    public void test01(){  
        //使用无参构造器  创建applicationContext  (详情自己研究下有参构造器的方法)
        AnnotationConfigApplicationContext applicationContext=
                new AnnotationConfigApplicationContext(AOPConfig.class);
        Mathcalculator bean = applicationContext.getBean(Mathcalculator.class);
        bean.div(1, 1);
       //设置需要激活的环境
        applicationContext.getEnvironment().setActiveProfiles("dev","test"); //可以设置多个
       //注册主配置类
        applicationContext.register(Profile.class);    
       //启动刷新容器
       applicationContext.refresh();
      }  
} 

结果:

升级:

切面类

@Aspect
public class LogAspects {
  //抽取公共的切入点表达式  本类的  如果是别的类的 写全名就OK了
    
    @Pointcut("execution(public int com.toov5.config.Mathcalculator .*(..))" )
    public void pointCut() {
        
    }
// @Before("public int com.toov5.config.Mathcalculator.div(int , int)")
   @Before( "pointCut()" )
    public void logStart(JoinPoint joinpoint) {  //获取签名 获取方法
      Object[] args = joinpoint.getArgs(); //目标方法 运行时候需要的参数表
        System.out.println("除法运行@Before"+joinpoint.getSignature().getName()+"运行时参数表"+args );
    }
    @After( "pointCut()" ) //运行异常与否 都要执行的
    public void logEnd(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName()+"除法结束@After");
    }
    @AfterReturning(value="pointCut()", returning="result")
    public void logReturn(JoinPoint joinpoint,Object result ) { //result 接受返回值
        System.out.println(joinpoint.getSignature().getName()+"除法正常运行@AfterReturning,结果:"+result);
    } 
    @AfterThrowing(value = "pointCut()", throwing="e")
    public void logException(JoinPoint joinpoint, Exception e) {
        System.out.println( joinpoint.getSignature().getName()+"除法异常@AfterThrowing"+e.getMessage());
    }
}

配置:

@EnableAspectJAutoProxy
@Configuration
public class AOPConfig {
   @Bean  //业务逻辑类注册到容器
    public Mathcalculator mathcalculator() {
        return new Mathcalculator();
    }
   
   @Bean  // 切面类注册到容器中
   public LogAspects logAspects() {
       return new LogAspects();
   }
}

 

测试类:

 

public class test {
    @Test 
    public void test01(){  
        //使用无参构造器  创建applicationContext  (详情自己研究下有参构造器的方法)
        AnnotationConfigApplicationContext applicationContext=
                new AnnotationConfigApplicationContext(AOPConfig.class);
        Mathcalculator bean = applicationContext.getBean(Mathcalculator.class);
        bean.div(1, 1);
       //设置需要激活的环境
        applicationContext.getEnvironment().setActiveProfiles("dev","test"); //可以设置多个
       //注册主配置类
        applicationContext.register(Profile.class);    
       //启动刷新容器
       applicationContext.refresh();
      }  
} 

结果:

 

JointPoint 要写一定要写在 参数的首位! 

 

 三步走:

   1  将业务逻辑组件和切面类都加入到容器,告诉Spring哪个是切面类(@Aspect)

   2 在切面类上的每一个通知方法上标注 通知注解,告诉Spring合适何地运行(切入点表达式)

   3 开启基于注解的aop模式 与config上 

 

总结:

 

 

 

aop的原理


 

 加入@EnableAspectJAutoProxy  才有AOP

 

继续点开看

利用AspectJAutoProxyRegistrar  给自定义容器中注册bean

  给容器注册一个AnnotationAwareAspectJAutoProxyCreator   自动代理创建器

   可以一直追踪其父类:

      

 实现了 SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware  

                                   后置处理器                                        

 

关注后置处理器的工作  Bean初始化完成前后做的事情

 BeanFactory                自动注入 

 AbstractAutoProxyCreator :

@Override
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}

 

 然后是与后置处理器有关的: 

@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)

 有后置处理器的逻辑

 

 AbstractAutoProxyCreator   类

AnnotationAwareAspectJAutoProxyCreator 类  initBeanFactory

 

启动后

1、  传入主配置类  创建 IOC容器

2、  注册配置类 调用refresh() 刷新容器

3、 registerBeanPostProcessors(beanFactory)  注册bean的后置处理器 方便拦截bean的创建

       1先获取ioc容器中已经定义了需要创建对象的所有BeanPostProcessor

       2给容器加别的BeanPostProcessor

       3优先注册实现了PriorityOrdered接口的BeanPostProcessor

       4在给容器中注册实现了Ordered接口的BeanPostProcessor

       5注册没实现优先级接口的BeanPostProcessor

             创建internalAutoProxyCreator的BeanPostProcessor

                   创建Bean的实例

                   populateBean 初始化Bean

                           1、 invokeAwareMethods() 处理Aware接口的方法回调

                           2、 applyBeanPostProcessorsBeforeInitialization() 应有后置处理器的BeforeInitialization( ) 

                           3、invokeInitMethods() 自定义的初始化方法

                           4、applyBeanPostProcessorsAfterInitialization ()  执行后置处理器的 postProcessAfterInitialization

4、BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)创建成功; aspectJAdvisorBuilder

   6 把beanPostProcessor注册到BeanFactory中 调用addBeanPostProcessor(postProcessor)

 

posted @ 2019-04-07 21:33 toov5 阅读(...) 评论(...) 编辑 收藏

基于注解方式声明切面(AOP) NULL 博文链接:https://1028826685.iteye.com/blog/1517747 立即下载

相关推荐

spring中自定义注解(annotation)与AOP中获取注解

spring中自定义注解(annotation)与AOP中获取注解.通过实例演示自定义注解。

spring注解:spring aop注解详解

AOP的基本概念、切面、切点、通知、环绕通知

weixin_37862824的博客 1万+

道闸不自动落杆故障排查:从传感器原理到控制器调试全解析

在工业自动化和物联网系统中,传感器与控制器构成的闭环控制是保障设备可靠运行的核心。其基本原理是通过传感器采集环境状态,控制器依据预设逻辑做出决策并驱动执行器动作。这一技术价值在于实现了无人值守下的安全、高效自动化,广泛应用于智能交通、安防和智能楼宇等领域。以停车场道闸系统为例,其自动落杆功能高度依赖地感线圈与防砸雷达的协同。地感线圈作为触发单元,负责感知车辆接近;而防砸雷达则作为持续监测的安全单元,通过微波探测防砸区域内是否有障碍物,其信号是控制器执行落杆决策的关键依据。当系统出现车辆通过后闸杆不落的典型故

weixin_29190651的博客 311

8 个Spring AOP 全部注解:真实业务使用案例说明(必须收藏)

Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者以声明式的方式实现横切关注点,如日志记录、事务管理、安全性控制等。通过使用Spring AOP注解,我们可以将这些横切逻辑与业务逻辑分离,从而保持代码的清晰和可维护性。AOP注解提供了一种强大的机制,使得开发者能够在不修改主业务逻辑代码的前提下,为应用程序添加丰富的横切功能,增强了代码的模块化和重用性。这些注解包括@Aspect、@Pointcut、@Before、@After、@AfterReturning、@After

肖哥弹架构博客 1630

手把手教你用SpringBoot+Vue3+Docker从零搭建一个在线OJ系统(附完整源码)

本文详细介绍了如何使用SpringBoot、Vue3和Docker从零搭建一个在线OJ系统,涵盖前后端开发、判题机实现及Docker容器化部署。通过完整的源码和实战步骤,帮助开发者掌握OJ系统的核心架构与关键技术,适用于算法训练、编程竞赛等场景。

weixin_42648844的博客 297

Excel插件开发实战:从零封装一个带自定义Ribbon的.xlam工具包

本文详细介绍了如何从零开发一个带自定义Ribbon的Excel插件.xlam工具包。通过VBA和XML技术,读者将学习到插件架构设计、Ribbon界面定制、模块化开发以及企业级部署策略,帮助提升Excel自动化办公效率。

weixin_42531128的博客 516

spring注解AOP详解

看了大概1个礼拜的java类加载机制和反射以及动态代理,总算对这些内容有了一个深刻的认识。类加载和反射就不在这里多说了,基于proxy实现的动态代理也不多说了,今天主要说一下基于spring注解的AOP。   Spring 的AOP,就是在运行时通过动态代理,动态的将某段代码织入到你的程序,从而在不影响原有的业务代码时增加了新的功能。   AOP涉及到如下几个概念: 切面 Aspect...

懒人的博客 168

破解拼多多网页字体加密的Python实现(静态)

爬取或者复制粘贴出来发现数字不是6372,而是这样的一个东西 ""从上图我们可以看出数字是一行的空白,后面被浏览器渲染后才展现的数字。我们可以用这个代码查看十六位进制对应的十进制,为什么要看十进制呢?​,而字体文件中的字符映射关系(cmap)也是以十进制存储的。我们搜索这个属性我们可以看到第一个这样的属性有一个URL,这个就是解密的字体包。然后我们构造一个这样的映射字典 key就是对应的十进制,后面的值就是对应的数字。然后我们需要封装一个函数,将加密文字和映射字典传入,返回解密后的数字。

weixin_64179111的博客 3540

Spring AOP详细介绍

import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties;   import javax.mail.Authenticator; import javax.mail.Message; import

思考、总结、专注 1756

【OpenClaw 实战】Ubuntu 双机 Gateway + Node 部署全流程 + 所有常见坑(2026版)

如果你只是需要浏览器自动化、截屏、简单系统查询 →Node 模式够用,别折腾 exec。如果你需要 GOLD 运行任意 shell 命令、git、npm、自定义脚本 →必须升级成 Gateway。bind lan + pairing approve + token 统一。后续想玩多 Agent 团队,优先考虑双/多 Gateway + 聊天通道互发(社区已有不少成功案例)。欢迎评论区留言你的环境和报错,一起交流!

hampeter的博客 1547

UNet改进(24):注意力机制-从基础原理到高级融合策略

本文系统探讨了如何通过引入各类注意力机制增强UNet在医学图像分割中的性能。文章分为基础篇、进阶篇和高级篇三个层级:基础篇介绍了时序注意力、可变形注意力、分层注意力等8种基础机制;进阶篇提出了5种混合注意力设计;高级篇则探讨了全局+局部+多尺度等复杂组合机制。实验表明,这些注意力模块在心脏MRI、肺部感染等任务中能提升2-15%的分割精度。文章还提供了硬件适配建议和完整实现代码,为研究者提供了全面的技术参考。未来方向包括NAS优化、量子注意力等前沿探索,为UNet在医疗影像等领域的应用革新提供了理论指导。

2501_91516851的博客 764

【JavaEE】Spring AOP的注解实现

基于注解@annotation 和 execution 的方式实现SPring AOP

yj20040627的博客 1万+

使用Python实现深度学习模型:智能极端天气事件预测

在本项目中,我们成功利用Python和Keras库构建了一个基于LSTM的极端天气预测模型。通过时间序列数据,模型能够识别天气趋势并预测未来的极端天气事件。尽管这是一个简化的示例,但它为实际应用中如何利用深度学习进行天气预测提供了一个很好的基础。随着更精确的数据和更多的特征信息,类似的模型可以进一步扩展到其他极端事件预测上,如风暴预警、气象灾害评估等。

Echo_Wish 730

Spring之AOP注解开发

Spring之AOP注解开发

楠黎倾风的博客 1万+

YOLO26魔改神技:YOLO26引入SimAM(无参注意力):不增加网络参数的3D能量函数提点黑科技

文章摘要 2026年YOLO26模型发布引发边缘计算革命,但特定场景精度不足问题催生注意力机制改进需求。本文聚焦无参数注意力机制SimAM,基于神经科学理论通过3D能量函数直接计算神经元权重,实现零参数量提升模型性能。文章深度解析YOLO26四大创新架构,对比SimAM与传统注意力机制差异,并探讨其在YOLO26中的集成方案。研究显示,SimAM在不增加模型体积前提下显著提升mAP指标,特别适合边缘端部署。全文涵盖架构设计、代码实现、竞品对比、部署方案等维度,为轻量化视觉模型优化提供系统解决方案。

ZDQ58818的博客 274

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring AOP注解开发详解

概念:指的是遵循特定的语法用于捕获每一个种类的可使用连接点的语法。作用:用于对符合语法格式的连接点进行增强。

xiaotiaoza的博客 1306

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring高手之路19——Spring AOP注解指南

创建切面类。

web15117360223的博客 739

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring AOP注解的方式校验参数

简介: 大家应该对Spring并不陌生,而且对Spring AOP也一样不陌生。本章讲解使用注解AOP方式去校验参数。首先,介绍一下Spring AOP的原理,Spring AOP采用动态代理实现, 在Spring 容器中的bean被代理对象所代替,代理对象加入了增强逻辑,当调用代理调用对象的方法时,目标对象的方法就会被拦截。该AOP在Controller使用,必须是SpringMVC容器中去管

_William_Cheung的博客 4435

spring中aop的注解实现方式

注解方式实现aop我们主要分为如下几个步骤 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类。 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象。(此注释修饰的方法的方法体为空,不需要写功能比如 public void say(){};就可以了,方法名可以被候命的具体服务功能所以引用,它可以被理解为切点对象的一个代理对象方法) 3.在对应的方...

wujian_csdn_csdn的博客 5571

使用Spring的注解方式实现AOP

Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。 首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar. 然后我们写一个接口 package com.bird.service; public interface PersonServe

技术是我的毕生追求 9万+

@EnableAspectJAutoProxy 注解如何开启 spring aop

@EnableAspectJAutoProxy 注解开启 spring aop

qq_41956014的博客 9659

Spring之aop注解实现

Spring中的AOP1.什么是AOP2.怎么实现AOP# 2.1AOP相关的注解介绍# 2.2实现AOP的xml配置# 2.3实现AOP# 2.4对相同切入点的公共化# 2.5设置多个增强类的优先级 1.什么是AOP Aop是java的spring框架中的一种特性,aop是面向切面编程的缩写,那什么是面向切面编程呢? 面向切面编程就是,在不对源码进行修改的情况下对源码所实现的功能进行增强。 举例说明 原本一个程序可以实现用户登入的功能,然后我想在这个功能的基础上,加入一个新的功能,就是对用户等级的判断,按

qq_47455973的博客 4139

Spring中AOP的注解方式的配置

上篇内容简单回顾 1、Spring的IOC的注解开发 (1)引入aop的包 引入context约束 配置文件中需要组件扫描:<context:component-scan /> (2)使用注解开发: @Component :定义Bean @Controller :WEB层 @Service :Service层 @Repository :DAO层 (3)属性注入: 普通属性 :@Value 对象属性 :@Resource @Autowired按类型注入属性,@Qulifier按名称注入属性。

pipizhen_的博客 956

Spring 通过注解方式实现AOP切面编程

Spring 切面编程的目的是实现代码的业务逻辑的解耦。切面编程用于诸如日志记录,事务处理,等非业务性的逻辑操作。目前Spring的Aop只能应用于方法层级上,无法在类、成员字段等层级上操作。以下是Srping的Aop编程分为注解方式和xml配置方式。以下过程详细说明了通过注解方式实现AOP编程的过程。 第一步:自定义注解 /** * 定义自定义管理员注解 * */ publ

清风徐来,水波不兴 1万+

Spring入门第七讲——Spring AOP的注解开发

在前一讲中,我已讲过Spring使用基于AspectJ的XML配置文件的方式进行AOP开发,现在我就来讲讲怎样使用基于AspectJ的注解的方式进行AOP开发。 使用基于AspectJ的注解的方式进行AOP开发 创建web项目,引入jar包 首先创建一个动态web项目,例如spring_demo03_aop,然后导入Spring框架相关依赖jar包,要导入哪些jar包呢?这里不废话,直接给出要导入...

李阿昀的博客 2345
上一篇: Spring注解(环境)
下一篇: Spring注解(事务)
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值