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

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注解总结与案例

    Spring AOP之基于AspectJ注解总结与案例 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45394409

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

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

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

    下面小编就为大家分享一篇Spring Aop之AspectJ注解配置实现日志管理的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Spring实现AOP的多种方式 切点函数

    里面包括4个例子:(1)Spring实现AOP方式之一:基于XML配置的Spring AOP (2)Spring实现AOP方式之二:使用注解配置 Spring AOP (3)Spring AOP : AspectJ Pointcut 切点 (4)Spring AOP : Advice 声明 (通知注解)

    详解Spring Aop实例之AspectJ注解配置

    本篇文章主要介绍了详解Spring Aop实例之AspectJ注解配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

    Spring是方法级别的AOP框架,而我们主要也是以某个类的某个方法作为切点,用动态代理的理论来说,就是要拦截哪个方法织入对应AOP通知。 代码清单:打印角色接口

    spring中使用AspectJ注解相关类库文件

    要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar等jar包,文件已打包上传。

    SpringAOP+AspectJ

    以公司订单管理的模型为例(大部分步骤和业务了逻辑已经删除,只保存AOP注解这一部分)Spring AOP

    Spring AOP实验

    一、 实验目的 1、了解AOP的概念和作用; 2、理解AOP中的相关术语; 3、了解Spring中两种动态代理方式的区别;...分别使用基于XML和注解的AspectJ实现上述功能(创建两个项目)。 (图就是int加减乘除)

    Spring实现AOP的4种方式

    Spring中实现AOP有很多方式,这里总结了四种,有基于代理的实现方式,也有基于AspectJ 的注解方式,还有基于AOP标签的配置

    Spring AOP源码深度解析:掌握Java高级编程核心技术

    Spring AOP(面向切面编程)是Java高级编程中的重要...Spring AOP的配置方式多样,包括基于接口的配置、schema-based配置和@AspectJ注解配置。通过这些配置方式,开发者可以灵活地实现AOP功能,满足不同场景下的需求。

    Spring实现AOP的四种方式

    配置可以通过xml文件来进行,大概有四种方式: 1. 配置ProxyFactoryBean,显式地设置advisors, advice, target等(基于代理的AOP ) ...4. 通过&lt;aop: aspectj-autoproxy&gt;来配置,使用AspectJ的注解来标识通知及切入点

    Spring AOP 基于注解详解及实例代码

    Spring AOP 基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: &lt;beans xmlns:aop=http://www.springframework.org/schema/aop...&gt; &lt;!--启动支持--&gt; &lt;aop&gt; 也可以配置...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    内含有mybatis 拦截器实现的分页代码,spring 的事务和aop 测试、和反射工具类

    Spring使用AspectJ注解和XML配置实现AOP

    主要介绍了Spring使用AspectJ注解和XML配置实现AOP的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Spring5_AOP.pdf

    从Spring5-AOP的概念-&gt;底层原理-&gt;相关术语-&gt;AOP操作(AspectJ注解)-&gt;AOP操作(AspectJ配置文件)说明AOP的相关笔记

    基于AspectJ的AOP开发案例源码.rar

    demo1是aspectj的Aop开发,用于用户是否登录的验证,使用注解来实现,在切面类中配置好切入点。优点:方便快捷 demo2是aspectj的Aop开发,用于用户是否登录的验证,在xml中配置好切面。 优点:便于维护,不用修改源...

    基于框架的Web开发-基于AspectJ的AOP.doc

    2 一个简单的基于@AspectJ的AOP例子 2.1 创建Performance接口 创建Performance(表演、演出)接口,接口包含一个方法perform(),包名为aop(本章的类均放在aop包中)。 2.2 创建Performance接口的实现类Ballet 创建...

    Spring注解开发总结

    sping注解开发总结,基于注解开发,Spring的IOC的注解开发, Spring的AOP的基于AspectJ的XML的开发。

    Spring aop需要的jar包合集

    Spring AOP开发所需的jar包(AOP联盟、AspectJ及Spring对AOP的支持),包含4个包(spring-aop-4.3.17.RELEASE.jar、spring-aspects-4.3.17.RELEASE.jar、com.springsource.org.aopalliance-1.0.0.jar、aspectjweaver...

Global site tag (gtag.js) - Google Analytics