Spring AOP实现动态织入

184 阅读1分钟

上篇文章已经介绍了Spring实现动态代理的两种方式,是JDK动态代理和CGLib,了解一些底层的原理之后,现在来实现Spring AOP。

demo结构

1、建立maven项目,配置pom.xml

pom.xml文件中加入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.11</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.11</version>
        </dependency>

** 2、定义接口类**

 public interface HelloService {
    void printHello();
}

3、实现接口

@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public void printHello() {
        System.out.println("hello");
    }
}

4、定义切面

@Aspect
public class HelloAspect {
    @Before("execution(* com.example.demo_aop.Service.HelloServiceImpl.printHello(..))")
    public void before(){
        System.out.println("before------");
    }
    @After("execution(* com.example.demo_aop.Service.HelloServiceImpl.printHello(..))")
    public void after(){
        System.out.println("after------");
    }
    @AfterReturning("execution(* com.example.demo_aop.Service.HelloServiceImpl.printHello(..))")
    public void afterReturning(){
        System.out.println("afterReturning------");
    }
    @AfterThrowing("execution(* com.example.demo_aop.Service.HelloServiceImpl.printHello(..))")
    public void afterThrowing(){
        System.out.println("afterThrowing------");
    }

}

5、切点

@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.example.demo_aop.aop")
public class AopConfig {
    @Bean
    public HelloAspect getHelloAspct(){
        return new HelloAspect();
    }
}

6、测试

@SpringBootTest
public class HelloServiceTest {
    @Autowired
    private HelloService helloService;
    @Test
    public void printHello() {
        helloService.printHello();
    }
}

7、运行结果

源码链接:github.com/liu2580/dem…