文档章节

spring4纯注解方式实现aop配置

流年_浮华诺言
 流年_浮华诺言
发布于 2016/04/19 16:46
字数 635
阅读 53
收藏 0
点赞 1
评论 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
博文 7
码字总数 3196
作品 0
济南
说说在 Spring 中如何基于 Java 类进行配置

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

deniro
05/11
0
0
spring4 --jar包简介

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

求是科技
2016/08/09
41
0
SSH框架之Spring4专题3:Spring与AOP

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

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

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

2846613430
2016/04/11
452
0
Spring Boot实战与原理分析

Spring Boot实战与原理分析 1:Spring Boot概述与课程概要介绍 2:Spring4 快速入门 3:Spring4 扩展分析(一) 4:Spring4 扩展分析(二) 5:Spring Boot 快速入门 6:Spring Boot 配置分析...

刘宗泽
06/26
0
0
实例讲解Java的Spring框架中的AOP实现

简介 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了 切面。切面对关注点进行模块化,例如横切多个...

清城北苑
2016/10/17
0
0
最最简单的spring及AOP实例

一、简单的spring实现(annotation方式) bean类 测试类: 运行结果: (xml方式) bean类 xml配置文件applicationContext.xml(放在包com.hello下) 测试类: 二、注解方式实现aop(需要导入...

wangxuwei
2017/10/24
0
0
spring aop 注解方式

今天大概看了一下spring4的jar 看到了aop 于是看看源码写了一下用例。比较简单,适用于 初学者。 aop的意思 大概应该都懂的。不懂的 可以先百度看看。 下面直接看下简单的例子吧。 第一 需要...

庞陆阳
2016/10/25
17
0
spring aop 注解方式

今天大概看了一下spring4的jar 看到了aop 于是看看源码写了一下用例。比较简单,适用于 初学者。 aop的意思 大概应该都懂的。不懂的 可以先百度看看。 下面直接看下简单的例子吧。 第一 需要...

杨中仁
2016/10/01
88
0
Spring AOP 的实现方式(以日志管理为例)

Spring AOP 的实现方式(以日志管理为例) 2016年10月08日 00:13:57 阅读数:23198 在学习Spring框架的历程中,最重要的是要理解Spring的IOC和AOP了,不但要学会怎么用,最好是知道它是怎么实...

Jeam_
07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
30分钟前
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
46分钟前
28
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
52分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
今天
0
0
mac Homebrew 指令积累

1通用命令 brew install [包名] //安装包 brew list //列举安装的包 brew info [包名] // 显示安装包的详细信息 mysql 相关 #启动mysql 服务 brew service start mysql my...

Kenny100120
今天
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
5
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部