Spring 中各种通知

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:aop="http://www.springframework.org/schema/aop"
 4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 7            http://www.springframework.org/schema/aop
 8            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
 9 <!--
10         1、引入AOP的命名空间
11             xmlns:aop="http://www.springframework.org/schema/aop"
12             http://www.springframework.org/schema/aop
13             http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
14         2、目标类
15         3、切面
16         4、拦截器  由spring内部实现
17         5、aop的配置
18      -->
19 <bean id="personDao" class="cn.test.aop.PersonDaoImpl"></bean>
20 <bean id="transaction" class="cn.test.aop.Transaction"></bean>
21
22 <!-- aop配置 -->
23 <aop:config>
24     <!-- 切入点表达式
25      expression
26         确定哪个类可以生成代理对象
27         id  唯一标识  -->
28     <aop:pointcut expression="execution(* cn.test.aop.PersonDaoImpl.*(..))" id="perform"/>
29     <!-- 切面 -->
30     <aop:aspect ref="transaction">
31         <!-- 前置通知
32               *  在目标方法执行之前
33               -->
34         <aop:before method="beginTransaction" pointcut-ref="perform"/>
35         <!-- 后置通知
36                  *  在目标方法执行之后
37                  *  可以根据returning获取目标方法的返回值
38                  *  如果目标方法遇到异常,该通知不执行
39               -->
40         <aop:after-returning method="commit" pointcut-ref="perform" returning="val"/>
41         <!-- 前置通知和后置通知只能在目标方法文中添加内容,但是控制不了目标方法的执行  -->
42         <!--
43                  最终通知
44                     *  在目标方法执行之后
45                     *  无论目标方法是否遇到异常,都执行
46                     *  经常做一些关闭资源
47         -->
48         <aop:after method="finallyMethod" pointcut-ref="perform"/>
49         <!--
50                  异常通知
51                     目的就是为了获取目标方法抛出的异常
52         -->
53         <aop:after-throwing method="exceptionMethod" throwing="ex" pointcut-ref="perform"/>
54
55     </aop:aspect>
56 </aop:config>
57
58
59 </beans>
 Transaction.java1 public class Transaction {
 2     //joinPoint 连接点信息
 3     public void beginTransaction(JoinPoint joinPoint){
 4         joinPoint.getArgs();//获取方法的参数
 5         String methodName = joinPoint.getSignature().getName();
 6         System.out.println(methodName);
 7         System.err.println("begin trans action");
 8     }
 9     public void commit(JoinPoint joinPoint,Object val){
10         System.err.println("commit");
11     }
12
13     public void finallyMethod(){
14         System.err.println("finally method");
15     }
16
17     public void exceptionMethod(Throwable ex){
18         System.err.println(ex.getMessage());
19     }
20
21     /**
22      * 环绕通知
23      *     能控制目标方法的执行
24      */
25
26     public void aroundMethod(ProceedingJoinPoint joinPoint){
27         String methodName=joinPoint.getSignature().getName();
28         if("addPerson".equals(methodName)){
29
30         }
31     }

测试:

 1 /**
 2      * 原理
 3      *    *  加载配置文件,启动spring容器
 4      *    *  spring容器为bean创建对象
 5      *    *  解析aop的配置,会解析切入点表达式
 6      *    *  看纳入spring管理的那个类和切入点表达式匹配,如果匹配则会为该类创建代理对象
 7      *    *  代理对象的方法体的形成就是目标方法+通知
 8      *    *  客户端在context.getBean时,如果该bean有代理对象,则返回代理对象,如果没有代理对象则返回原来的对象
 9      * 说明:
10      *    如果目标类实现了接口,则spring容器会采用jdkproxy,如果目标类没有实现接口,则spring容器会采用
11      *      cglibproxy
12      *
13      *      */
14     @Test
15     public void doSome(){
16
17         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("cn/test/aop/applicationContext.xml");
18         PersonDao personDao= (PersonDao) applicationContext.getBean("personDao");
19
20         personDao.addPerson();
21
22     }
时间: 2024-10-25 21:49:33

Spring 中各种通知的相关文章

Spring中的AOP(8)

Spring的传统AOP AOP:不是由Spring定义.AOP联盟的组织定义.Spring中的通知:(增强代码) 前置通知 org.springframework.aop.MethodBeforeAdvice* 在目标方法执行前实施增强 后置通知 org.springframework.aop.AfterReturningAdvice* 在目标方法执行后实施增强 环绕通知 org.aopalliance.intercept.MethodInterceptor* 在目标方法执行前后实施增强 异常

spring中订阅redis键值过期消息通知

1.首先启用redis通知功能(ubuntu下操作):编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登陆redis-cli之后,输入以下命令: config set notify-keyspace-events Ex 更多通知详见:http://redis.io/topics/notifications#configuration 2.Java Spring中配置监听 接口类: import java

spring中的AOP 以及各种通知

理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了这个问题,通过 execution表达式 指定哪些包中的那些类 哪些方法 用到事务 execution(public * *(..))  所有的公共方法 execution(* set*(..))  以set开头的任意方法 execution(* com.xyz.service.AccountSer

Spring中关于AOP的实践之AspectJ方式实现通知

(本文中如有不当之处,恳请批评指正) AspectJ方式的简化了通知的出现复杂度.但是对配置文件的操作复杂度有了一定的提升 一. 配置通知 1 package com.xkx.adviceDemo; 2 3 import org.aspectj.lang.ProceedingJoinPoint; 4 5 public class TotalAdvice { 6 7 public void myBefore(){ 8 System.out.println("aspectj方式:物资准备,人员准备,

spring AOP和通知

1.  spring的通知 1.1.  AOP的概念 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子.在Spring AOP中,切面可以使用基于模式或者基于注解的方式来实现. 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接点总是表示一个方法的执行. 通知(Advice):在切面的某个特定的连接点上执行的动作.其中包括了"aroun

spring中的aop注解(整合junit测试)

使用spring中的aop前先来了解一下spring中aop中的一些名词 Joimpoint(连接点):目标对象中,所有可能增强的方法 PointCut(切入点):目标对象,已经增强的方法 Advice(通知/增强):增强的代码 Target(目标对象):被代理对象 Weaving(织入):将通知应用到切入点的过程 Proxy(代理):将通知织入到目标对象之后,形成代理对象 aspect(切面):切入点+通知 一:不使用spring的aop注解 以javaEE中的service层为例 UserS

Spring中的AOP(五)——在Advice方法中获取目标方法的参数

摘要: 本文介绍使用Spring AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数. 获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Ob

Spring中的设计模式

[Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用] [http://www.geek521.com/?p=6883] [http://blog.csdn.net/fg2006/article/details/6435410] [http://ylsun1113.iteye.com/blog/828542 ] 1.简单工厂  又叫做静态工厂方法(StaticFactory Method)模式,但不属

Spring中的AOP应用

AOP被称为面向切面编程,AOP中的几个重要概念是: 1.切面.切面就是要实现的功能.切面通常是在多数方法中会用到的相同功能,如写日志. 2.连接点.连接点就是应用程序执行过程中插入切面的地点.如:方法的调用,异常的抛出. 3.通知.通知就是某个切入点要执行的代码,Spring中有四种通知类型:环绕通知(around),前置通知,后置通知和异常通知. 4.切入点.切入点定义了通知应该应用在那些连接点上. 5.引入.引入允许你为已存在的类添加新方法和属性. 6.目标对象.目标对象就是被通知的对象.