Spring(十)--Advisor顾问

Spring之Advisor顾问

1. 创建新的xml文件  advisor.xml

<!--01. 配置目标对象   实际肯定是配置UserServiceImpl-->
<bean id="userDaoImpl" class="com.xdf.dao.UserDaoImpl"/>

<!--02.配置前置通知-->
<bean  id="beforeAdvice" class="com.xdf.advice.BeforeAdvice"/>

<!--03.配置工厂-->
<bean id="userProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <!--配置目标对象-->
    <property name="targetName" value="userDaoImpl"/>
    <!--配置顾问-->
    <property name="interceptorNames" value="myAdvisor"/>
</bean>

<!--04.配置顾问myAdvisor-->
<bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
    <!--配置通知    通知只是顾问的一个属性  -->
    <property name="advice"  ref="beforeAdvice"/>
    <!--配置切入点-->
   <!-- <property name="mappedName" value="eat"/>-->
    <property name="mappedNames" value="eat,sleep"/>
</bean>

2. 创建测试类

**
 *  使用顾问  advisor.xml
 */
@Test //前置通知
public void  testAdvisor(){
    ApplicationContext context=new ClassPathXmlApplicationContext("advisor.xml");
    UserDao userDao= context.getBean("userProxy",UserDao.class);
    userDao.eat();
    userDao.sleep();
}

·可以解决 给指定的主业务方法 增强的问题!

3. 使用正则匹配,创建新的xml文件

    在Dao层增加 ea()和e()!便于我们测试

<!--01. 配置目标对象   实际肯定是配置UserServiceImpl-->
<bean id="userDaoImpl" class="com.xdf.dao.UserDaoImpl"/>

<!--02.配置前置通知-->
<bean  id="beforeAdvice" class="com.xdf.advice.BeforeAdvice"/>

<!--03.配置工厂-->
<bean id="userProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <!--配置目标对象-->
    <property name="targetName" value="userDaoImpl"/>
    <!--配置顾问-->
    <property name="interceptorNames" value="myAdvisor"/>
</bean>

<!--04.配置顾问myAdvisor  RegexpMethodPointcutAdvisor -->
<bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <!--配置通知    通知只是顾问的一个属性  -->
    <property name="advice"  ref="beforeAdvice"/>
    <!--配置切入点  使用正则表达式
      com.xdf.dao.UserDaoImpl.eat  务必使用类名+方法名
      . 代表任意单个字符
      * 代表.字符出现的次数是0-N
      ?:0 -1
      +: 1-N
     -->
    <property name="patterns">
        <array>
           <!--  <value>.*e.*</value>  匹配 eat 和sleep-->
            <!--  <value>com.xdf.dao.UserDaoImpl.ea.?</value>匹配 eat 和ea-->
             <value>com.xdf.dao.UserDaoImpl.*e.*</value> <!--匹配 eat 和ea  e-->
        </array>
    </property>

</bean>
<!--还是一个问题没解决    一个工厂只能操作一个对象-->

4. 创建测试类

/**
 *  使用顾问  regex.xml
 */
@Test //前置通知
public void  testRegex(){
    ApplicationContext context=new ClassPathXmlApplicationContext("regex.xml");
    UserDao userDao= context.getBean("userProxy",UserDao.class);
    userDao.eat();
    userDao.ea();
    userDao.e();
    userDao.sleep();
}

    各位亲,这个办法你想到了吗?!接下来的我还会继续更新的哦!

原文地址:https://www.cnblogs.com/fl72/p/9655828.html

时间: 2025-01-17 09:02:25

Spring(十)--Advisor顾问的相关文章

Spring基础系列10 -- Spring AOP-----------Pointcut, Advisor

Spring基础系列10 -- Spring AOP-----------Pointcut, Advisor 转载:http://www.cnblogs.com/leiOOlei/p/3557643.html 上一篇的Spring AOP Advice例子中,Class(CustomerService)中的全部method都被自动的拦截了.但是大多情况下,你只需要一个方法去拦截一两个method.这样就引入了Pointcut(切入点)的概念,它允许你根据method的名字去拦截指定的method

Spring(十)Spring任务调度

一.计划任务 需要定时执行一些计划(定时更新等),这样的计划称之为计划任务 Spring抽象封装了Java提供的Timer与TimerTask类 也可以使用拥有更多任务计划功能的Quartz 二.TimerTask 2.1.继承TimerTask类重写run方法 实现类 package com.pb.task.timertask; import java.util.Iterator; import java.util.List; import java.util.TimerTask; publi

Spring(十二)使用Spring的xml文件配置方式实现AOP

配置文件与注解方式的有非常大不同,多了非常多配置项. beans2.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" xmlns:context=&

Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术

目标对象的所有接口方法 package test.spring.service; public interface PersonService { public String getPersonName(Integer id); public void save(String name); } 目标对象 package test.spring.service.impl; import test.spring.service.PersonService; //代理对象实现目标对象所有接口 publ

Spring(十五)之声明式事务

声明式事务管理方法允许你在配置的帮助下而不是源代码硬编程来管理事务.这意味着你可以将事务管理从事务代码中隔离出来.你可以只使用注释或基于配置的 XML 来管理事务. bean 配置会指定事务型方法.下面是与声明式事务相关的步骤: 我们使用标签,它创建一个事务处理的建议,同时,我们定义一个匹配所有方法的切入点,我们希望这些方法是事务型的并且会引用事务型的建议. 如果在事务型配置中包含了一个方法的名称,那么创建的建议在调用方法之前就会在事务中开始进行. 目标方法会在 try / catch 块中执行

Spring(十四)之编程性事务

Spring 编程式事务管理 编程式事务管理方法允许你在对你的源代码编程的帮助下管理事务.这给了你极大地灵活性,但是它很难维护. 在我们开始之前,至少要有两个数据库表,在事务的帮助下我们可以执行多种 CRUD 操作. 一.准备两张表 CREATE TABLE Student( ID INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID) ); CREATE TABLE M

Spring(十)之自定义事件

编写自定义事件的简单流程如下: (1)编写CustomEvent.java package com.tutorialspoint; import org.springframework.context.ApplicationEvent; public class CustomEvent extends ApplicationEvent{ public CustomEvent(Object source) { super(source); } public String toString(){ r

Spring通知,顾问,增强

1.AOP  (Aspect  Oriented Programming  面向切面编程) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 面向

SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

AOP(Aspect Oriented Programming).是面向切面编程的技术.AOP基于IoC基础.是对OOP的故意补充. AOP之所以能得到广泛应用,主要是由于它将应用系统拆分分了2个部分:核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的切面Crosscutting enterprise concerns.比如,全部大中型应用都要涉及到的持久化管理(Persistent).事务管理(Transaction Management).权限管理(P