Spring --------AOP 面向切面

        正常的执行流程是纵向执行,面向切面就相当于是给程序切一刀,然后在横切面添加内容,这样就在原来代码的基础上添加了额外的需要功能。

作用:

        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();
}
}

结果 展示 

猜你喜欢

转载自blog.csdn.net/weixin_41298572/article/details/88902659