正常的执行流程是纵向执行,面向切面就相当于是给程序切一刀,然后在横切面添加内容,这样就在原来代码的基础上添加了额外的需要功能。
作用:
1.高拓展性
2.原有功能相当于拓展了部分逻辑,让职责更加明确
类似于图示:
面向切面编程的概念:就是在原有的纵向的流程中,针对某一个或某些方法添加通知,形成横切面过程叫做面向切面的过程。
常用概念:
原有功能: 切点 pointcut
前置通知:在切点执行之前的功能:before advice
后置通知:在切点之后的功能 :after advice
切点出现异常: throw advice
所有功能叫做切面
织入:把切面嵌入原有功能的过程叫织入
spring提供了AOP实现方式
第一种: Schema-based
第二种: AspectJ
Schema-based的实现
1.新建实现前置类
其中arg0表示method的方法对线,arg1表示方法的参数,arg2表示该切点所在类的对象
public class MyBeforeAdvice implements
MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object
arg2) throws Throwable {
System.out.println("执行前置通知");
}
}
2.实现后置类
这里边多了一个参数就是第一个数 第一个数表示切点函数的返回值
public class MyAfterAdvice implements
AfterReturningAdvice {
@Override
public void afterReturning(Object arg0, Method arg1,
Object[] arg2, Object arg3) throws Throwable {
System.out.println("执行后置通知");
}
}
3.配置spring的配置文件
① 引入 aop 命名空间
② 配置通知类
③ 配置切点
④详细代码
<?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/sc
hema/beans
http://www.springframework.org/schema/beans/spring-be
ans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.
xsd">
<!-- 配置通知类对象,在切面中引入 -->
<bean id="mybefore"
class="com.bjsxt.advice.MyBeforeAdvice"></bean>
<bean id="myafter"
class="com.bjsxt.advice.MyAfterAdvice"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切点 -->
<aop:pointcut expression="execution(*
com.bjsxt.test.Demo.demo2())" id="mypoint"/>
<!-- 通知 -->
<aop:advisor advice-ref="mybefore"
pointcut-ref="mypoint"/>
<aop:advisor advice-ref="myafter"
pointcut-ref="mypoint"/>
</aop:config>
<!-- 配置 Demo 类,测试使用 -->
<bean id="demo" class="com.bjsxt.test.Demo"></bean>
</beans>
⑤ 测试代码
public class Test {
public static void main(String[] args) {
// Demo demo = new Demo();
// demo.demo1();
// demo.demo2();
// demo.demo3();
ApplicationContext ac = new
ClassPathXmlApplicationContext("applicationContext.xm
l");
Demo demo = ac.getBean("demo",Demo.class);
demo.demo1();
demo.demo2();
demo.demo3();
}
}
结果 展示