Aspectj允许使用Annotation用于定义切面,切入点和增强处理.即通过注解@Aspect将一个普通的java类变为一个切面bean然后对另外一个@component组件java类进行增强处理
要使用注解Aspectj,就要对他进环境配置(xml schema的xml命名空间的uri配置,jar包的安装)
1.环境配置.
1.1使用xml schema配置
对于xml命名空间(即:xmlnamespace.简写:xmlns:xsi部分添加一对aop schema文件)
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
如果你没有配置上述的xmlns 的uri那么会抛出下面这个"通配符的匹配很全面,但无法找到元素....."的错误,如下图(解决方案就是添加上面的xmlns)
注意的是xmlns:xsi 是以一对uri引用出现的(必须的是以一对的形式写,即一个为空间名和一个模式的文档的物理位置,不然抛出上面图片显示的错误),另外,xmlnamespace的众多的uri之间必须空一格
http://www.springframework.org/schema/aop 空间名
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 模式的文档物理空间
模式的文档的物理位置:我们可以在spring-aop.xxx.jar包里的meta-inf文件里找到特殊的spring.handlers和spring.schemas这两个文件,他们是储存namespace的uri地址,spring为了在断网的条件下依旧可以找到这些文件就把他们放在这两个文件中了,另外旧版本的spring中的namespace的uri地址也很贴心地给了出来,为了是防止spring旧版本的uri更新的域名后,对spring xmsns:xsi的造成影响.
2.jar包
jar包需求,在寻常的spring的jar包下添加以下
三个jar包:
aop alliance-xx.jar:
aspectsweaver-xxx.jar :这个jar包是添加@Aspect注解
spring-aop-xxx.jar
网上有种说法是四种(为了保险起见,我把它也贴出来)
在上面三种的基础上,再加:spring-aspects-xxx.jar
注:xxx是版本的意思
好了,我的所有jar包如下,一般情况有了下面这些jar包 aop运行还是没有问题的.
添加了jar包环境搭配好了,我们开始我们的第一个@aspect例子
1.创建两个类,一个普通类(bean组件类同时也是主调bean),一个是Aspect类服务普通类(其实也是一个普通java类)
package test;
import org.springframework.stereotype.Component;
@Component //该注解表明该类是一个普通的bean类,但是没有任何迹象表明他将会被谁服务
public class one {
public void sayHello() {
System.out.println("hello Aject!");
}
public static void main(String[] args) {
one o=new one();
o.sayHello();
}
}
package test;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect //定义了一个切面(切面的意思是:业务流程运行的某个特定步骤,也就是应用运行过程的关注点 ,关注点可能横切多个对象,所以也常常被称为横切关注点)
public class two {
@Around("execution(void one.sayHello())")//还@Around是一个增强处理,其外增强处理还有before和after
public void test()
{
System.out.println("模拟执行权限检查");
}
}
2.写上测试类
public class test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
one o=ac.getBean(one.class);
o.sayHello();
}
}
最后输出结果
问题1:这里之所以不输出hello Ajectj!!! 是因为我引用了 @around注解
Advice(增强处理):@before 在输出主语句输出之前,输出增强语句
@after 在输出主语句输出之后,输出增强语句
@around 上面的例子显示
问题2:当使用运行类使用system.out.print的时候,增强处理才发挥作用,若是没有采用system.out.print而是使用return 的语句时,增强处理也不会被激发