一 . 概述
在之前我们了解了spring生成代理对象的过程,但是整个过程的配置是十分麻烦的.
尽管spring提供了很多的解决方法,但是还是无法从根本上解决配置复杂的问题.
如,name匹配等方式(这里不去说).
而,作为业界最优秀的AOP框架,Aspectj的实现却相当的简单,因此spring引入了其使用的方式进行配置的简化.
二 . 切面
这个概念在之前没有介绍过,原因是之前的重点放在动态代理概念的介绍之中.
所谓切面,就是一组逻辑相关的代码组合形成的类对象.这个概念十分的好理解.
我们首先来声明一个切面:
@Aspect public class MyAspect { }
我们在一个类之上标记了@Aspect注解就表示这个类是一个切面类.
现在我们编写一个增强.
public class RealSubject { public void test() { System.out.println("test..."); } }
首先我们编写了一个目标对象.
@Aspect public class MyAspect { @Before("execution(* com.trek.aspect.RealSubject.test(..))") public void before() { System.out.println("before..."); } }
我们编写了一个方法,方法上面打上了一个@Before注解,表示这是一个前置通知.
注解的参数是切入点表达式,表示的就是之前介绍的切入点的概念.
现在我们将其配置在配置文件之中.
<!-- 开启aop自动代理 --> <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="aspect" class="com.trek.aspect.MyAspect"></bean> <bean id="subject" class="com.trek.aspect.RealSubject"></bean>
测试代码:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/trek/aspect/spring.xml"); RealSubject subjct = (RealSubject) context.getBean("subject"); subjct.test();
我们惊奇的发现,我们现在使用AOP变得十分简单了.