spring通过配置的方式实现AOP(半自动,即获取执行对象,需要获取代理对象)

1、pom文件引入依赖

 <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!--spring aop + aspectj-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.9</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
</dependencies>

2、创建测试对象

接口:

两个实现类(被代理对象):

通知内容设置,需要实现两个接口,一个前置通知接口,一个后置通知接口

 

3、在resources下添加配置文件

配置切入点,通知,被代理者,切面(切入点+通知)以及代理对象。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <!-- 定义被代理者 -->
    <bean id="h1" class="com.ljs.demo.DannyEat"></bean>
    <bean id="h2" class="com.ljs.demo.JannyEat"></bean>

    <!-- 定义通知内容,也就是切入点执行前后需要做的事情 -->
    <bean id="timeHandler" class="com.ljs.demo.TimeHandler"></bean>

    <!-- 定义切入点位置,这里定义到了doPrint方法上 -->
    <bean id="timePointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
        <property name="pattern" value=".*eat"></property>
    </bean>

    <!-- 使切入点与通知相关联,完成切面配置 -->
    <bean id="timeHandlerAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
        <property name="advice" ref="timeHandler"></property>
        <property name="pointcut" ref="timePointcut"></property>
    </bean>

    <!-- 设置代理 -->
    <bean id="DannyEat_porxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 代理的对象 -->
        <property name="target" ref="h1"></property>
        <!-- 使用切面 -->
        <property name="interceptorNames" value="timeHandlerAdvisor"></property>
        <!-- 代理接口,接口 -->
        <property name="proxyInterfaces" value="com.ljs.demo.Eat"></property>
    </bean>
    <!-- 设置代理 -->
    <bean id="JannyEat_porxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 代理的对象 -->
        <property name="target" ref="h2"></property>
        <!-- 使用切面 -->
        <property name="interceptorNames" value="timeHandlerAdvisor"></property>
        <!-- 代理接口,接口 -->
        <property name="proxyInterfaces" value="com.ljs.demo.Eat"></property>
    </bean>


</beans>

4、测试类中加载配置文件,调用代理对象,实现aop

5、控制台输出结果:

6、可以对参数进行重新设置调用,将方法传入参数,实现在通知中获取参数,并将参数重新赋值后传入方法。

若未改变参数,即通知类写法同上时,控制台打印:

如果参数改变,改变通知类的写法:(如果想让修改的参数在被代理对象调用的方法中生效,必须在前置通知中修改参数,就是在方法执行之前将参数修改。)

修改参数后,控制台打印如下:

7、改变后置通知:

增加一个带有返回值的方法:eat_1

在配置文件中,修改切入点方法为所有:

在通知类中获取返回值:

在测试方法中调用:

控制台打印结果如下:

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值