javaweb——spring第四坑(注解形式的aop实现

注解形式的aop实现

使用注解,将通知类添加入springIOC中,并按需求配置通知类的方法的作用类型

首先在applicationContext中添加扫描器


<beans 。。。。。。省略
	   xmlns:context="http://www.springframework.org/schema/context"
		
       xsi:schemaLocation=" 。。。。 省略
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd
">


    <context:component-scan base-package="top.voidplus.aop">context:component-scan>


    
    <aop:aspectj-autoproxy>aop:aspectj-autoproxy>

applicationContext文件配置完毕

将通知类加上注释,添加入IOC中

package top.voidplus.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 用spring注解实现的aop,
 */
// component 相当于标签,将LogAspectAnnotation纳入springIOC容器中
@Component("LogAspectAnnotation")

// Aspect声明该类是一个 “通知”类
// 可以同时声明:前置、后置、异常、环绕通知
// 只要在方法前,写上对应的注释即可
@Aspect
public class LogAspectAnnotation {

    // 声明该方法为 前置通知方法,@Before("execution( 类.方法 )")
    @Before("execution(public void top.voidplus.service.impl.StudentServiceImpl.queryStudentByName(java.lang.String))")
    public void beforeAnnotation(){
        System.out.println("spring注解实现aop");
    }

    // 声明该方法为 后置通知, * 通配符(任意返回值,包路径),   ..通配符(任意变量类型)
    @After("execution(public * queryStudentByName(..))")
    public void afterAnnotation(){
        System.out.println("这是一个spring注解实现的后置通知方法");
    }

}

结果

javaweb——spring第四坑(注解形式的aop实现_第1张图片
spring注解的前置通知只打印一次,因为配置时,指定了具体的类中的具体方法
spring注解后置通知打印了两次,配置时使用了通配符,dao包中的类和service包中的类都有一个queryStudentByName方法,查询时每个方法触发一次后置通知

你可能感兴趣的:(javaweb)