`
234390216
  • 浏览: 10238545 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462882
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775974
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398732
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395157
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680169
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531136
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1185005
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468800
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151489
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68339
社区版块
存档分类
最新评论

Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现

阅读更多

2 基于Aspectj注解的Spring Aop简单实现

Spring Aop是基于Aop框架Aspectj实现的,它不是完完全全的对Aspectj框架进行扩展和改造,而是利用Aspectj里面的一些功能来实现自己的Aop框架,其中就包括对Aspectj提供的注解的解析。之前已经提过Spring Aop和Aspectj实现的Aop之间的差别,这里就不再赘述。本文主要描述的是如何利用Aspectj提供的注解来实现Spring Aop功能,旨在让大家对Spring Aop、对使用Aspectj注解开发Spring Aop有一个初步印象。

2.1 启用对Aspectj注解的支持

使用Aspectj注解来实现Spring Aop时我们首先需要启用Spring对Aspectj注解支持的功能,这是通过配置来进行的。当我们的Spring配置是以配置文件为主时,我们可以通过在Spring的配置文件中引入aop相关的schema,然后通过<aop:aspectj-autoproxy/>来启用对Aspectj注解的支持。

<?xml version="1.0" encoding="UTF-8"?>
<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/>
	<context:component-scan base-package="com.elim.test"/>
	<!-- 启用对Aspectj注解的支持 -->
    <aop:aspectj-autoproxy/>

</beans>

当我们的配置是通过使用@Configuration标注的配置类来进行的时候,我们就可以通过在该配置类上使用@EnableAspectJAutoProxy进行标注来启用对Aspectj注解的支持。

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

}

2.2 定义切面类

定义切面类比较简单,只需要定义一个简单的使用@Aspect进行标注的类即可。@Aspect是Spring Aop识别切面类的一个标记,但是光使用@Aspect对切面类进行标注还不行。因为Spring Aop只能对定义在bean容器中的bean发生作用,对应的切面类也必须是定义在bean容器中的bean对象时其才能发现。@Aspect不具备默认让Spring扫描到它,把对应的类实例化为Spring bean的功能,所以我们必须要在bean容器中定义该bean。可以通过配置文件定义,也可以通过使用@Component进行标注等。

@Aspect
@Component
public class MyAspect {
	
}

使用@Aspect标注的切面类也可以像普通类一样定义普通的属性和方法,如果有需要也可以把它当做一个普通的bean使用。

2.3 定义Pointcut

Pointcut是用来定义切面类需要作用的JoinPoint的,在Spring Aop中这些JoinPoint其实就是一些我们需要进行切入的方法执行,因为之前我们说过Spring Aop只支持对bean方法执行的切入。基于Aspect注解形式定义的Pointcut的核心是@Pointcut注解,我们需要在Aspect类中定义一个没有返回值的方法,方法类型可任意,然后在该方法上使用@Pointcut进行标注,表示其是一个Pointcut定义,对应的方法名即表示该Pointcut的名称。@Pointcut有一个value属性,其通常是一个表达式,通过它可以指定当前Pointcut需要作用的JoinPoint。表达式可以有很多种写法,这个在后续会专门讲解,通常用的最多的就是execution,表示方法的执行。如我们想定义一个Pointcut的JoinPoint为所有add方法的执行,那么我们可以如下定义。

@Aspect
@Component
public class MyAspect {

	@Pointcut("execution(* add(..))")
	private void pointcut() {}
	
}

2.4 定义Advice

Advice需要与Pointcut绑定在一起,用以定义需要在指定的Pointcut匹配的JoinPoint处执行的操作。Advice主要有三种类型,before、after和around,Aspectj对它们都有对应的注解进行支持。基于Aspectj注解的advice定义是通过对应的注解来指定的,我们需要在切面类中定义一个方法,然后在该方法上使用对应的注解进行标注。对应的advice注解都有一个value属性,我们需要通过它来指定与之绑定的Pointcut,对应的Pointcut需要通过Pointcut定义的类全名称.方法名()来指定,如果是在当前切面类中定义的Pointcut则可以省略对应的类名称。这里主要拿before来做一个示例,如下,我们在切面类中定义了一个方法before,并用@Before注解标注了该方法,同时指定了其所绑定的Pointcut为同一个切面类中定义的pointcut。

@Aspect
@Component
public class MyAspect {

	@Pointcut("execution(* add(..))")
	private void pointcut() {}
	
	@Before("com.elim.test.spring.aop.MyAspect.pointcut()")
	private void before(JoinPoint joinPoint) {
		System.out.println(joinPoint.getTarget() + "----------------------Before---------------------");
	}
	
}

至此,当我们在访问Spring bean容器中任意bean对象的add方法前就会调用MyAspect切面类中定义的before方法了。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {

	@Autowired
	private UserService userService;
	
	@Test
	public void test1() {
		User user = new User(1, "ZhangSan");
		userService.add(user);
	}
	
}

(注:本文是基于Spring4.1.0所写,写于2016年9月5日星期一)

0
0
分享到:
评论

相关推荐

    征服Spring AOP—— @AspectJ

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。@AspectJ是Spring AOP的一种注解驱动方式,它极大地简化了...

    Spring AOP之基于AspectJ注解总结与案例

    本篇内容将对Spring AOP中基于AspectJ注解的使用进行总结,并通过实际案例进行解析。 首先,让我们理解AspectJ注解在Spring AOP中的核心概念: 1. **@Aspect**: 这个注解用于定义一个类为切面,这个类将包含切点和...

    Spring Aop之AspectJ注解配置实现日志管理的方法

    Spring Aop之AspectJ注解配置实现日志管理的方法 Spring Aop是基于AspectJ实现的面向切面编程(AOP),它提供了一个灵活的方式来实现日志管理。通过使用AspectJ注解,可以轻松地实现日志记录、性能监控、安全检查...

    Spring的AOP依赖包-AspectJ

    当启用AspectJ注解驱动的AOP(`@EnableAspectJAutoProxy`),Spring会自动创建代理对象来处理通知。此外,还可以通过`@AspectJSupport`和`&lt;aop:aspectj-autoproxy&gt;`元素来启用XML配置方式。 在实际应用中,AspectJ...

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    4. **启用注解驱动的AOP**: 在Spring配置中,使用`@EnableAspectJAutoProxy`注解开启对AspectJ注解的支持。 例如: ```java @Aspect @Component public class MyAspect { @Before("execution(* ...

    Spring AOP 概念理解及@AspectJ支持

    Spring AOP的实现基于动态代理,对于接口实现类,它使用Java的`java.lang.reflect.Proxy`类来创建代理对象;对于没有接口的类,Spring使用CGLIB库生成子类。在运行时,Spring AOP会根据切面定义生成代理对象,然后...

    五、Spring源码分析——Spring Aop

    `org.aopalliance.intercept.MethodInterceptor`接口定义了拦截器的行为,而`org.springframework.aop.MethodBeforeAdvice`等类则是具体的通知实现。`org.springframework.aop.aspectj.AspectJExpressionPointcut`类...

    @AspectJ配置Spring AOP,demo

    在Spring AOP中,@AspectJ注解是实现切面编程的关键。@AspectJ是一种类型级别的元数据,它允许我们定义切面类,其中包含了切点(Pointcut)、通知(Advice)和组装(Join Point)等概念。 **一、@AspectJ注解** @...

    spring aop注解版

    在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的实现,简化了配置并提高了代码的可读性。 首先,让我们理解AOP的基本概念。AOP是一种编程范式,允许程序员定义“切面”,这些切面封装了跨越多个...

    Spring AOP + AspectJ annotation example

    本篇将深入探讨如何结合Spring AOP和AspectJ注解进行实践。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,这些切面封装了跨越多个对象的行为或关注点。在Spring中,切...

    Spring基于注解实现AOP

    本篇文章将深入探讨如何在Spring中通过注解实现AOP。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,这些切面包含了跨越多个对象的行为或责任。切点是这些行为插入到主业务逻辑...

    Spring AOP 16道面试题及答案.docx

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    spring 使用 AspectJ注解开发Spring AOP.docx

    总的来说,Spring AOP结合AspectJ注解,让我们能够方便地定义切点和通知,实现代码的解耦和模块化。在`RoleAspect`类中,我们定义了`RoleServiceImpl`的`printRole`方法作为切点,并设置了一个前置通知,这使得我们...

    Spring Aop四个依赖的Jar包

    Spring AOP就是基于这些接口进行设计的,因此这个库是Spring AOP和其他AOP实现之间协作的基础。 在实际使用中,我们需要在项目的类路径下包含这些Jar包,并在Spring配置文件中启用AOP支持。例如,可以通过以下XML...

    Spring 入门案例——AOP

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在...

    springboot spring aop 拦截器注解方式实现脱敏

    总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...

    SpringAOP+AspectJ

    Spring框架提供了对AOP的支持,使得在Java应用中实现AOP变得简单易行。在这个例子中,我们将重点讨论Spring AOP以及如何结合AspectJ进行更深入的切面编程。 **一、Spring AOP基础** Spring AOP是Spring框架的一...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    征服Spring AOP—— Schema

    本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...

    spring对AOP的支持(使用AspectJ进行AOP演示)

    Spring 提供了两种主要的 AOP 实现方式:基于代理的和基于 AspectJ 的。基于代理的方式是 Spring 默认的实现,它通过 JdkDynamicProxy 或 CGLIB 创建代理对象来实现切面。而基于 AspectJ 的方式则更为强大,它允许...

Global site tag (gtag.js) - Google Analytics