文档章节

spring4纯注解方式实现aop配置

流年_浮华诺言
 流年_浮华诺言
发布于 2016/04/19 16:46
字数 635
阅读 67
收藏 0

maven配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>cn.outofmemory</groupId>
	<artifactId>spring-aop-aspect</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>spring-aop-aspect</name>
	<url>http://maven.apache.org</url>
	<properties>
		<spring.version>4.1.1.RELEASE</spring.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.6.12</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.6.12</version>
		</dependency>
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib</artifactId>
			<version>2.2</version>
		</dependency>
	</dependencies>
</project>

创建代理标志注解(只有拥有此注解的方法才被代理)

    package com.sisheng.equity.test;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.PARAMETER, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface UseProxy {
    }

创建要被代理的类(一般创建接口,然后代理接口)

    package com.sisheng.equity.test;
    
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Person {
    
        @UseProxy
        public void sayHello(String name) {
            System.out.println(name + ":hehe");
        }
    }

创建代理类

    package com.sisheng.equity.test;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.aspectj.lang.reflect.MethodSignature;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;
    
    @Aspect
    public class PersonAdvice {
    
        //定义切点
        @Pointcut(value = "@annotation(com.sisheng.equity.test.UseProxy)")
        private void anyMethod(){}//定义一个切入点
    
        @AfterReturning("anyMethod()")
        public void doAfter(){
            System.out.println("最终通知");
        }
    
        @AfterThrowing("anyMethod()")
        public void doAfterThrow(){
            System.out.println("例外通知");
        }
    
        @After("anyMethod()")
        public void after(JoinPoint point) throws Throwable {
            MethodSignature methodSignature = (MethodSignature) point.getSignature();
            //获取被代理的方法对象
            Method targetMethod = methodSignature.getMethod();
            //获取被代理的类对象
            Class targetClass = point.getSignature().getDeclaringType();
            //获取被代理方法的注解信息
            Annotation[] annotations = targetMethod.getAnnotations();
            //获取被代理方法传入的参数的信息
            Object[] params = point.getArgs();
    
            System.out.println("method name:"+point.getSignature().getName());
            System.out.println("method name:"+targetMethod.getName());
            System.out.println("class name:"+targetClass.getName()+":before");
            System.out.println("annotations name:"+annotations[0]);
            System.out.println("params name:"+params[0]);
    
            System.out.println("后置通知");
        }
    
        @Before("anyMethod()")
        public void before(JoinPoint point) throws Throwable {
            MethodSignature methodSignature = (MethodSignature) point.getSignature();
            //获取被代理的方法对象
            Method targetMethod = methodSignature.getMethod();
            //获取被代理的类对象
            Class targetClass = point.getSignature().getDeclaringType();
            //获取被代理方法的注解信息
            Annotation[] annotations = targetMethod.getAnnotations();
            //获取被代理方法传入的参数的信息
            Object[] params = point.getArgs();
    
            System.out.println("method name:"+point.getSignature().getName());
            System.out.println("method name:"+targetMethod.getName());
            System.out.println("class name:"+targetClass.getName()+":before");
            System.out.println("annotations name:"+annotations[0]);
            System.out.println("params name:"+params[0]);
    
            System.out.println("前置通知");
        }
    
        @Around("anyMethod()")
        public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
            System.out.println("进入环绕通知");
            Object object = pjp.proceed();//执行该方法
            System.out.println("退出方法");
            return object;
        }
    }

创建spring配置类

    package com.sisheng.equity.test;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.stereotype.Component;
    
    @Configuration
    //自动扫描配置
    @ComponentScan(basePackages = {"com.sisheng.equity.test"}, useDefaultFilters = false, includeFilters = {
            @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Aspect.class, Component.class})
    })
    //启用自动代理功能(相当于xml配置中这句话:<aop:aspectj-autoproxy/>)
    @EnableAspectJAutoProxy
    public class AppConfig {
    
    }

创建测试类

    package com.sisheng.equity.test;
    
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import javax.annotation.Resource;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {AppConfig.class})
    public class TestLock {
    
        @Resource
        private Person person;
    
        @Before
        public void setUp() throws Exception {
        }
    
        @Test
        public void testMyDao() {
            person.sayHello("nihao");
        }
    
        @Ignore
        public void testOtherSpringObject() {
            System.out.println("Not yet implemented");
        }
    }






© 著作权归作者所有

共有 人打赏支持
流年_浮华诺言
粉丝 0
博文 8
码字总数 3354
作品 0
济南
私信 提问
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(六)Spring中Redis的缓存的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/54174622 前面已经写了四篇关于dubbo2.5-spring4-mybastis3.2-springmvc4-mongo...

请叫我东子
01/05
0
0
spring4 --jar包简介

如下列举我在工程中常用的spring jar包,没有列出的,以后用到了逐步列出来 1.spring-core:它包含spring框架的基本核心工具类,spring其它jar包都要使用到这个jar包里面的类。例如:asm、c...

求是科技
2016/08/09
41
0
说说在 Spring 中如何基于 Java 类进行配置

JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 。 1 定义 Bean 普通的 POJO 只要标注...

deniro
2018/05/11
0
0
SSH框架之Spring4专题3:Spring与AOP

1 AOP的引入 1.1 Step1:项目aop_leadin1 先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要再写两个非业务方法,非业务方法也称之为交叉业务逻辑: doTransaction():用...

糖醋白糖
2018/06/26
0
0
2016年最新spring4框架搭建视频教程

Spring4.0作为一个广泛使用的开源 框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。 Spring4.0致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以...

2846613430
2016/04/11
452
0

没有更多内容

加载失败,请刷新页面

加载更多

刚入职阿里,告诉你真实的职场生活,兼谈P6、P7、P8的等级

一:拿下offer的人,基本上都有什么特征? 二:为什么选择阿里? 三:阿里的工作氛围什么样? 四:阿里的薪资情况? 五:阿里的晋升空间有多大? 最近部门招聘,很多工程师,包括我在内都参与...

java知识分子
14分钟前
1
0

中国龙-扬科
17分钟前
1
0
深入理解定时器系列第一篇——理解setTimeout和setInterval

很长时间以来,定时器一直是javascript动画的核心技术。但是,关于定时器,人们通常只了解如何使用setTimeout()和setInterval(),对它们的内在运行机制并不理解,对于与预想不同的实际运行状...

Jack088
20分钟前
2
0
windows 安装nvm

1、nvw-windows的官网:https://github.com/coreybutler/nvm-windows/releases 2、选择nvm-setup.zip安装 3、配置环境变量 4、检查nvm是否安装成功 使用管理员权限打开一个命令行。输入nvm v...

灰白发
30分钟前
1
0
MySQL

慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句。例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查...

士兵7
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部