首页 > 编程语言 >Spring面相切片编程的配置。

Spring面相切片编程的配置。

时间:2022-11-22 23:45:04浏览次数:38  
标签:配置 .. Spring 编程 通知 aop println 面相 public

AOP面向切面配置:
1、context:component-scan:扫描包路径下的所有类注解。
<!-- 指定扫描com.sfwu15.bean包下的所有类的注解 注意:扫描包时,会扫描所有包下的子孙包 -->
    <context:component-scan base-package="com.sfwu15.bean"></context:component-scan>

2、aop:aspectj-autoproxy:开启aop注解的自动代理。

<!-- 开启aop注解的自动代理 -->
<aop:aspectj-autoproxy/>

3、bean:配置目标对象。

    <!-- 1.配置目标对象 -->
    <bean name="orderDao" class="com.sfwu15.dao.impl.OrderDaoImpl"></bean>

4、bean:配置通知类。

    <!-- 2.配置通知类 -->
    <bean name="myAdvice" class="com.sfwu15.demo.MyAdvice"></bean>

5、aop:config:面向切片编程的配置。

(一)spring.xml 文件中的配置。

  • aop:pointcut:配置接入点。expression 里的值是配置规则,(..)代表的是参数。

 

<!-- 配置切入点 以下是方法的配置规则
public void com.sfwu15.dao.impl.OrderDaoImpl.save();
void com.sfwu15.dao.impl.OrderDaoImpl.save();
* com.sfwu15.dao.impl.OrderDaoImpl.save();
* com.sfwu15.dao.impl.OrderDaoImpl.*();
* com.sfwu15.dao.impl.OrderDaoImpl.*(..);
* com.sfwu15.dao.impl.*DaoImpl.*(..); -->
<aop:pointcut expression="execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))" id="pc"/>
  • aop:aspect:配置切面。ref 里的值为面向切片编程的通知类。
  1. aop:after:前置方法。方法名为 before ,切点为 pc。
  2. aop:after-returning:后置方法。方法名为 afterReturning。
  3. aop:around:环绕通知。方法名为 around。
  4. aop:after-throwing:异常拦截通知。方法名为 afterException。
  5. aop:after:最终通知。方法名为 after。
         <aop:aspect ref="myAdvice">
             <!-- 指定名为before方法作为前置通知 -->
             <aop:after method="before" pointcut-ref="pc"/>
             <!-- 后置 -->
             <aop:after-returning method="afterReturning" pointcut-ref="pc"/>
             <!-- 环绕通知 -->
             <aop:around method="around" pointcut-ref="pc"/>
             <!-- 异常拦截通知 -->
             <aop:after-throwing method="afterException" pointcut-ref="pc"/>
             <!-- 最终通知 -->
             <aop:after method="after" pointcut-ref="pc"/>
         </aop:aspect>

xml 配置如下:

    <!-- 指定扫描com.sfwu15.bean包下的所有类的注解 注意:扫描包时,会扫描所有包下的子孙包 -->
    <context:component-scan base-package="com.sfwu15.bean"></context:component-scan>
    <!-- 开启aop注解的自动代理 -->
    <aop:aspectj-autoproxy/>
    <!-- 准备工作:导入aop(约束)命名空间 -->
    <!-- 1.配置目标对象 -->
    <bean name="orderDao" class="com.sfwu15.dao.impl.OrderDaoImpl"></bean>
    <!-- 2.配置通知类 -->
    <bean name="myAdvice" class="com.sfwu15.demo.MyAdvice"></bean>
    <aop:config>
        <!-- 配置切入点
            public void com.sfwu15.dao.impl.OrderDaoImpl.save();
            void com.sfwu15.dao.impl.OrderDaoImpl.save();
            * com.sfwu15.dao.impl.OrderDaoImpl.save();
            * com.sfwu15.dao.impl.OrderDaoImpl.*();
            * com.sfwu15.dao.impl.OrderDaoImpl.*(..);
            * com.sfwu15.dao.impl.*DaoImpl.*(..);  -->
         <aop:pointcut expression="execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))" id="pc"/>
         <aop:aspect ref="myAdvice">
             <!-- 指定名为before方法作为前置通知 -->
             <aop:after method="before" pointcut-ref="pc"/>
             <!-- 后置 -->
             <aop:after-returning method="afterReturning" pointcut-ref="pc"/>
             <!-- 环绕通知 -->
             <aop:around method="around" pointcut-ref="pc"/>
             <!-- 异常拦截通知 -->
             <aop:after-throwing method="afterException" pointcut-ref="pc"/>
             <!-- 最终通知 -->
             <aop:after method="after" pointcut-ref="pc"/>
         </aop:aspect>
    </aop:config>

 

(二)使用注解配置。

  • @Aspect:通知类,在类的上方加入注解。
@Aspect
// 表示该类是一个通知类
public class MyAdvice {}
  • @Pointcut:配置切入点。可将切入点配置到某一方法中。* 表示任意匹配,(..) 表示方法中带有参数。
    @Pointcut("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))")
    public void pc(){}
  • @Before:前置通知。目标方法运行之前调用。
    // 前置通知
    // 使用定义在方法中的切入点。
    @Before("MyAdvice.pc()")
    public void before(){
        System.out.println("这是前置通知!");
    }
  • @AfterReturning:后置通知。在目标方法运行之后调用,如果出现异常则不会调用。
    // 后置通知
    @AfterReturning("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))")
    public void afterReturning(){
        System.out.println("这是后置通知!");
    }
  • @Around:环绕通知。在目标方法之前和之后都调用。
    // 环绕通知
    @Around("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("这是环绕通知之前的部分!");
        Object proceed = pjp.proceed();
        System.out.println("这是坏绕通知之后的部分!");
        return proceed;
    }
  • @AfterThrowing:异常通知。如果出现异常,就会调用。
    // 异常通知
    @AfterThrowing("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))")
    public void afterException(){
        System.out.println("出现异常啦!");
    }
  • @After:最终通知。在目标方法运行之后调用(无论是否出现异常都会调用)。

 

    // 最终通知
    @After("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))")
    public void after(){
        System.out.println("这是最终通知,出现异常也会调用!");
    }

 

 

@Before

标签:配置,..,Spring,编程,通知,aop,println,面相,public
From: https://www.cnblogs.com/sfwu/p/16916913.html

相关文章