Spring AOP注解快速入门

与世无争的帅哥 提交于 2020-04-06 02:35:43

1、引入spring坐标、aspectj坐标、junit坐标、spring-test坐标

<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>5.2.3.RELEASE</version></dependency><dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjweaver</artifactId>    <version>1.9.3</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-test</artifactId>    <version>5.2.3.RELEASE</version></dependency><dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.12</version></dependency>

2、编写接口类

public interface TargetInterface {    public void doSomething();}

3、编写接口实现类

@Component("targetInterfaceImpl")public class TargetInterfaceImpl implements TargetInterface {    public void doSomething() {        System.out.println("doSomething running......");    }}

4、编写切面类

@Component("aspect")@org.aspectj.lang.annotation.Aspect//标注该类为一个切面类public class Aspect {    //配置前置通知//    @Before("Aspect.pointcut()") //第一种写法    @Before("pointcut()") //第二种写法    public void before(){        System.out.println("前置增强");    }    @Pointcut("execution(public void com.itheima.aop.*.*(..))")    public void pointcut(){}}

5、配置applicationContext.xml

  1)引入context命名空间和aop命令空间 

<beans xmlns="http://www.springframework.org/schema/beans"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd                        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  2)开启组件扫描和aop自动代理

<!--开启组件扫描--><context:component-scan base-package="com.itheima"/><!--aop自动代理--><aop:aspectj-autoproxy/>

6、代码测试

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class Test {    @Autowired    private TargetInterface targetInterface;    @org.junit.Test    public void testAop(){        targetInterface.doSomething();    }}

7、遇到的问题

  如果采用切点表达式的抽取的方式定义切点表达式可能会出现

  Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut pointcut

  但是如果不采用切点表达式的抽取,则不会报错

 @Before("execution(public void com.itheima.aop.*.*(..))") 这可能是由于aspectj的版本导致的, 本人在使用1.8.4时报错,将版本修改为1.9.4则不报错


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!