Spring AOP是代理模式的经典实现,代理模式的作用就是把一些目标类没有的功能附加到代理类上,然后在代理类上执行目标类的方法,这给客户端的一个假象,好像这些新加功能在本来就在目标类上。Spring AOP使用的动态代理技术,JDK和CGLIB,Spring AOP优先选择JDK,假如不符合JDK代理的要求(目标类必须实现一个接口),就会尝试使用CGLIB,如果再不符合CGLIB的要求(目标类不能是final类型),那么就不能使用Spring AOP技术。下面是一个基于XML配置的一个简单但不是有用的例子。
-
目标类代码
public interface Mobile {
public void call();
}public class Xiaomi implements Mobile{ @Override public void call() { System.out.println("小米手机打电话"); } }
-
切面类代码
public class MobileAspect {
//一个前置通知
public void before(){
System.out.println("开机");
}
} -
XML配置
<bean id="xiaomi" class="annotation.Xiaomi"/>
<bean id="aspect" class="annotation.MobileAspect"/>
<aop:config>
<aop:pointcut expression="execution(* annotation.Xiaomi.*(..))" id="pointcut"/>
<aop:aspect ref="aspect">
<aop:before method="before" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config> -
测试类代码:
public class AopAnnotationDemo {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-introduction.xml");
Mobile mi = (Mobile) context.getBean("xiaomi");
System.out.println(mi.getClass().getSimpleName());//输出的是$Proxy2,说明我们调用不是Xiaomi类的对象,而是JDK动态代理生成的代理类,这个代理类在执行Xiaomi类对象上的方法时,会想执行切面类中的before()方法。
mi.call();
}
}
Spring AOP也支持注解的方式。
网友评论