【Java学习之Spring】Spring AOP学习笔记(二)

本文介绍了Spring AOP代理的创建规则,包括默认使用Java动态代理和CGLIB的情况。重点讲解了切入点表达式,如`execution`、`within`等,以及如何组合和引用切入点表达式。此外,还详细阐述了AspectJ的kinded、scoping和contextual指示符,帮助读者深入理解Spring AOP的使用。

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

Spring对AOP的支持

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理,故AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。

Spring创建代理的规则为:

1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了

2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB

AOP编程时,我们只需要参与到三个部分:

1、定义普通业务组件

2、定义切入点,一个切入点可能横切多个业务组件

3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作

即:代理对象的方法=增强处理+被代理对象

Spring AOP支持以下AspectJ切入点指示符(PCD)用于切入点表达式:

  • execution:用于匹配方法执行连接点。这是使用Spring AOP时使用的主要切入点指示符。
  • within:限制匹配某些类型中的连接点(使用Spring AOP时在匹配类型中声明的方法的执行)。

  • this:限制与连接点的匹配(使用Spring AOP时执行方法),其中bean引用(Spring AOP代理)是给定类型的实例。

  • target:限制匹配连接点(使用Spring AOP时执行方法),其中目标对象(被代理的应用程序对象)是给定类型的实例。

  • args:限制与连接点的匹配(使用Spring AOP时执行方法),其中参数是给定类型的实例。

  • @target:限制与连接点的匹配(使用Spring AOP时执行方法),其中执行对象的类具有给定类型的注释。

  • @args:限制与连接点的匹配(使用Spring AOP时执行方法),其中传递的实际参数的运行时类型具有给定类型的注释。

  • @within:限制匹配到具有给定注释的类型中的连接点(使用Spring AOP时执行在具有给定注释的类型中声明的方法)。

  • @annotation:限制连接点的匹配,其中连接点的主题(在Spring AOP中执行的方法)具有给定的注释。

结合Pointcut表达式

组合切入点表达式,可以使用&&, ||和组合!。您还可以按名称引用切入点表达式,下面是三个切入点表达式:

@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {} 

@Pointcut("within(com.xyz.someapp.trading..*)")
private void inTrading() {} 

@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} 

anyPublicOperation 如果方法执行连接点表示任何公共方法的执行,则匹配

inTrading 如果方法执行在交易模块中,则匹配

tradingOperation 如果方法执行表示交易模块中的任何公共方法,则匹配

常见的切入点表达式

1.执行任何公共方法:

execution(public * *(..))

2.执行名称以以下开头的任何方法set

execution(* set*(..))

3.执行AccountService接口定义的任何方法:

execution(* com.xyz.service.AccountService.*(..))

4.执行service包中定义的任何方法:

execution(* com.xyz.service.*.*(..))

5.执行服务包或其子包中定义的任何方法:

execution(* com.xyz.service..*.*(..))

6.服务包中的任何连接点(仅在Spring AOP中执行方法):

within(com.xyz.service.*)

7.服务包或其子包中的任何连接点(仅在Spring AOP中执行方法):

within(com.xyz.service..*)

8.代理实现AccountService接口的任何连接点(仅在Spring AOP中执行方法) :

this(com.xyz.service.AccountService)

9.目标对象实现AccountService接口的任何连接点(仅在Spring AOP中执行方法):

target(com.xyz.service.AccountService)

10.采用单个参数的任何连接点(仅在Spring AOP中执行方法)以及在运行时传递的参数是Serializable

args(java.io.Serializable)

11.目标对象具有@Transactional注释的任何连接点(仅在Spring AOP中执行方法) :

@target(org.springframework.transaction.annotation.Transactional)

12.任何连接点(仅在Spring AOP中执行的方法),其中目标对象的声明类型具有@Transactional注释:

@within(org.springframework.transaction.annotation.Transactional)

13.任何连接点(仅在Spring AOP中执行方法),其中执行方法具有 @Transactional注释:

@annotation(org.springframework.transaction.annotation.Transactional)

14.任何连接点(仅在Spring AOP中执行的方法),它接受一个参数,并且传递的参数的运行时类型具有@Classified注释:

@args(com.xyz.security.Classified)

15.名为的Spring bean上的任何连接点(仅在Spring AOP中执行方法) tradeService

bean(tradeService)

16.具有与通配符表达式匹配的名称的Spring bean上的任何连接点(仅在Spring AOP中执行方法)*Service

bean(*Service)

AspectJ指示符

现有的指示符自然分为三组:kinded,scoping和contextual:

  1. Kinded代号选择特定类型的连接点的: executiongetsetcall,和handler

  2. 范围界定指示符选择一组感兴趣的连接点(可能是多种类型):withinwithincode

  3. 基于上下文语境指示符匹配(和任选的绑定): , thistarget@annotation

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值