SpringAOP的xml实例、注解形式实例、概念理解 以及execution表达式实例与概念说明

(1)Spring AOP的简单应用:

-->AOP:(Aspect Orinted Programming)面向切面编程,用于具有横切逻辑的场合,如:访问控制,事务管理,性能检测,由切入点和增强处理组成。

AOP主要核心是:在什么位置(pointcut:切入点)执行什么功能(advice:增强处理),AOP在Java里是利用反射机制实现,

关键词:
-->Aspect(切面):一个模块化的横切逻辑,类似于 Java 中的类声明。
-->Join Point(连接点):原程序执行过程中的某一个点,构造方法调用,字段的设置和获取,方法的调用,方法的执行,异常的处理执行,类的初始化。比如方法1-->方法2-->方法3,此时方法2可以称作一个连接点

-->Advice(增强处理):在连接点上执行的代码逻辑,Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。eg:在2的前后加上日志输出
-->Pointcut(切入点):对连接点的描述,即匹配的条件,它定义了相应的 Advice 将要发生的地方,eg:假如符合2连接点的某一个特征,执行增强程序
-->Target Object(目标对象):被切面增强的对象
-->Weaving(织入):执行增强处理程序的过程

xml文件配置实现方式:

 1 <!-- 注解方式配置事物 -->
 2 <tx:annotation-driven transaction-manager="transactionManager" />
 3 <bean class="com.one.ssm.impl.aopTest.UserServiceLogger" />
 4 <aop:aspectj-autoproxy/>
 5 注意:需要在配置文件中加入<aop:aspectj-autoproxy/>就可以启用对@AspectJ注解的支持
 6 <!--Aop配置实例-->
 7 <bean id="thLogger" class="com.one.ssm.impl.aopTest.UserServiceLogger"></bean>
 8 <aop:config>
 9 <aop:pointcut id="pointcut" expression="execution(public void *(..))"></aop:pointcut>
10 <aop:aspect ref="thLogger">
11 <!--前置增强-->
12 <aop:before method="before" pointcut-ref="pointcut"/>
13 <!--后置增强-->
14 <aop:after-returning returning="result" method="afterRunning" pointcut-ref="pointcut"/>
15 <!--异常抛出增强-->
16 <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/>
17 <!--实现最终增强,无论如何都要执行,相当于finally-->
18 <aop:after method="afterLogger" pointcut-ref="pointcut"/>
19 <!--实现环绕增强,通过方法名为ProceedingJoinPoint类型的参数获取连接点的信息
20 她的proceed()方法可以调用真正的目标方法,实现对连接点的完全控制-->
21 <aop:around method="aroundLogger" pointcut-ref="pointcut"/>
22 </aop:aspect>
23 </aop:config>

xml配置方式

注解实现方式:

 1 @Aspect //将UserServiceLogger 定义为切面
 2 public class UserServiceLogger {
 3 private static final Logger log=Logger.getLogger("UserServiceLogger.class");
 4
 5 @Before("excution(*service.UserService.*(..))")//将before()方法定义为前置增强
 6 public void before(JoinPoint jp){
 7 log.info("前置增强:调用"+jp.getSignature().getName().toString()+"的方法执行," +
 8 "方法入参:"+Arrays.toString(jp.getArgs()));
 9 }
10 @ afterRunning("excution(*service.UserService.*(..))" returning =result)    //代表将afterRunning()方法定义为后置增强
11 public void afterRunning(JoinPoint jp,Object result){
12 log.info("后置增强"+jp.getSignature().getName().toString()+"的方法执行"+
13 "方法入参:"+Arrays.toString(jp.getArgs()));
14 }
15 //异常抛出增强
16 public void afterThrowing(JoinPoint jp,RuntimeException e){
17 log.info(jp.getSignature().getName().toString()+"方法异常为:"+e);
18 }
19 //最终增强
20 public void afterLogger(JoinPoint jp){
21 log.info(jp.getSignature().getName().toString()+"方法结束执行。"+
22 "方法入参:"+Arrays.toString(jp.getArgs()));
23 }
24 //环绕增强
25 public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable {
26 log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+"方法。方法入参:"
27 + Arrays.toString(jp.getArgs()));
28 try {
29 //执行目标方法并获得返回值
30 Object result=jp.proceed();
31 log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+result);
32 return result;
33 } catch (Throwable e) {
34 log.info(jp.getSignature().getName().toString()+"方法发生异常"+e);
35 throw e;
36 }finally {
37 log.info(jp.getSignature().getName().toString()+"方法结束执行");
38 }

java代码实现

(2)execution表达式实例与概念说明

execution()        表达式的主体;
第一个”*“符号         表示返回值的类型任意;
包名后面的”..“          表示当前包及子包
第二个”*“ 表示类名     表示所有类。
.*(..) 表示任何方法名,   括号表示参数,两个点表示任何参数类型
基本语法格式为:
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)  除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。

execution(public * *(..)):任意公共方法的执行

execution(* *To(..)):匹配目标类所有以To为后缀的方法

execution(* com.xyz.service.AccountService.*(..)) :定义在service包里的任意方法的执行

execution(* com.xyz.service.*.*(..))   :定义在service包和所有子包里的任意类的任意方法的执行:

execution(* com..*.*Dao.find*(..)) :匹配包名前缀为com的任何包下类名后缀为Dao的方法,方法名必须以find为前缀

execution(* joke(String,..))):匹配目标类中的joke()方法,该方法第 一个入参为String,后面可以有任意个入参且入参类型不限,如joke(String s1)、joke(String s1,String s2)和joke(String s1,double d2,Strings3)都匹配

以上内容个人学习所得,仅供参考!!!

原文地址:https://www.cnblogs.com/zxh-xy/p/10699455.html

时间: 2024-10-10 20:26:02

SpringAOP的xml实例、注解形式实例、概念理解 以及execution表达式实例与概念说明的相关文章

hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xml文件 和 注解方式 来自动生成数据表 其中只是整了spring.hibernate,struts部分没有整.也就是说我只是测试了能够自动生成数据表(自动生成为"标准",自认为是对的......) 下面是配置和代码: 使用工具:myeclipse 2014 ,其中web project项目

spring面向切面编程示例(xml配置形式[email&#160;protected]注解形式)

一.xml配置形式 1.在Spring配置文件中增加面向切面配置当调用com.activemq.service.impl.ConsumerServiceImpl接口实现类的任意方法时执行切面类中的方法. 2.写切面类 注意:1)不能对web层(比如:com.activemq.action.ConsumerController)做代理插入操作,亲测无效.(之前认为对web层进行切面处理无效,其实不是,无效的原因在于切面配置所在的文件,如果是spring-mvc.xml(Springmvc的配置文件

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.

Spring AOP注解形式简单实现

实现步骤: 1:导入类扫描的注解解析器 命名空间:xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-2.5.xsd" xml配置文件如下配置

SSM框架中以注解形式实现事务管理

上一篇博文<SSM三大框架整合详细教程>详细说了如何整合Spring.SpringMVC和MyBatis这三大框架.但是没有说到如何配置mybatis的事务管理,实现开发中,事务是必不可少的.本篇作为对上一篇的补充,说明在SSM框架中如何使用注解的形式进行事务管理. 什么是事务? 在编写业务的过程中,会需要进行事务处理,当需要执行多条插入语句时,如果前几条成功,而最后一条失败,那么我们需要回滚数据库操作,保持数据的一致性和完整性,此时,就需要利用DB的事务处理.事务是恢复和并发控制的基本单位.

SSM框架——以注解形式实现事务管理

上一篇博文<SSM三大框架整合详细教程>详细说了如何整合Spring.SpringMVC和MyBatis这三大框架.但是没有说到如何配置mybatis的事务管理,在编写业务的过程中,会需要进行事务处理,当需要执行多条插入语句时,如果前几条成功,而最后一条失败,那么我们需要回滚数据库操作,保持数据的一致性和完整性,此时,就需要利用DB的事务处理.事务是恢复和并发控制的基本单位. 简单来说,所谓的事务,是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 事务应该具有4个

Spring学习(六)spring整合注解形式的hibernate

上篇博客中谈到spring中如何整合普通形式的hibernate,这次我们来总结下如何整合注解形式的hibernate. 我们知道在普通hibernate中,表与实体的映射关系是写在映射关系文件当中的,一个实体类对应一个映射关系配置文件.而在注解形式中是没有这个映射关系文件的,关系直接在实体类中通过注解的方式展现,所以写法上略有些不同. 下面我们通过一个例子来看看他们的区别.还是使用上篇博客的例子,先去掉这个hibernate反向生成的City.hbm.xml文件. Dao层里面是不需要修改的,

spring.xml及注解

spring.xml配置文件中配置注解: 开启注解(及自动扫描包中bean): 1:<context:component-scan base-package="com.bzu" />    在base-packge指定所需要扫描的包,建议指定一个包含整个架构的包,可以扫描到各层所定义的bean; 或2:<context:annotation-config />   2种方法选一; 引入外部properties文件,常为数据库连接配置文件; 1:<bean

【协议分析】Wireshark 过滤表达式实例

Wireshark 过滤表达式实例 1.wireshark基本的语法 字符 \d          0-9的数字 \D          \d的补集(以所以字符为全集,下同),即所有非数字的字符 \w          单词字符,指大小写字母.0-9的数字.下划线 \W          \w的补集 \s          空白字符,包括换行符\n.回车符\r.制表符\t.垂直制表符\v.换页符\f \S          \s的补集 .  除换行符\n外的任意字符. 在Perl中, ".&qu