一、面向切面编程
- 目的:把应用在各处的功能分离出来,使其成为可重用的组件
- Spring AOP把业务看作两类:核心关注点和横切关注点
-
- 核心关注点:核心业务
- 横切关注点:经常融入到核心业务中的系统服务。如日志、事务管理、安全
- Spring AOP工作原理:AOP使横切关注点模块化,将其与核心业务逻辑相分离。
二、实例
- 注意:加入Spring的依赖包
1、IA接口
package one.aop;
public interface IA {
public void print();
}
2、A类-核心业务
package one.aop;
public class A implements IA{
public void print() {
// b.printBefore(); //打印前调用
System.out.println("调用A类的print方法");
// b.printAfter();
}
}
- 这里本应调用B类的函数,使用AOP切入了
3、B类-横切关注点
package one.aop;
public class B {
public void printBefore() {
System.out.println("打印之前调用");
}
public void printAfter() {
System.out.println("打印之后调用");
}
}
4、切面配置-one_aop_config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean id="a" class="one.aop.A">
</bean>
<bean id="b" class="one.aop.B">
</bean>
<aop:config>
<aop:pointcut id="embark"
expression="execution(* one.aop.A.print(..))"/>
<aop:aspect ref="b">
<aop:before pointcut-ref="embark"
method="printBefore"/>
<aop:after pointcut-ref="embark"
method="printAfter"/>
</aop:aspect>
</aop:config>
</beans>
- 注意先注入id为b的bean,因为切面引用到
- <aop:config>:为切面配置
- <aop:pointcut>:为切点配置,expression中的为A类的print方法,即在该方法插入B类的方法
- <aop:before>:在执行A类的print方法前执行
5、运行类
package one.aop;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class myMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("one_aop_config.xml");
IA a= (IA) context.getBean(IA.class); //一定要是接口
a.print();
context.close();
}
}
- 这里要注意的是,获取的Bean一定要是接口,不然会报错。仅仅是注入依赖就可以是类。
三、项目下载