使用<aop:config> 来配置Spring AOP
一、使用配置式AOP
1.jar的导入
导入 spring.jar ,commons-logging.jar ,log4j-1.2.14.jar ,aspectjrt.jar ,aspectjweaver.jar
2.创建 AOP切面类
该类是一个纯粹的POJO类,在该类中定义要调用的所有方法
public class AOPHandler2 {
private void ids(){}
public void commonCheck(){
System.out.println("/----------commonCheck()----------");
}
}
|
3.创建实体类接口
★:一定要先为要使用切面的类建立接口,因为在通过BeanFactory 得到bean 后要转成该接口,否则会出错。如果我们没有建立接口,那么就要导入CGLIB库,才行,详细使用见后面,三节
public interface IPersistenceDAO {
public void addName();
}
|
4.创建实体接口实现类
public class PersistenceDAO implements IPersistenceDAO{
public void addName(){
System.out.println("/----------addName");
}
}
|
5.配置applicationContext.xml
需要注意的是使用<aop:config>定义的切面一定要写正确文件头
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="persistenceDAO2" class="czw.PersistenceDAO"></bean>
<bean id="aopHandler2" class="czw.AOPHandler2"></bean>
<aop:config>
<aop:aspect ref="aopHandler2">
<aop:pointcut id="poicut" expression="execution(* add*(..))" />对所有的类以add开头的任何方法使用该方法。可以看spring参考手册 -->
<!-- method 指出before要调用的方法 -->
<aop:before method="commonCheck" pointcut-ref="poicut"/>
</aop:aspect>
</aop:config>
</beans>
|
6.编写测试类
public class TestMain {
public static void main(String[] args) {
BeanFactory ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
IPersistenceDAO pdo = (IPersistenceDAO)ctx.getBean("persistenceDAO2");
pdo.addName();
}
}
|
最终结果:
/----------commonCheck()----------
/----------addName
|
可以参照当前目录下的 Spring_AOP.rar 二、在切面中我们还可以得到调用该切面的方法的参数和方法名信息。主要是通过JoinPoint 对象来获取
public class AOPHandler2 {
public void commonCheck(JoinPoint joinPoint){
// 获取参数信息
Object[] args = joinPoint.getArgs();
for(int i = 0 ;i < args.length ;i++){
System.out.println("/---------" + args[i]);
}
// 获取方法名
System.out.println("/--------" + joinPoint.getSignature().getName());
System.out.println("/----------commonCheck()----------");
}
}
|
三、JDK动态代理和CGLIB代理
CGLIB代理来生成实体类,这样我们就可以不用再生成接口。主要分下面三四种情况:
1.如果实体类实现了接口,默认情况下会采用JDK的动态代理实现AOP
2..如果实体类实现了接口,也可以强制使用CGLIB代理
3.如果实体类没有实现了接口,必须使用CGLIB代理
4.如果有的实现了接口,有的没有实现,spring会自动在JDK动态代理和CGLIB代理之间转换
如何强制使用CGLIB代理?
需要添加CGLIB库,spring_hone/cglib/*.jar
在spring 配置文件中加入 <aop:aspectj-autoproxy proxy-target-class="true" />
如何使用CGLIB代理?
只需要把使用CGLIB 的jar引用就行了,在配置文件中只用配置Bean,不需要 <aop:aspectj-autoproxy>任何配置,它会自己转换的