前言

在软件开发中,散布于应用中多处的功能被称为横切关注点,通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。把这些横切关注点和业务逻辑分离出来正是AOP要解决的问题。AOP能够帮我们模块化横切关注点,换言之,横切关注点可以被描述为影响应用多出的功能。这些横切点被模块化特殊的类,这些类被称为切面。
术语定义
通知:切面有必须要完成的工作,在AOP中,切面的工作被称为通知。通知定义了切面是什么以及何时使用,除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题,它应该在某个方法之前?之后?之前和之后都调用?还是只在方法抛出异常时调用?
连接点:连接点是应用程序执行过程中,能够插入切面的一个点。
切点:是在连接点的基础上定义切点,比方说一个类由十几个方法,每个方法的调用前和调用后都可以插入通知,但是你只想选择几个方法插入通知,因此你定义一个切点来选择你想插入的通知的方法。
切面:切面就是通知和切点的结合。
织入:织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:编译期、类加载期、运行期。其中编译器织入需要特殊的编译器,类加载器织入需要特殊的类加载器,spring的AOP 是在运行期织入通知的。
Spring的AOP支持
spring提供了AOP的四种支持,分别是:基于代理的经典Spring AOP模式;纯POJO切面;@AspectJ注解驱动的切面;@注入式AspectJ切面。spring所创建的通知都是用标准的Java类编写的,而且定义通知所应用的切点通常会使用注解或在Spring配置文件里采用XML来编写。
spring只支持方法级别的连接点。
在spring AOP中,要使用AspectJ的切点表达式语言来定义切点,关于Spring AOP的AspectJ切点,最重要的一点就是Spring仅支持AspectJ切点指示器的一个子集:
1.arg() 限制连接点匹配参数为指定类型的执行方法;
2.@args() 限制连接点匹配参数由指定注解标注的执行方法;
3.execution() 用于匹配是连接点的执行方法;
4.this() 限制连接点匹配AOP代理的bean引用为指定类型的类
5.target 限制连接点匹配目标对象为指定类型的类
6.@target() 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
7.within() 限制连接点匹配指定的类型
8.@within() 限制连接点匹配特定注解所标注的类型
9.@annotation 限定匹配带有指定注解的连接点
spring 注解创建切面
目标对象:
package concert;
public interface Performance{
public void perform();
}
切面对象:
package concert;
@Aspect//表示Audience的实例是一个切面
public class Audience{
@Before("execution(**concert.Performance.perform(..))")
public void silenceCellPhones(){
//在perfrom方法执行之前
}
@Before("execution(**concert.Performance.perform(..))")
public void takeSeats(){
//在perfrom方法执行之前
}
@AfterReturning("execution(**concert.Performance.perform(..))")
public void silenceCellPhones(){
//在perfrom方法执行之后
}
@AfterThrowing("execution(**concert.Performance.perform(..))")
public void silenceCellPhones(){
//在perfrom方法抛出异常之后
}
}
上面的类中切点表达式execution(**concert.Performance.perform(..))多次出现,我们也可以通过@Pointcut注解避免每次都写很长的切点表但是如下所示:
@Aspect//表示Audience的实例是一个切面
public class Audience{
@Pointcut("execution(**concert.Performance.perform(..))")
public void performance(){}
@Before("performance()")
public void silenceCellPhones(){
//在perfrom方法执行之前
}
@Before("performance()")
public void takeSeats(){
//在perfrom方法执行之前
}
@AfterReturning("performance()")
public void silenceCellPhones(){
//在perfrom方法执行之后
}
@AfterThrowing("performance()")
public void silenceCellPhones(){
//在perfrom方法抛出异常之后
}
}
接下来需要在配置文件中配置切面如下所示:
@Configuration
@EnableAspectJAutoProxy//启动AspectJ自动代理
@ComponentScan
public class ConcertConfig{
}
//或者在配置文件中配置中添加
<aop:aspectj-autoproxy />
表示启动切面代理
环绕通知:
@Aspect//表示Audience的实例是一个切面
public class Audience{
@Pointcut("execution(**concert.Performance.perform(..))")
public void performance(){}
@Before("performance()")
public void watchPerformance(ProceedingJoinPoint jp){
//在方法之前执行
System.out.println(" beform the method is invoked");
jp.proceed()//控制权交给目标方法
//在方法之后执行
System.out.println(" after the method is invoked");
}
}
处理通知中的参数
public class Audience{
@Pointcut("execution(**concert.Performance.perform(int))&&args(trackNumber)")
public void performance(){}
@Before("performance(trackNumber)")
public void watchPerformance(int trackNumber){
//截获传递给目标方法的参数并传递给切面中处理方法
System.out.println(trackNumber);
}
}
xml中声明切面
spring AOP提供的xml配置元素:
1.<aop:advisor> 定义AOP通知;
2.<aop:after> 后置通知;
3.<aop:after-returning> 返回通知
4.<aop:around> 环绕通知
5.<aop:aspect> 定义一个切面
6.<aop:aspectj-autoproxy> 启用切面注解驱动
7.<aop:before> 前置通知
8.<aop:config> 顶层的AOP配置元素;
9.<aop:pointcut>:定义个切点
<aop:config>
<aop:aspect ref="audience">
<aop:before
pointcut="execution(**concert.Performance.perform())" method="silenceCellPhones"/>
<aop:before
pointcut="execution(**concert.Performance.perform())" method="takeSeats"/>
<aop:after-returning
pointcut="execution(**concert.Performance.perform())" method="applause"/>
<aop:after-throwing
pointcut="execution(**concert.Performance.perform())" method="demandRefund"/>
</aop:aspect>
</aop config>
定义切点:
<aop:config>
<aop:aspect ref="audience">
<aop:pointcut id="performance" expression="execution(**concert.Performance.perform())">
<aop:before
pointcut-ref="performance" method="silenceCellPhones"/>
<aop:before
pointcut="performance" method="takeSeats"/>
<aop:after-returning
pointcut="performance" method="applause"/>
<aop:after-throwing
pointcut="performance" method="demandRefund"/>
</aop:aspect>
</aop config>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring的AOP机制
# spring
# aop原理
# aop实现方式
# Spring AOP中使用args表达式的方法示例
# 通过实例解析Spring argNames属性
# Spring AOP的使用详解
# 浅谈Spring AOP中args()和argNames的含义
# 是一个
# 横切
# 被称为
# 抛出
# 是在
# 配置文件
# 加载
# 所示
# 都是
# 几个
# 多个
# 基础上
# 最重要
# 你想
# 可以通过
# 只想
# 很长
# 只在
# 四种
# 多出
相关文章:
建站之星微信建站一键生成小程序+多端营销系统
C++中引用和指针有什么区别?(代码说明)
红河网站制作公司,红河事业单位身份证如何上传?
如何选择高效便捷的WAP商城建站系统?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
如何选择香港主机高效搭建外贸独立站?
清除minerd进程的简单方法
网站制作网站,深圳做网站哪家比较好?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
建站之星如何助力企业快速打造五合一网站?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
网站制作新手教程,新手建设一个网站需要注意些什么?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何通过远程VPS快速搭建个人网站?
广州建站公司哪家好?十大优质服务商推荐
建站之星备案流程有哪些注意事项?
建站主机选购指南与交易推荐:核心配置解析
广东专业制作网站有哪些,广东省能源集团有限公司官网?
如何用已有域名快速搭建网站?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
怀化网站制作公司,怀化新生儿上户网上办理流程?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
临沂网站制作公司有哪些,临沂第四中学官网?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
公众号网站制作网页,微信公众号怎么制作?
网站制作报价单模板图片,小松挖机官方网站报价?
营销式网站制作方案,销售哪个网站招聘效果最好?
Swift中swift中的switch 语句
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何将凡科建站内容保存为本地文件?
如何通过建站之星自助学习解决操作问题?
建站之星各版本价格是多少?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
如何在局域网内绑定自建网站域名?
如何用景安虚拟主机手机版绑定域名建站?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
魔方云NAT建站如何实现端口转发?
网站专业制作公司有哪些,做一个公司网站要多少钱?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
PHP 500报错的快速解决方法
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
焦点电影公司作品,电影焦点结局是什么?
如何使用Golang安装API文档生成工具_快速生成接口文档
网站app免费制作软件,能免费看各大网站视频的手机app?
如何通过多用户协作模板快速搭建高效企业网站?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
*请认真填写需求信息,我们会在24小时内与您取得联系。