Spring中三大核心思想之一AOP(面向切面编程):

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
(更深入请百度)
Spring 2.0在AOP上有很大的改进。首先,AOP XML的配置更加简单了,Spring2.0引入了新的模式,支持定义从常规Java对象中发展来的切面,充分利用了AspectJ切入点语言,提供了完整类型的Advice(也就是没有多余转换和Object[] 参数操作)。另外,得意于Annotation的发展,Spring2.0提供了对@AspectJ切面的支持,这些切面可以在AspectJ与Spring AOP中共享,需要的仅仅是简单的配置。
 
AOP机制?
使用AOP仍然需要修改所有的方法,但是修改这个方法的过程由Spring来帮我们完成
 
 AOP通知类型:
  前置通知,关键词before。指的是在一个方法执行前通知。
   后置通知,关键词after。指的是在一个方法执行后进行通知。
   环绕通知,关键词around。值的是在一个方法之前与之后执行进行通知。
   异常抛出后通知,throw。在一个方法执行过程中之后并且抛出异常进行通知。
操作代码记录:
  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<!-- 定义bean -->
<bean id="stuService" class="com.lxit.aop.service.StudentService" />
<!-- AOP配置 -->
<!-- 添加Aspect的bean -->
<bean id="logAspect" class="com.lxit.aop.aspect.LogAspect" />
<aop:config>
<!-- 定义一个pointcut -->
<aop:pointcut id="servicepointcut"
expression="execution(* com.lxit.aop.service.*.*(..))" />
<!-- 定义aspect,引用生成的aspectBean 并指定pointcut 和 method-->
<aop:aspect id="aspect1" ref="logAspect">
<aop:after pointcut-ref="servicepointcut" method="logAdd" />
</aop:aspect>
</aop:config>
</beans>
public static void main(String[] args) {
ApplicationContext ac =
new ClassPathXmlApplicationContext("spring.xml");
StudentService service = (StudentService) ac.getBean("stuService");
service.add();
service.getStudent();
}

异常抛出增强:

异常抛出增强的特点是在目标方法抛出异常时织入增强处理,
但是异常处理一般会需要获取异常参数。
在配置文件中添加异常处理的aspect。
使用<aop:after-throwing来进行异常织入。

public class ExceptionAspect {
public void exceptionLog(Exception e){
System.out.println("发生异常,写入日志。" + e.getMessage());
}
}
<bean id="exceptionAspect" class="com.lxit.aop.aspect.ExceptionAspect" />
<aop:config>
<!-- 定义一个pointcut -->
<aop:pointcut id="servicepointcut"
expression="execution(* com.lxit.aop.service.*.*(..))" />
<!-- 定义aspect,引用生成的aspectBean 并指定pointcut 和 method-->
<aop:aspect id="aspect2" ref="exceptionAspect">
<!-- 表示当程序发生异常后才织入 -->
<aop:after-throwing method="exceptionLog"
pointcut-ref="servicepointcut" throwing="e"/>
</aop:aspect>
</aop:config>

环绕增强:

环绕增强在目标方法的前后都可以织入增强处理
环绕增强是功能最强大的增强处理,Spring把目标方法的控制权全部交给了它
在环绕增强处理中,可以获取或修改目标方法的参数、返回值,可以对它进行异常处理,甚至可以决定目标方法是否执行

public class AroundLogger {
public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable { … }
}
<bean id="theLogger" class="aop. AroundLogger"></bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* biz.IUserBiz.*(..))" />
<aop:aspect ref="theLogger">
<aop:around method="aroundLogger" pointcut-ref="pointcut" />
</aop:aspect>
</aop:config>

五中织入方式的区别:
<aop:before …>:在目标方法调用之前织入。
只要before方法执行完成,目标方法总会被调用,但before可以通过抛出异常来阻止目标方法执行,before不能访问目标方法的返回值。

<aop:after…>:在目标方法调用之后织入。
after不能组织目标方法的执行,after不能访问目标方法的返回值。

<aop:after-throwing..>:抛出异常时织入。如果指定throwing必须指定一个异常参数,增强方法中必须和此参数同名,类型必须大于该异常类型。

<aop:after-returning…>:在目标方法成功执行之后织入。
after-returning:不能阻止目标方法的执行,可以访问目标方法的返回值,但不能修改。

<aop:around…>:在目标方法调用之前和调用之后织入。它的处理方法必须包含一个ProceedingJoinPoint形参。
aop:around:可以组织目标方法的执行,可以访问目标方法的返回值,可以修改返回值。

以上增强器都可以指定args来指定参数

在Struts2,hibernate,Spring整合中就可以看到一种很好的效果。

在serivce层定义成一个切点在执行操作前可以开启一系列操作,比如写入日志,事务等操作是一种典型的案例。

AOP使用场景

AOP用来封装横切关注点,具体可以在下面的场景中使用:

Authentication 权限 Caching 缓存 Context passing 内容传递 Error handling 错误处理 Lazy loading 懒加载

Debugging  调试 logging, tracing, profiling and monitoring 记录跟踪 优化 校准 Performance optimization 性能优化

Persistence  持久化 Resource pooling 资源池 Synchronization 同步 Transactions 事务

 

SpringAOP面向切面编程的更多相关文章

  1. JavaWeb_(Spring框架)SpringAOP面向切面编程

    SpringAOP:面向切面编程(面向fifter编程) 通俗易懂术语:所有纵向重复的代码,我们提取成横向的代码 以下文章内容参考知乎:从0带你学习SpringAOP,彻底的理解AOP思想 传送门 1 ...

  2. SpringAOP 面向切面编程

    AOP的相关概念 AOP:全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改 ...

  3. Spring-AOP面向切面编程

    AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...

  4. 了解并使用springAOP(面向切面编程)

    Aop是干嘛的为什么要使用它 在业务系统中,总有一些散落,渗透到系统的各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也称切面, 我们怎样才不受这些附加要求的干扰,专心于真正 ...

  5. Spring--AOP(面向切面)编程

    AOP 切面就像一把菜刀,将Java处理业务流程进行分割,在分割处添加特定的业务处理.主要应用于声明事务.安全和缓存.在本文中,主要介绍两种切面的实现方法--Java配置和XML配置. Java配置 ...

  6. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  7. spring入门(四)【面向切面编程】

    开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...

  8. 面向切面编程AOP

    本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...

  9. Spring面向切面编程(AOP)

    1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即 ...

随机推荐

  1. jstl-----之<set>标签

    <table id="attachtab" border="0" cellpadding="0" cellspacing=" ...

  2. redis-deskmanager 连不上 虚拟机 - centos redis

    1.没设置redis密码 : https://blog.csdn.net/HUXU981598436/article/details/54668779 2.关闭防火墙

  3. 算法-链的操作(一)-合并两个排序的链接(no.25)

    合并两个排序的链接(no.25) 把下面连个排好序的链,从小到大排序链接. list1 : 1 -> 6 -> 8 list2 : 2-> 5 -> 9 def merge(h ...

  4. 20165234 《Java程序设计》第五周学习总结

    第五周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类 内部类:在一个类中定义另一个类. 外嵌类:包含内部类的类,称为内部类的外嵌类. 内部类的类体中不能声明类变量和类方法.外嵌类的类体中可 ...

  5. SpringBoot实现标准的OAuth服务提供商

    ⒈添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  6. 基于ATT和CK™框架的开放式方法评估网络安全产品

    场景 提供有关如何使用特定商业安全产品来检测已知对手行为的客观见解 提供有关安全产品和服务真实功能的透明度以检测已知的对手行为 推动安全供应商社区增强其检测已知对手行为的能力 地址 https://a ...

  7. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  8. ajax跨域请求 Uncaught SyntaxError: Unexpected token :

    最近使用前后端分离开发项目比较多,经常碰到的一个问题就是,前端静态页面请求,后端api获取数据,很多时候,前端和后端都不是在同一个域下的(协议,域名,端口). 这里使用的是ajax请求,因为浏览器的同 ...

  9. windows系统下简单nodejs安装及环境配置

      相信对于很多关注javascript发展的同学来说,nodejs已经不是一个陌生的词眼,这里不想谈太多的nodejs的相关信息.只说一下,windows系统下简单nodejs环境配置     相信 ...

  10. CDHtmlDialog探索----Javascript与窗体交互

    CDHtmlDialog提供了C++与网页的双向交互,通此一系统简单的宏调用可以把网页中各元素的事件直接映射到C++程序中,而在网页中调用C++功能代码就显的不那么直观了.归根结底交互的基理就是实现相 ...