使用<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>任何配置,它会自己转换的