• 暂时停更一段时间!
  • 近期网站将陆续进行前端页面改造!
  • 招募网站编辑,联系站长!

Spring AOP之带有切入点的切面的配置案例

文章目录[隐藏]

PointcutAdvisor 切点切面

使用普通 Advice 作为切面,将对目标类所有方法进行拦截,不够灵活,在实际开发中常采用带有切点的切面。

常用 PointcutAdvisor 实现类:

– DefaultPointcutAdvisor 最常用的切面类型,它可以通过任意 Pointcut 和 Advice 组合定义切面

– JdkRegexpMethodPointcut 构造正则表达式切点

代码演示

打开 IDEA,新建一个 demo4,之前做的案例是有接口的,下面我们来个没有接口的。新建一个 CustomerDao,完成下面四个方法。

package com.jikewenku.aop.demo4;

public class CustomerDao {
    public void find(){
        System.out.println("查询客户...");
    }

    public void save(){
        System.out.println("保存客户...");
    }

    public void update(){
        System.out.println("修改客户...");
    }

    public void delete(){
        System.out.println("删除客户...");
    }
}

新建一个通知的类型 MyAroundAdvice

package com.jikewenku.aop.demo4;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MyAroundAdvice implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("环绕前增强===================");

        Object obj = invocation.proceed();

        System.out.println("环绕后增强===================");
        return obj;
    }
}

我们的目标对象就建好了,接下来再创建个Spring的配置文件 applicationContext2.xml

<?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="customerDao" class="com.jikewenku.aop.demo4.CustomerDao"/>

    <!--配置通知============== -->
    <bean id="myAroundAdvice" class="com.jikewenku.aop.demo4.MyAroundAdvice"/>

    <!--一般的切面是使用通知作为切面的,因为要对目标类的某个方法进行增强就需要配置一个带有切入点的切面-->
    <bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <!--pattern 中配置正则表达式:.任意字符  *任意次数 -->
    <property name="advice" ref="myAroundAdvice"/>
</bean>

<!-- 配置产生代理 -->
    <bean id="customerDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="customerDao"/>
        <property name="proxyTargetClass" value="true"/>
        <property name="interceptorNames" value="myAdvisor"/>
    </bean>
</beans>

新建一个测试类SpringDemo4,注意这是没有增强的,我们先来看一下效果

package com.jikewenku.aop.demo4;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.<a href="https://www.jikewenku.com/tag/spring" title="查看更多关于 Spring 的文章" target="_blank">Spring</a>JUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(<a href="https://www.jikewenku.com/tag/spring" title="查看更多关于 Spring 的文章" target="_blank">Spring</a>JUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class <a href="https://www.jikewenku.com/tag/spring" title="查看更多关于 Spring 的文章" target="_blank">Spring</a>Demo4 {

    @Resource(name="customerDao")
    private CustomerDao customerDao;

    @Test
    public void demo1(){
        customerDao.find();
        customerDao.save();
        customerDao.update();
        customerDao.delete();
    }
}

运行程序

我们再注入代理对象,修改上面的部分代码如下

// @Resource(name="customerDao")
    @Resource(name="customerDaoProxy")
    private CustomerDao customerDao;

运行程序

这个时候就是环绕增强了,执行查询、保存、修改、删除之前和之后都增强了,

如果我们想增强 save 方法又该怎么写呢?

可以这样配置

<property name="pattern" value=".*save.*"/>

运行程序,就会只针对 save 方法进行增强了

如果还想保存还想删除呢?又该怎么配呢?

可以这样配置

<property name="patterns" value=".*save.*,.*delete.*"/>

运行一下看结果


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring AOP 之带有切入点的切面的配置案例
喜欢 (0)
[247507792@qq.com]
分享 (0)

邀请您免费 注册账号 登录 即可参与讨论!