首页 > 学院 > 开发设计 > 正文

19、spring AOP+AspectJ

2019-11-08 01:04:12
字体:
来源:转载
供稿:网友

19、sPRing AOP+aspectJ

本文主要介绍AspectJ注解和spring AOP的结合

AspectJ主要有以下五种方式:

@Before——方法运行前执行@After——方法运行后执行@AfterReturning——方法返回value后执行@AfterThrowing——抛出异常后执行@Around——环绕型,结合前面四种

说明:spring中并没有继承Aspect的jar包 需要导入两个jar包:

aspectjwear.jaraspectjrt.jar

maven依赖如下:

<!-- aspectjrt --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.11</version> </dependency> <!-- aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.5.4</version> </dependency>

例子

目录结构如下: 这里写图片描述

第一步:添加类代码: HelloWorld.java

public interface HelloWorld { public void printHelloWorld(); public String printAndReturn(); public void throwException() throws Exception;}

HelloWorldImpl.java

public class HelloWorldImpl implements HelloWorld{ public void printHelloWorld() { System.out.println("printHelloWorld方法执行了"); } public String printAndReturn() { System.out.println("printAndReturn方法执行了"); return "你好啊"; } public void throwException() throws Exception{ System.out.println("throwException抛出异常了"); throw new Exception("Generic Error"); }}

AspectJService.java

@Aspectpublic class AspectJService { @Before("execution(* com.main.AOP.AspectJ.HelloWorld.printHelloWorld(..))") public void printBefore(){ System.out.println("AspectJService : before"); } @After("execution(* com.main.AOP.AspectJ.HelloWorld.printHelloWorld(..))") public void printAfter(){ System.out.println("AspectJService : after"); } @AfterReturning(pointcut = "execution(* com.main.AOP.AspectJ.HelloWorld.printAndReturn(..))", returning= "result") public void printAfterReturning(String result){ //获取返回值 System.out.println(result); System.out.println("AspectJService : AfterReturning"); } @AfterThrowing( pointcut = "execution(* com.main.AOP.AspectJ.HelloWorld.throwException(..))", throwing= "error") public void printAfterThrowing(Throwable error){ System.out.println("Exception : " + error); System.out.println("AspectJService : printAfterThrowing"); }}

第二步:配置Aspect

<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-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy /> <bean id="helloWorld" class="com.main.AOP.AspectJ.HelloWorldImpl"/> <!-- AspectJService --> <bean id="aspectJService" class="com.main.AOP.AspectJ.AspectJService" /></beans>

测试运行:

@Test public void test(){ applicationContext context = new ClassPathXmlApplicationContext("com/main/AOP/AspectJ/bean.xml"); HelloWorld helloworld = (HelloWorld)context.getBean("helloWorld"); helloworld.printHelloWorld(); System.out.println("----------------------------------"); helloworld.printAndReturn(); System.out.println("----------------------------------"); try { helloworld.throwException(); } catch (Exception e) { e.printStackTrace(); } }

结果: 这里写图片描述


同样的,可以用xml的形式来配置 修改你的bean.xml配置文件如下

<!-- Aspect --><bean id="logAspect" class="com.main.AOP.AspectJ.AspectJService" /><aop:config> <aop:aspect id="aspectLoggging" ref="logAspect" > <!-- @Before --> <aop:pointcut id="pointCutBefore" expression="execution(* com.main.AOP.AspectJ.HelloWorld.printHelloWorld(..))" /> <aop:before method="printBefore" pointcut-ref="pointCutBefore" /> <!-- @Before --> <!-- @After --> <aop:pointcut id="pointCutAfter" expression="execution(* com.main.AOP.AspectJ.HelloWorld.printHelloWorld(..))" /> <aop:after method="printAfter" pointcut-ref="pointCutAfter" /> <!-- @After --> ` <!-- @AfterReturning --> <aop:pointcut id="pointCutAfterReturning" expression="execution(* com.main.AOP.AspectJ.HelloWorld.printAndReturn(..))" /> <aop:after-returning method="printAfterReturning" returning="result" pointcut-ref="pointCutAfterReturning" /> <!-- @AfterReturning --> <!-- @AfterThrowing --> <aop:pointcut id="pointCutAfterThrowing" expression="execution(* com.main.AOP.AspectJ.HelloWorld.throwException(..))" /> <aop:after-throwing method="printAfterThrowing" throwing="error" pointcut-ref="pointCutAfterThrowing" /> </aop:aspect></aop:config>

这时你的@注解可以统统删掉了,测试方法一样不变


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表