Spring学习十四----------Spring AOP实例
© 版权声明:本文为博主原创文章,转载请注明出处
实例
1.项目结构
2.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.spring</groupId>
<artifactId>Spring-AOP</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Spring-AOP Maven Webapp</name>
<url>http://maven.apache.org</url> <properties>
<!-- 统一spring版本 -->
<spring.version>4.3.8.RELEASE</spring.version>
</properties> <dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Spring Core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.5.4</version>
</dependency>
</dependencies> <build>
<finalName>Spring-AOP</finalName>
</build> </project>
3.AspectBiz.java
package org.spring.aop.biz; public class AspectBiz { /**
* 执行正常的业务方法
*/
public void biz() { System.out.println("执行了AspectBiz中的业务方法,无异常"); } /**
* 执行存在异常的业务方法
*/
public void throwingBiz() { System.out.println("执行了AspectBiz中的业务方法,存在异常");
throw new RuntimeException(); } /**
* 执行正常的含参的业务方法
*
* @param arg1
* 参数一
* @param arg2
* 参数二
*/
public void paramterBiz(String arg1, int arg2) { System.out.println("执行了AspectBiz中的业务方法,参数是arg1:" + arg1 + " arg2:" + arg2); } }
4.Aspect.java
package org.spring.aop.aspect; import org.aspectj.lang.ProceedingJoinPoint; public class Aspect { /**
* 前置通知
*/
public void before() { System.out.println("执行了Aspect切面的前置通知"); } /**
* 返回后通知,正常返回,抛出异常时不执行
*/
public void afterReturning() { System.out.println("执行了Aspect切面的正常返回后通知"); } /**
* 抛出异常后通知
*/
public void afterThrowing() { System.out.println("执行了Aspect切面的抛出异常后通知"); } /**
* 后通知,不管是否抛出异常
*/
public void after() { System.out.println("执行了Aspect切面的后通知"); } /**
* 环绕通知,环绕通知的第一个参数必须是ProceedingJoinPoint
*
* @param pjp
*/
public Object around(ProceedingJoinPoint pjp) { Object obj = null;
try {
System.out.println("Aspect切面环绕通知开始执行");
obj = pjp.proceed();
System.out.println("Aspect切面环绕通知执行结束");
} catch (Throwable e) {
e.printStackTrace();
}
return obj; } /**
* 含参环绕通知,环绕通知的第一个参数必须是ProceedingJoinPoint
*
* @param pjp
*/
public Object aroundParamter(ProceedingJoinPoint pjp, String arg1, int arg2) { Object obj = null;
try {
System.out.println("Aspect切面环绕通知开始执行");
System.out.println("参数是arg1:" + arg1 + " arg2:" + arg2);
obj = pjp.proceed();
System.out.println("Aspect切面环绕通知执行结束");
} catch (Throwable e) {
e.printStackTrace();
}
return obj; } }
5.Fit.java
package org.spring.aop; public interface Fit { public void filter(); }
6.FitImpl.java
package org.spring.aop.impl; import org.spring.aop.Fit; public class FitImpl implements Fit { public void filter() { System.out.println("FitImpl filter."); } }
7.spring-aop.xml
<?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.xsd"> <bean id="aspectBiz" class="org.spring.aop.biz.AspectBiz"/><!-- 业务逻辑类 --> <bean id="aspect" class="org.spring.aop.aspect.Aspect"/><!-- 切面类 --> <aop:config><!-- AOP配置 -->
<aop:aspect id="aspectAOP" ref="aspect"><!-- 配置切面 -->
<!-- 配置切入点,org.spring.aop.biz.AspectBiz类中的所有方法 -->
<aop:pointcut expression="execution(* org.spring.aop.biz.AspectBiz.*(..))" id="pointcut"/>
<aop:before method="before" pointcut-ref="pointcut"/><!-- 前置通知 -->
<aop:after-returning method="afterReturning" pointcut-ref="pointcut"/><!-- 返回后通知 -->
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut"/><!-- 抛出异常后通知 -->
<aop:after method="after" pointcut-ref="pointcut"/><!-- 后通知 -->
<aop:around method="around" pointcut-ref="pointcut"/><!-- 环绕通知 -->
<aop:around method="aroundParamter"
pointcut="execution(* org.spring.aop.biz.AspectBiz.paramterBiz(String,int))
and args(arg1,arg2)"/><!-- 带参数的环绕通知 -->
<!-- Introduction,在不修改类代码的前提下,为类添加新的父类 -->
<aop:declare-parents types-matching="org.spring.aop.biz.*(+)"
implement-interface="org.spring.aop.Fit"
default-impl="org.spring.aop.impl.FitImpl"/>
</aop:aspect>
</aop:config> </beans>
8.TestBase.java
package org.spring.aop.test; import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils; public class TestBase { private ClassPathXmlApplicationContext context;
private String springXmlPath; /**
* 无参构造器
*/
public TestBase() { } /**
* 含参构造器,初始化spring配置文件路径
*
* @param springXmlPath
* spring配置文件路径
*/
public TestBase(String springXmlPath) { this.springXmlPath = springXmlPath; } /**
* 初始化加载spring配置文件到IOC容器中
*/
@Before
public void before() { if(StringUtils.isEmpty(springXmlPath)){
springXmlPath = "classpath:spring-*.xml";
}
context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]+"));
context.start(); } /**
* 销毁IOC容器
*/
public void after() { if(context != null){
context.destroy();
} } /**
* 根据bean ID获取bean对象
*
* @param beanId
* bean ID
* @return
*/
public Object getBean(String beanId) { return context.getBean(beanId); } }
9.TestSpringAop.java
package org.spring.aop.test; import org.junit.Test;
import org.spring.aop.Fit;
import org.spring.aop.biz.AspectBiz; public class TestSpringAop extends TestBase { /**
* 通过构造器初始化spring配置文件路径
*/
public TestSpringAop() { super("classpath:spring-aop.xml"); } /**
* 测试正常业务逻辑
*/
@Test
public void testAspect() { AspectBiz biz = (AspectBiz) super.getBean("aspectBiz");
biz.biz(); } /**
* 测试异常业务逻辑
*/
@Test
public void testThrowAspect() { AspectBiz biz = (AspectBiz) super.getBean("aspectBiz");
biz.throwingBiz(); } /**
* 测试含参数业务逻辑
*/
@Test
public void testParamterAspect() { AspectBiz biz = (AspectBiz) super.getBean("aspectBiz");
biz.paramterBiz("测试数据", 1234); } /**
* 测试Introduction,在不修改类代码的前提下,为类添加新的方法和属性
*/
@Test
public void testIntroduction() { Fit fit = (Fit) super.getBean("aspectBiz");
fit.filter(); } }
10.效果预览
10.1 执行testAspect方法
10.2 执行testThrowAspect方法
注:方法抛出异常后,并没有抛出异常后通知,而是执行了返回后通知,原因是因为配置了环绕通知,将环绕通知屏蔽后就正常了。
10.3 执行testParamterAspect方法
10.4 执行testIntroduction方法
参考:http://www.imooc.com/video/4419
http://www.imooc.com/video/4420
http://www.imooc.com/video/4421
http://www.imooc.com/video/4422
http://www.imooc.com/video/4440
Spring学习十四----------Spring AOP实例的更多相关文章
- spring学习 十四 注解AOP 通知传递参数
我们在对切点进行增强时,不建议对切点进行任何修改,因此不加以使用@PointCut注解打在切点上,尽量只在Advice上打注解(Before,After等),如果要在通知中接受切点的参数,可以使用Jo ...
- Spring学习(十四)----- Spring Auto Scanning Components —— 自动扫描组件
一. Spring Auto Scanning Components —— 自动扫描组件 1. Declares Components Manually——手动配置componen ...
- Spring 学习十四 Spring security安全
Spring security: 我用过的安全机制: oauth2, filter, secured方法保护 9.2 保护web请求: 9.2.1 代理Servlet过滤器: Delegat ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- Spring 学习(四)--- AOP
问题 : AOP 解决的问题是什么 Spring AOP 的底层实现是什么 Spring AOP 和 AspectJ 的区别是什么 概述 在软件业,AOP为Aspect Oriented Progra ...
- Spring学习(十八)----- Spring AOP+AspectJ注解实例
我们将向你展示如何将AspectJ注解集成到Spring AOP框架.在这个Spring AOP+ AspectJ 示例中,让您轻松实现拦截方法. 常见AspectJ的注解: @Before – 方法 ...
- Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)
在上一个Spring AOP通知的例子,一个类的整个方法被自动拦截.但在大多数情况下,可能只需要一种方式来拦截一个或两个方法,这就是为什么引入'切入点'的原因.它允许你通过它的方法名来拦截方法.另外, ...
- Spring学习(十五)----- Spring AOP通知实例 – Advice
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...
- Spring学习十五----------Spring AOP API的Pointcut、advice及 ProxyFactoryBean相关内容
© 版权声明:本文为博主原创文章,转载请注明出处 实例: 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4. ...
随机推荐
- spfa代码
先来贴一下,,虽然不是自己写的 #include<iostream>#include<cstdio>#include<cstring>#include<cma ...
- ubuntu 配置虚拟主机
ubuntu下Apache虚拟主机的配置 启用站点停用站点方法 a2ensite/a2dissite 比如添加一个ecshop 的虚拟机 首先到/etc/apache2/site-availa ...
- Windows消息钩取
@author: dlive @date: 2016/12/19 0x01 SetWindowsHookEx() HHOOK SetWindowsHookEx( int idHook, //hook ...
- depletion mosfet 的 depletion 解釋
Origin mosfet 除了有 n channel 及 p channel 外, 還分為 enhanced 及 depletion 兩種, 引起我注意的是, depletion 代表什麼, Exp ...
- Hrbust 2320 OX (博弈)
题目链接 Hrbust 2320 用三进制来存储整个棋盘的状态. 设$dp[status][now]$为轮到$now$下棋的时候是必胜必败还是平局. 那么若当前能延伸出的所有状态中存在必败态的,则当 ...
- NOI模拟题4 Problem C: 填格子(board)
Solution 首先我们要有敏锐的直觉: 我们将每一列中不选哪种颜色看作是一个序列, 则我们发现这个序列要求相邻两位的颜色不同. 我们还发现, 一个这样的序列对应两种不同的合法的棋盘, 因此统计合法 ...
- 基于WPF系统框架设计(6)-整合MVVM框架(Prism)
应用场景 我们基础的框架已经搭建起来了,现在整合MVVM框架Prism,在ViewModel做一些逻辑处理,真正把界面设计分离出来. 这样方便我们系统开发分工合作,同时提高系统可维护性和灵活性. 具体 ...
- dedecms调用新闻文章列表
效果如下: 代码如下: <div class="list"> <ul class="d6 ico4"> {dede:list pages ...
- Zend Studio 9.0.2破解文件和注册码下载
Zend Studio是Zend Technologies开发的PHP语言集成开发环境(IDE),是公认最好的PHP开发工具.当前Zend Studio最新版本是9.0.2. Zend Studio ...
- C#是唯一能挑战Java的编程语言?
几乎所有新近成长的Visual Studio代码开发人员都选择使用C#,而不是VB.NET或C++,这也使得C#已经成长为微软的第一大语言.根据本月的Tiobe编程语言排行榜,C#再次取得了突破性进展 ...