文档章节

spring4纯注解方式实现aop配置

流年_浮华诺言
 流年_浮华诺言
发布于 2016/04/19 16:46
字数 635
阅读 57
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

移动端Appium自动化测试框架的优势

众所周知,现在市面上的移动端操作系统已被Android和IOS占领,其中Android的份额更是在80%以上。那么面对市面上林林总总的自动化测试框架和工具,为什么说Appium在自动化测试框架的统治级优势...

程序猿拿Q
6分钟前
0
0
设计模式 之 观察者模式

设计模式 之 观察者模式 场景 场景比较简单,当一个对象的状态发生改变时,自动通知所有依赖(或观察)它的对象。 比如:发布/订阅 原理:发布者存储N个订阅者的对象信息,当发布者发布消息时...

GMarshal
10分钟前
0
0
linux 常用

netstat -tunlp |grep 8080 查看8080 占用 netstat -tunlp 用于查看所有的端口号的进程情况

west_coast
15分钟前
1
0
Bytom信息上链教程

比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的...

比原链Bytom
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部