Spring——AOP(通知)

1. 搭建项目环境

2. 新建lib文件夹,添加spring依赖jar包:
spring-beans.jar、spring-context.jar、spring-core.jar、spring-expression.jar、【spring-aop.jar】

添加依赖包: commons-logging.jar、【aopalliance.jar】

3. 在项目src目录下新建applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

</beans>

4. 编辑dao、service等源码

5.在 applicationContext.xml的<beans>节点中管理bean对象实例
<!-- 实际对象 -->
<bean id="userDao" class="aop.UserDaoImpl"></bean>

6.定义通知类
//前置通知--MethodBeforeAdvice
public class LogBeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] args, Object target) throws Throwable {}
}
//后置通知 --AfterReturningAdvice
public class LogAfterAdvice implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {}
}
//环绕通知--MethodInterceptor
public class LogAroundAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
//调用方法
Object returnValue = methodInvocation.proceed();
}
}
//异常通知--ThrowsAdvice
public class LogThrowsAdvice implements ThrowsAdvice {
public void afterThrowing(Method m, Object[] args, Object target, Throwable throwable) {}
}
7.在 applicationContext.xml的<beans>节点中管理通知对象实例
<!-- 前置通知 -->
<bean id="logBeforeAdvice" class="aop.advice.LogBeforeAdvice"></bean>
<!-- 后置通知 -->
<bean id="logAfterAdvice" class="aop.advice.LogAfterAdvice"></bean>
<!-- 环绕通知 -->
<bean id="logAroundAdvice" class="aop.advice.LogAroundAdvice"></bean>
<!-- 异常通知 -->
<bean id="logThrowsAdvice" class="aop.advice.LogThrowsAdvice"></bean>

8.在 applicationContext.xml的<beans>节点中配置代理工厂实例
<!-- 代理工厂 bean -->
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理的接口 -->
<property name="proxyInterfaces" value="aop.IUserDao"/>
<!-- 代理的目标对象 -->
<property name="target" ref="userDao"/>
<!-- 通知列表 -->
<property name="interceptorNames">
<list>
<!--<value>logBeforeAdvice</value>前置通知-->
<!-- <value>logAfterAdvice</value> --><!--后置通知-->
<!-- <value>logAroundAdvice</value> --><!-- 环绕通知 -->
<value>logThrowsAdvice</value>
</list>
</property>
</bean>

9.测试
//加载xml文档
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");

//无代理,无通知
IUserDao dao = (IUserDao)factory.getBean("userDao");
//dao.updateUser();

//有代理,有通知
IUserDao proxyUserDao = (IUserDao)factory.getBean("proxyFactoryBean");
proxyUserDao.updateUser();

时间: 2024-10-24 01:07:53

Spring——AOP(通知)的相关文章

Spring AOP通知实例 – Advice

Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能. 在Spring AOP中,有 4 种类型通知(advices)的支持: 通知(Advice)之前 - 该方法执行前运行 通知(Advice)返回之后 – 运行后,该方法返回一个结果 通知(Advice)抛出之后 – 运行方法抛出异常后, 环绕通知 – 环绕方法执行运行,结合以上这三

关于Spring Aop 通知类型

1. 前置通知 * 在目标类的方法执行之前执行. * 配置文件信息:<aop:after method="before" pointcut-ref="myPointcut3"/> * 应用:可以对方法的参数来做校验 2. 最终通知 * 在目标类的方法执行之后执行,如果程序出现了异常,最终通知也会执行. * 在配置文件中编写具体的配置:<aop:after method="after" pointcut-ref="myP

Spring AOP 通知顺序

如果有多个通知在同一连接点执行,那执行顺序如何确定呢? 总共有两种情况:同一切面中通知执行顺序.不同切面中的通知执行顺序. 1.同一切面中通知执行顺序 1)前置通知/环绕通知proceed方法之前部分 2)被通知方法 3)后置通知/环绕通知proceed方法之后部分 annotation方式的顺序:环绕通知proceed方法之前部分---->前置通知---->被通知方法---->后置通知---->环绕通知proceed方法之后部分(多次测试结果显示如此,不知道具体原因) XML配置

spring aop的五种通知类型

昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. 回答问题的关键是,你得知道aop有哪几种通知类型吧! spring aop通知(advice)分成五类: 前置通知[Before advice]: 在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常. 正常返回通知[After returning advice]: 在连接点正常执行完

spring AOP和通知

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

Spring AOP 之 通知、连接点、切点、切面。

1:知识背景 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 2:面向切面的基本原理 什么是面向切面编程 横切关注点:影响应用多处的功能(安全.事务.日志) 切面: 横切关注点被模块化为特殊的类,这些类称为切面 优点: 每个关注点现在都集中于一处,而不是分散到多处代码中 服务模块更简洁,服务模块只需关注核心代码. AOP 术语 通知: 定义:切面也需要完成工作.在 AOP 术语中,切面的工作被称为通知. 工作内容:通知定义了

spring aop环绕通知记录应用的日志

使用的框架是spring mvc+spring 最近想利用spring aop的环绕通知来处理web的日志问题,总的来讲,如果在controller层做切入,则难监控实际运行情况,在service层做切入,则只能监控到service层的情况,通过捕捉service抛出的异常来记录日志,对于目前本人应用而言,已经足够了,先将记录如下: 代码: @Component @Aspect public class ExceptionLog { /** * 61 * 环绕通知需要携带ProceedingJo

Spring AOP前置通知和后置通知

Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP 在Spring中启用AspectJ注解支持 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.weaver.jar和spring-aspects.jar 将aop Schema添加到<beans>根元素中. 要在Spring IOC容器

sprint.net(2) AOP面向切面编程,spring.net的环绕通知;Spring.net的AOP通知的四种类型

AOP 有点类似于我们MVC里面的Filter过滤器,例如在MVC里面,如果给一个Action上打一个标签,就可以在这个Action执行之前或者之后,额外的执行一个方法,这个就相当于是面向切面编程. 无侵入式的. (也就是在不改变原来的代码的情况下,来跳转到一个其他的方法,执行完毕后回到主方法..),但是spring.net的AOP更牛叉,只需要在xml里面配置,就可以了,不需要在方法上面打特性的标签,也不需要继承什么类(例如MVC的过滤器是继承了ActionFilterAttribute) 主

Spring AOP 前置通知和后置通知

加入JAR包: 在配置文件中加入AOP 的命名空间 基于注解的注解的方式,配置文件如下: beans-aop-helloworld.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema