AspectJ 允许使用Annotation定义切面、切入点和增强处理,而 Spring框架则可识别并根据这些Annotation来生成AOP代理。Spring只是使用了和AspectJ一样的注解,并没有使用AspectJ的编译器和织入器,底层依然使用的是 Spring AOP,依然是在运行时动态生成AOP代理,并不依赖于AspectJ的编译器或者织入器。
为了启用Spring对@AspectJ切面配置的支持,并保证Spring容器中的目标Bean被一个或多个切面自动增强,必须在配置文件中加如下代码:
<aop:aspectj-autoproxy/>
为了在Spring应用中启动@AspectJ支持,还需要添加 aspectjrt.jar 和aspectjweaver.jar到工程lib目录下。
Person.java :
public interface Person {
public String sayHello(String name);
public void eat(String food);
}
Chinese.java :@Component
public class Chinese implements Person {
@Override
public void eat(String food) {
System.out.println("我正在吃:"+food);
}
@Override
public String sayHello(String name) {
return name+"Hello,Spring AOP";
}
}
BeforeAdviceTest.java :
/**
* 定义一个切面
* @author Administrator
*
*/
@Aspect
public class BeforeAdviceTest {
@Before("execution(* com.bean.*.*(..))")
public void authority(){
System.out.println("模拟执行权限检查");
}
}
bean.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<context:component-scan base-package="com.bean">
<context:include-filter type="annotation"
expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>
<aop:aspectj-autoproxy/>
</beans>
Test.java :
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
Person p=(Person) ctx.getBean("chinese");
System.out.println(p.sayHello("张三"));
p.eat("西瓜");
}
}
运行控制台输出: