[Spring] AOP, Aspect实例解析

最近要用到切面来统一处理日志记录,写了个小实例练了练手:

具体实现类:

public interface PersonServer {
    public void save(String name);
    public void update(String name, Integer id);
    public String getPersonName(Integer id);
}
import org.springframework.stereotype.Component;

@Component("personServerBean")
public class PersonServerBean implements PersonServer {
    public void save(String name) {
        System.out.println("save方法");
    }
    public void update(String name, Integer id) {
        System.out.println("update方法");
    }
    public String getPersonName(Integer id) {
        System.out.println("getPersonName方法");
        return "myName";
    }
}

切面类:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyInterceptor {
    @Pointcut("execution(* com.alibaba.aop.PersonServerBean.*(..))")
    private void anyMethod(){}

    @Before("anyMethod()")
    public void doAccessCheck() {
        System.out.println("前置通知");
    }
    @After("anyMethod()")
    public void after() {
        System.out.println("最终结果");
    }
    @AfterReturning("anyMethod()")
    public void doAfter() {
        System.out.println("后置通知");
    }
    @AfterThrowing("anyMethod()")
    public void doAfterThrow() {
        System.out.println("例外通知");
    }
    @Around("anyMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("进入环绕通知");
        Object object = pjp.proceed();
        System.out.println("退出方法");
        return object;
    }
    // 顺序: before->method->after->afterReturning
}

XML文件配置:

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--<context:annotation-config />这个配置可以去掉,在aspject-autoproxy里面包含了这个配置-->

    <aop:aspectj-autoproxy />

    <context:component-scan base-package="com...." />
    <!--<import resource="classpath:tutorial-beans.xml" /> 写到其他文件里面去,引入-->
</beans>

引用jar包pom文件配置:

<aspect-version>1.8.0</aspect-version>
<spring-version>3.2.7.RELEASE</spring-version>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${spring-version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>${aspect-version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>${aspect-version}</version>
            </dependency>

执行测试类:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

@Component("springAOPTest")
public class SpringAOPTest {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        PersonServer bean = (PersonServerBean) ctx.getBean("personServerBean");
        bean.save("test");
    }
}

执行结果:

进入环绕通知
前置通知
save方法
退出方法
最终结果
后置通知

总结-执行顺序:around->before->around->after->afterReturning

时间: 2024-10-10 17:06:02

[Spring] AOP, Aspect实例解析的相关文章

Spring DI基础实例解析

1.        在程序中提供需要依赖Spring为其注入属性的属性名和类型 package com.hao947.ioc; public class UserService { private String name; private String year; public void setName(String name) { this.name = name; } public void setYear(String year) { this.year = year; } public

Spring aop 小实例demo

Hadoop从2.4.0版本开始支持hdfs的ACL,在CDH5.0当中也集成了该特性,下面对其进行一些测试: unnamed user (file owner) 文件的拥有者 unnamed group (file group) 文件的所属组 named user 除了文件的拥有者和拥有组之外,的其它用户 named group 除了文件的拥有者和拥有组之外,的其它用户 mask  权限掩码,用于过滤named user和named group的权限 一.启用ACL: <property>

Spring AOP应用实例demo

AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-OrientedPrograming,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合. OOP的问题,AOP的补充 当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对

Spring AOP常见错误解析

Spring 3.0以后的版本相比于2时代的版本一个重要的变化就是aop所依赖的jar包没有一起发布,需要自己单独下载. Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理.如果被代理的目标实现了至少一个接口,则会使用JDK动态代理,如果用JDK动态代理,就必须为被代理的目标实现一个接口(要注意的地方是:需要将ctx.getBean()方法的返回值用接口类型接收):.所有该目标类型实现的接口都将被代理.若该目标对象没有实现任何接口,则创建一个CGLIB代理,如果使用CG

Spring AOP通知实例 – Advice

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

Spring AOP Aspect的简单实现(基于注解)

第1步:声明使用注解 <!-- 配置扫描注解--> 扫描包的位置<context:component-scan base-package="com.zz"/> <!-- 配置aop 注解生效 --><aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!--aop配置 切面类名--> 用于申明切面类<aop:config> <aop:aspect ref

Spring搭配Ehcache实例解析

转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/50538085 1 Ehcache简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST

Spring AOP编程实例

整个类包如下: 一.具体各个类 1.1前置通知类 package com.yuan.aop; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class MymethodBeforeAdvice implements MethodBeforeAdvice { @Override public void before(Method arg0, Object[] ar

Spring AOP源码解析

以编程的方式使用spring提供的AOP功能,下面是一个简单的例子: package com.zws.spring.core.aop.springAop; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; import org.springframework.aop.framework.ProxyFactory; public class SpringProxyClient {