spring-aop使用

83 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

 编程方式使用aop

添加aop依赖

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver AOP -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.8</version>
        </dependency>

编写一个方法类

public class User {
    public void a() {
        System.out.println("a.....");
    }

    public void b() {
        System.out.println("b.....");
    }
}

写一个代理类

@Repository
@Aspect
public class Log {
    //在注解的情况下不能同时使用  before生效 after不生效
    @After("execution(public * *..User.*(..))")
    @Before("execution(public * *..User.*(..))")
    public void init() {
        System.out.println("init....");
    }
}

spring配置类

@Configuration
@ComponentScan("cn.chenxiejia")
//启用aop代理
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public User u() {
        return new User();
    }

    public Log l() {
        return new Log();
    }
}

测试类

public class App {
    public static void main(String[] args) {
        var app = new AnnotationConfigApplicationContext(AppConfig.class);
        User user = app.getBean("u", User.class);
        user.a();
    }
}

测试结果

​编辑

 配置方式使用aop

配置文件applicaltionContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <context:component-scan base-package="cn.chenxiejia.entity"/>
    <bean name="user" class="cn.chenxiejia.entity.User"/>
    <bean name="log" class="cn.chenxiejia.entity.log"/>
    <aop:config>
        <!--第一个*表示返回值类型 第二个*表示包名 ..表示当前包及子包 -->
        <!--在User类使用方法时添加执行新的方法-->
        <aop:pointcut id="p1" expression="execution(public * *..User.*(..))"/>
        <aop:pointcut id="p2" expression="execution(public * *..User.*(..))"/>
        <!--添加执行的方法-->
        <aop:aspect ref="log">
            <aop:after method="init" pointcut-ref="p2"/>
        </aop:aspect>

        <aop:aspect ref="log">
            <aop:before method="init" pointcut-ref="p1"/>
        </aop:aspect>
    </aop:config>
</beans>

\