执行结果
Jul 05, 2016 10:10:00 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5d79a4c9: startup date [Tue Jul 05 22:10:00 CST 2016]; root of context hierarchy Jul 05, 2016 10:10:00 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [bean-aop.xml] 4.0 2.0 2.2 小结上面例子中, 加法类和减法类中只包含了业务代码, 我们可以将视为两个Target(目标), 下面我们就利用AOP技术为这两个Target加入通知。
2.3 AOP 前置通知这个任务的需求很简单。
不能修加法类和减法类
在加法类和减法类的getResult()方法执行时, 在业务代码执行前输出两个参数(log).
首先maven里要引入这些lib
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.8</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.8</version> </dependency>然后在bean-config xml里加入下面这个句话, enable spring aop 功能
<!-- enable @Aspect --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>然后新建1个类LoggingAspect
package com.home.aop; import java.util.Arrays; import java.util.List; import org.springframework.stereotype.Component; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect @Component public class LoggingAspect { //@Before("execution(public double com.home.aop.AddCalculator.getResult(double,double))") @Before("execution(public * com.home.aop.*.*(..))") public void beforeExecute(JoinPoint joinPoint){ String classname = joinPoint.getTarget().getClass().getSimpleName(); String methodName = joinPoint.getSignature().getName(); List<Object> args = Arrays.asList(joinPoint.getArgs()); System.out.println("before Execute! --class name: " + classname + ", method name: " + methodName + " " + args ); } }方法beforeExecute的意思就是我们要为目标执行之前 而注入的方法。
上面@Before 注解表示这是1个前置通知。 括号里面的就是PointCut(切点), 上面说过了, 相当于数据库里的查询条件
然后Spring AOP 会根据PointCut 查找出所有符合条件的目标。
内容就很简单了, 无非就是输出被执行的类名方法名和参数…