AOP声明式的3种配置方式为AOP基础配置方式、AOP低耦合处理配置方式、Annotation配置方式,以下是解析。
一、AOP基础配置方式
(一)配置要求
AOP基础配置方式适用于任何spring版本。这种配置方式要求去是:
- 通知去实现相应的MethodXxxxAdvice接口,Xxxx代表通知的类型,比如前置通知类需要去实现MethodBeforeAdvice接口;
- 通知类对象和目标类对象得在中Spring容器中声明;
- 在Spring容器中适用代理工厂ProxyFactoryBean创建代理对象并做织入操作,配置中必须给代理工厂ProxyFactoryBean提供通知类和目标对象才能成功创建。
AOP基础配置方式图解如下图所示:
(二)配置过程案例演示
1.创建通知类IofoBeforAdvice并实现相应接口
package testspringAOP.aop.advice;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.MethodBeforeAdvice;
/**前置通知类
* @author CenterLogo
*create date :2019年4月28日 下午9:25:32
*/
class IofoBeforAdvice implements MethodBeforeAdvice {//基础配置方式通知类需要事实现MethodBeforeAdvice接口
//产生一个日志对象
private Log log=LogFactory.getLog(IofoBeforAdvice.class);//所有框架都需要日志来支撑
public IofoBeforAdvice() {}
public void before(Method method, Object[] args, Object target) throws Throwable {
log.info("目标对象"+target);
log.info("访问方法名"+method.getName());
log.info("姓名"+args[0]);
log.info("年龄"+args[1]);
}
}
2.创建目标类接口InfoService
package testspringAOP.aop.service;
/**
* @author CenterLogo
*create date :2019年4月28日 下午9:04:05
*/
/**
* 获取如人员基本信息,
* @param name 姓名
* @param age 年龄
* @return 基本信息
* */
public interface InfoService {
public String getInfo(String name,int age);
public String insertInfo3(String name, int age);
}
3.创建目标类接口实现类(目标对象)InfoServiceImpl
package testspringAOP.aop.service;
/**
* @author CenterLogo
*create date :2019年4月28日 下午9:08:21
*/
public class InfoServiceImpl implements InfoService {
/**实现类,用户想执行的类,目标类,目标对象
*/
public InfoServiceImpl() { }
public String getInfo(String name, int age) {
// TODO Auto-generated method stub
return "姓名:"+name+"\n年龄:"+String.valueOf(age);//将age转换为字符串效率会提高
}
public String insertInfo3(String name, int age) {
// TODO Auto-generated method stub
return null;
}
}
4.创建并配置Spring容器(SpringAOP.xml),用ProxyFactoryBean配置代理工厂(详解看代码注释)。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 一、基础配置方式,没有切点、切面的的概念-->
<!-- AOP声明 -->
<!--1. 声明通知类 ,创建通知类对象-->
<bean id="infobeforeadvice" class="testspringAOP.aop.advice.IofoBeforAdvice"></bean>
<!--2. 声明目标类,创建目标类对象 -->
<bean id="IonfoServiceImpl" class="testspringAOP.aop.service.InfoServiceImpl"></bean>
<