`
leiwuluan
  • 浏览: 707227 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Spring中常用三种通知

阅读更多

(1)前置通知

接口:org.springframework.aop.MethodBeforeAdvice

使用前置通知可以在联结点执行前进行自定义的操作。不过,Spring里只有一种联结点,即方法调用,所以前置通知事实上就是让你能在方法调用前进行一些操作。前置通知可以访问调用的目标方法,也可以对该方法的参数进行操作,不过它不能影响方法调用本身。

 

示例:

 

IHello接口

public interface IHello {

    public void hello(String name);

}

 

IHello接口实现

public class HelloSpeaker implements IHello {

    public void hello(String name) {

        System.out.println("Hello, " + name);

    }

}

 

IHello实现代理

public class LogBeforeAdvice implements MethodBeforeAdvice {

    private Logger logger = Logger.getLogger(this.getClass().getName());

   

    public void before(Method method, Object[] args, Object target) throws Throwable {

        logger.log(Level.INFO, "method starts..." + method);

   }

}

 

Spring配置文件

    <bean id="logBeforeAdvice"

          class="onlyfun.caterpillar.LogBeforeAdvice"/>

 

    <bean id="helloSpeaker"

          class="onlyfun.caterpillar.HelloSpeaker"/>

   

    <bean id="helloProxy"

          class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="proxyInterfaces">

            <value>onlyfun.caterpillar.IHello</value>

        </property>

        <property name="target">

            <ref bean="helloSpeaker"/>

        </property>

        <property name="interceptorNames">

            <list>

                <value>logBeforeAdvice</value>

            </list>

        </property>

    </bean>

 

 

测试类

public class SpringAOPDemo {

    public static void main(String[] args) {

        ApplicationContext context =

                new FileSystemXmlApplicationContext(

                        "beans-config.xml");

        IHello helloProxy =

            (IHello) context.getBean("helloProxy");

        helloProxy.hello("Justin");

    }

}

 

(2)后置通知(或返回后通知)

接口:org.springframework.aop.AfterReturningAdvice

后置通知在联结点处的方法调用已经完成,并且已经返回一个值时运行,后置通知可以访问调用的目标方法,以及该方法的参数和返回值。因为等到通知执行时该方法已经调用,后置通知完全不能影响方法调用本身。

 

示例:

 

IHello接口

public interface IHello {

    public void hello(String name);

}

 

IHello接口实现

public class HelloSpeaker implements IHello {

    public void hello(String name) {

        System.out.println("Hello, " + name);

    }

}

 

IHello实现代理

public class LogAfterAdvice implements AfterReturningAdvice {

    private Logger logger = Logger.getLogger(this.getClass().getName());

   

    public void afterReturning(Object object, Method method,

                               Object[] args,

                               Object target) throws Throwable {

        logger.log(Level.INFO, "method ends..." + method);

   }

}

 

Spring配置文件

    <bean id="logAfterAdvice"

          class="onlyfun.caterpillar.LogAfterAdvice"/>

 

    <bean id="helloSpeaker"

          class="onlyfun.caterpillar.HelloSpeaker"/>

   

    <bean id="helloProxy"

          class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="proxyInterfaces">

            <value>onlyfun.caterpillar.IHello</value>

        </property>

        <property name="target">

            <ref bean="helloSpeaker"/>

        </property>

        <property name="interceptorNames">

            <list>

                <value>logAfterAdvice</value>

            </list>

        </property>

    </bean>

 

测试类

public class SpringAOPDemo {

    public static void main(String[] args) {

        ApplicationContext context = new FileSystemXmlApplicationContext(

                        "beans-config.xml");

        IHello helloProxy = (IHello) context.getBean("helloProxy");

        helloProxy.hello("Justin");

    }

}

 

 

 

(3)包围通知

接口:org.aopalliance.intercept.MethodInterceptor

Spring中的包围通知模AOP联盟的“方法拦截器”标准。包围通知可以在目标方法之前和之后动行,我们也可以定义在什么时候调用目标方法。如果需要,我们也可以另写自己的逻辑而完全不调用目标方法。

 

示例:

 

IHello接口

public interface IHello {

    public void hello(String name);

}

 

 

 

IHello接口实现

public class HelloSpeaker implements IHello {

    public void hello(String name) {

        System.out.println("Hello, " + name);

    }

}

 

IHello实现代理

public class LogInterceptor implements MethodInterceptor {

    private Logger logger = Logger.getLogger(this.getClass().getName());

   

   public Object invoke(MethodInvocation methodInvocation) throws Throwable {

        logger.log(Level.INFO, "method starts..." + methodInvocation.getMethod());

        

        Object result = null;

        try {

          result = methodInvocation.proceed();

        }

        finally {

            logger.log(Level.INFO, "method ends..." +

               methodInvocation.getMethod() + "\n");

        }

        return result;

   }

 

Spring配置文件

    <bean id="logInterceptor"

          class="onlyfun.caterpillar.LogInterceptor"/>

   

    <bean id="helloSpeaker"

          class="onlyfun.caterpillar.HelloSpeaker"/>

   

    <bean id="helloProxy"

          class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="proxyInterfaces">

            <value>onlyfun.caterpillar.IHello</value>

        </property>

        <property name="target">

            <ref bean="helloSpeaker"/>

        </property>

        <property name="interceptorNames">

            <list>

                <value>logInterceptor</value>

            </list>

        </property>

    </bean>

 

测试类

public class SpringAOPDemo {

    public static void main(String[] args) {

        ApplicationContext context = new FileSystemXmlApplicationContext(

                        "beans-config.xml");

        IHello helloProxy = (IHello) context.getBean("helloProxy");

        helloProxy.hello("Justin");

    }

 

 

分享到:
评论

相关推荐

    使用spring环境常用jar

    在Java开发领域,Spring框架是不可或缺的一部分,它提供了一种强大的方式来管理应用程序的组件,实现依赖注入(IOC),面向切面编程(AOP),以及事务管理等核心功能。本篇将详细介绍标题“使用spring环境常用jar”...

    spring最常用jar包

    标题 "spring最常用jar包" 暗示了我们讨论的核心是Spring框架中不可或缺的库文件,这些jar包是开发人员在使用Spring进行Java应用程序开发时最常引用的基础组件。Spring是一个开源的Java平台,它提供了全面的企业级...

    Spring AOP 常用的四种实现方式

    在IT领域,Spring框架是Java开发中的重要组成部分,特别是其AOP(面向切面编程)模块,它允许开发者实现横切关注点,如日志、事务管理等,从而提高代码的可读性和可维护性。本篇文章将深入探讨Spring AOP的四种常见...

    spring3.1.1常用jar包

    在这个"spring3.1.1常用jar包"中,包含了一系列核心的Spring库,这些库是搭建基于Spring的应用程序所必需的。 1. **Spring Core**:这是Spring框架的基础,提供了依赖注入(DI)和面向切面编程(AOP)的核心功能。...

    Spring 常用包

    Spring框架是Java开发中最常用的轻量级框架之一,它的核心在于IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。在本压缩包中,你可能会找到一系列与Spring相关的jar包,...

    Spring AOP 常用的四种实现方式的代码

    在"Spring实现AOP的四种方式.txt"文件中,你可以找到关于这些实现方式的详细代码示例。而"TestSpringAOP"可能是包含测试代码的类,用于验证和调试上述AOP实现。通过阅读和实践这些代码,将加深你对Spring AOP的理解...

    spring 常用jar包

    在"spring常用jar包"中,包含了Spring框架的核心组件和其他相关依赖,这些jar包构成了Spring生态的基础。下面我们将详细探讨这些jar包及其在开发中的作用。 1. **spring-core.jar**:这是Spring框架的核心模块,...

    Spring 中文教程

    Spring框架是Java开发中最常用的轻量级框架之一,以其强大的功能和灵活性深受开发者喜爱。本教程将基于提供的两本PDF文档——"Spring 2.0 中文用户指南"和"SpringGuide",来深入探讨Spring的核心概念和技术。 一、...

    Spring示例_Printer_Spring_AOP_Spring_Proxy

    首先,Spring框架是Java开发中最常用的轻量级框架之一,它提供了一种模块化和简化应用程序开发的方式。它包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问/对象关系映射(ORM)等多个核心特性。 AOP是...

    spring常用包

    以下是对Spring常用包的详细解析: 1. **spring-core**:这是Spring框架的基础,包含了核心工具类和资源处理。其中,BeanUtils、ClassUtils等工具类提供了通用的Java对象操作,Resource接口则用于处理各种类型的...

    详解Spring 框架中切入点 pointcut 表达式的常用写法

    下面将详细解释Spring框架中切入点表达式的常用写法。 1. **execution()指示符**: - `execution()`是Spring中最常用的切入点指示符,用于匹配方法执行。 - 语法结构:`execution(modifiers-pattern? ret-type-...

    Spring、Mybatis、Springboot常用面试试题及答案.rar

    在IT行业中,Spring、Mybatis和Springboot是Java开发者必备的三大框架,它们在实际开发中的应用广泛且深入。这份名为"Spring、Mybatis、Springboot常用面试试题及答案.rar"的压缩包文件,显然是为准备面试的Java...

    spring试题(含答案)

    6. 在 Spring 框架中,AOP 中的通知类型包括前置通知、后置通知、异常通知等。环绕通知的目标对象需要实现的接口是 MethodInterceptor。 7. AOP 将软件系统分为两个部分:切面和业务处理。AOP 是一种设计模式,...

    Spring Cloud 中文文档.pdf

    - **如何加入 Zuul**:Zuul 是 Spring Cloud 中的一个常用的 API 网关组件,用于路由和过滤请求。 - **嵌入式 Zuul 反向代理**:Zuul 可以作为反向代理服务器,将请求转发给后端服务。 - **Zuul Http 客户端**:Zuul...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    spring 2.5 jar常用包

    这个“spring 2.5 jar常用包”包含的可能是Spring框架2.5版本的核心库和其他相关依赖,如Spring MVC、Spring ORM、Spring AOP等。这些jar包可以用于构建基于Spring 2.5的应用,确保所有必需的类库都已包含,简化了...

    spring教学—常用的知识

    在这个“spring教学—常用的知识”中,我们可以期待学习到一系列关于Spring的重要概念和技术。 首先,Spring的核心特性之一是依赖注入。依赖注入允许我们解耦代码,使得组件之间通过接口进行通信,而不是硬编码依赖...

    Spring中IOC/AOP的说明和例子

    在Spring中,AOP可以通过代理实现,有JDK动态代理和CGLIB两种方式。JDK动态代理适用于实现了接口的类,而CGLIB则可以代理任何类。例如,以下代码定义了一个简单的切面: ```java @Aspect @Component public class ...

    Spring 相关jar包

    Spring框架是Java开发中最常用的轻量级框架之一,它的核心特性包括依赖注入(IOC)、面向切面编程(AOP)以及Web应用的Model-View-Controller(MVC)架构支持。此外,Spring还提供了对JSON数据处理的支持,使得与...

    Spring开发常用到的知识汇总

    Spring框架是Java应用程序开发中的一个核心组件,尤其在企业级应用和微服务架构中广泛应用。它提供了一种声明式编程模型,简化了依赖注入、事务管理、AOP(面向切面编程)等复杂任务。本汇总将深入探讨Spring开发中...

Global site tag (gtag.js) - Google Analytics