spring aop advice

1.前置通知:

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class HelloBeforeAdvice implements MethodBeforeAdvice{

    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("do something before some method");
    }
}

如果出现 The hierarchy of the type HelloBeforeAdvice is inconsistent错误 , 是缺少相关的jar或者jdk环境不对。

2.后置通知

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class HelloAfterAdvice implements AfterReturningAdvice {

    public void afterReturning(Object result, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("do something after the method");
    }

}

3. Test client

import org.springframework.aop.framework.ProxyFactory;

public class TestClient {

    public static void main(String[] args) {
        ProxyFactory proxyFactory = new ProxyFactory();//创建代理工厂
        proxyFactory.setTarget(new HelloImpl());
        proxyFactory.addAdvice(new HelloBeforeAdvice());
        proxyFactory.addAdvice(new HelloAfterAdvice());
        Hello helloProxy = (Hello) proxyFactory.getProxy();
        System.out.println(helloProxy.sayHello("zhangsan"));
    }
}

----------------------------public class HelloImpl implements Hello {

    public String sayHello(String str) {        System.out.println("hello>>>"+str);        return "hello>>>"+str;    }}

4. 环绕通知

//aop联盟提供的接口
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class HelloAroundAdvice implements MethodInterceptor {

    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("before method>>>");
        Object result = invocation.proceed();
        System.out.println("after method>>");
        return result;
    }
}

5. spring 配置文件方式

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/jdbc
    http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    http://www.springframework.org/schema/cache
    http://www.springframework.org/schema/cache/spring-cache.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd">
 <!-- 自动扫描ppms包 ,将带有注解的类 纳入spring容器管理 -->
    <context:component-scan base-package="com.cdv.ppms"></context:component-scan>

    <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="interfaces" value="com.cdv.ppms.Hello"/><!-- 需要代理的接口 -->
        <property name="target" ref="helloImpl"/><!-- 接口实现类 , 此处需要是ref 否则object is not an instance of declaring class-->
        <property name="interceptorNames"><!-- 拦截器 名称-->
            <list>
                <value>helloAroundAdvice</value>
            </list>
        </property>
    </bean>
   <bean id="helloImpl" class="com.cdv.ppms.HelloImpl"></bean>
</beans>
import org.springframework.stereotype.Component;

@Component
public class HelloImpl implements Hello {
//...
}

@Component
public class HelloAroundAdvice implements MethodInterceptor {
//....
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestXMLClient {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Hello    hello = (Hello) context.getBean("helloProxy");
        hello.sayHello("test xml");
    }
}
时间: 2024-10-23 19:39:05

spring aop advice的相关文章

spring AOP advice 类型 和 通用的切点的配置方式

spring aop advice的类型: 1.前置通知(before advice) 2.返回后通知(after returning advice) 3.抛出异常后通知(after throwing advice) 4.后通知:(after[finally] advice) 5.环绕通知:(around advice) ASpectJ和spring AOP 都支持的pointcut的配置方式: 1.execution(public * *(..))--->public的方法 2.executi

Spring+Maven学习实验- Spring AOP面向切面编程(二)

在 Spring AOP 中,有 3 个常用的概念,Advices . Pointcut . Advisor ,解释如下: Advices :表示一个 method 执行前或执行后的动作. Pointcut :表示根据 method 的名字或者正则表达式去拦截一个 method . Advisor : Advice 和 Pointcut 组成的独立的单元,并且能够传给 proxy factory 对象. 我们可以用名字匹配法和正则表达式匹配法去匹配要拦截的 method . 1 Pointcut

Spring AOP源码分析(拦截器调用的实现)

在Spring AOP通过JDK或者Cglib的方式生成代理对象的时候,相关的拦截器已经配置到代理对象中去了,拦截器在代理对象中的作用是通过对这些方法的回调完成的. JdkDynamicAopProxy的invoke拦截 JdkDynamicAopProxy的invoke @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MethodInvocation in

浅析Spring AOP(面向方面编程)

SpringAOP提供的优势 1.允许开发者声明企业级服务,比如:事务服务.安全性服务.EJB组件能够使用J2EE容器提供声明式服务.但是需要借助于EJB组件,而SpringAOP却不需要EJB容器,即借助于Spring的事务抽象框架能够在EJB容器外部使用企业级.声明式服务. 2.开发者可以开发满足业务需求的自定义方面.类似于JBOSS服务器中拦截器开发一样,如果标准的J2EE安全性不能满足业务需求,则必须开发拦截器. 3.开发SpringAOP advice很方便,这些AOP Advice不

正确理解Spring AOP中的Around advice

Spring AOP中,有Before advice和After advice,这两个advice从字面上就可以很容易理解,但是Around advice就有点麻烦了. 乍一看好像是Before advice和After advice的组合,也就是说pointcut会在joinpoint执行前后各执行一次.但是这种理解是不正确的,如果这样理解的话,就会产生这样的疑问:spring aop Around类型为什么只执行一次 ,这个帖子是我碰巧看到. 那么怎么样理解才是正确的呢?我们来看一下Spri

Spring AOP通知实例 – Advice

Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能. 在Spring AOP中,有 4 种类型通知(advices)的支持: 通知(Advice)之前 - 该方法执行前运行 通知(Advice)返回之后 – 运行后,该方法返回一个结果 通知(Advice)抛出之后 – 运行方法抛出异常后, 环绕通知 – 环绕方法执行运行,结合以上这三

Spring AOP Schema aop:config、tx:advice

Spring AOP Schema  aop:config.tx:advice 一.      利用aop:config标签实现AOP 首先看个例子,如下 接口代码: package com.lei.demo.aop.schema; public interface IHello { public void sayHello(); } 接口实现: package com.lei.demo.aop.schema; public class HelloService implements IHell

Spring 学习——Spring AOP——AOP配置篇Advice(无参数传递)

声明通知Advice 配置方式(以前置通知为例子) 方式一 <aop:config> <aop:aspect id="ikAspectAop" ref="ikAspect"> <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:pointcut&

Spring框架之Spring AOP

一.基于注解管理的AOP 1.Spring配置文件 <!-- 配置自动扫描包,自动扫描Bean组件,切面类 --> <context:component-scan base-package="com.zhoujian.spring.anno,com.zhoujian.spring.test"> <!-- <context:include-filter type="annotation" expression="org.a