浅谈spring——注解配置(九)
spring定义一个切面是件麻烦的事情,需要实现专门的接口,还要进行一些较为复杂的配置,有没有较为简单的方法???
@AspectJ注解可以很容易定义一个切面,且不需要实现任何的接口。缺点是对JDK的版本有限制,要求是5.0以上
当然对于不足5.0的版本,可以通过Schema的配置定义切面,方便程度和@AspectJ相差无几。
无论是基于XML配置的AOP还是基于@AspectJ注解的AOP,只是在表达方式有所不同,底层都是采用动态代理技术(JDK代理或CGLib代理)。
注解是代码的附属信息,它遵循一个原则:注解不能直接干扰程序代码的运行,无论是增加或删除注解,代码都能正常运行。java语言解释器会忽略这些注解,而由第三方工具对注解进行解析,从而达到间接控制程序代码的运行,它们通过java反射机制读取注解的信息。
Pointcut和Advice分别表切点和增强,并用Advisor将两者整体为切面,@AspectJ则是采用注解的方式来描述切点、增强,两者只是表述上有所不同,本质是一样的。
代码示例:
切面
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class PreGreetingAspect{
@Before("execution(* greetTo(..))")
public void beforeGreeting(){
System.out.println("How are you");
}
}
a. PreGreetingAspect类定义处,标注了@Aspect注解,表示其为一个切面。
b. beforeGreeting方法上,Before表示是前置增强;execution(* greetTo(..))表示一个切点表达式,在目标类的greetTo()方法上织入增强,greetTo方法可以带任意入参和任意返回值。
c. beforeGreeting方法体,表示具体的横切逻辑。
PreGreetingAspect类通过注解和代码,将切点、增强类型、增强逻辑糅合到一个类中。
配置文件
<aop:aspectj-autoproxy/>
//目标bean
<bean id="waiter" class="com.baobaotao.NaiveWaiter" />
//采用@AspectJ注解的切面类
<bean class="com.aspectj.example.PreGreetingAspect" />
//自动代理创建器,自动将@AspectJ切面类织入到目标Bean中
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>
AspectJ的切点表达式由关键字和操作参数组成。如execution(* greetTo(..))
execution为关键字(ps:表示目标类执行某一方法)
* greetTo(..)为操作参数(ps:表示目标方法的匹配模式串)
目前spring支持9个@AspectJ切点表达式函数,他们用不同的方式描述目标类的连接点,大致分为4种类型:
1)方法切点函数:通过描述目标类方法信息定义连接点,如execution
2)方法入参切点函数:通过描述目标类方法入参的信息定义连接点
3)目标类切点函数:通过描述目标类类型信息定义连接点
4)代理类切点函数:通过描述目标类的代理类的信息定义连接点
增强类型:
@Before 前置增强
@AfterReturning 后置增强
@Around 环绕增强
@AfterThrowing 抛出异常的增强
@DeclareParents 引介增强
与xml形式的基本一致,只是换了种表达方式,采用了注解的形式来描述。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对于不满足JDK5.0的项目,只能望@AspectJ而兴叹了。没关系,我们还可以用Schema配置切面
说白了,其实就是将注解信息移到了Schema的XML配置文件中,形式不同罢了。
简单实例:
xml配置文件
<aop:config proxy-target-class="true">
//增强方法所在的bean
<aop:aspect ref="adviceMethods">
//前置增强
<aop:before method="preGreeting"
//切点表达式,与@AspectJ的语法相同
pointcut="target(com.baobaotao.NaiveWaiter) and args(name)"
arg-names="name" />
//后置增强
<aop:after-returning method="afterReturning"
pointcut="target(com.baobaotao.SmartSeller)" returning="retVal" />
</aop:aspect>
</aop:config>
<bean id="adviceMethods" class="com.baobaotao.schema.AdviceMethods" />
<bean id="naiveWaiter" class="com.baobaotao.NaiveWaiter" />
<bean id="naughtyWaiter" class="com.baobaotao.NaughtyWaiter" />
<bean id="seller" class="com.baobaotao.SmartSeller" />
其中
1、 <aop:aspect>元素定义切面,内部可以定义多个增强
2、 <aop:config>拥有一个proxy-target-class属性,true时表示声明的切面采用CGLib动态代理技术;反之表示使用JDK动态代理技术
增强类:AdviceMethods
public class AdviceMethods {
public void preGreeting(String name) {
System.out.println("--how are you!--");
System.out.println(name);
} //后置增强对应方法
public void afterReturning(int retVal){
System.out.println("----afterReturning()----");
System.out.println("returnValue:"+retVal);
System.out.println("----afterReturning()----");
} }
浅谈spring——注解配置(九)的更多相关文章
- 浅谈Spring中的Quartz配置
浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配
Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...
- 浅尝Spring注解开发_Bean生命周期及执行过程
Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含Bean生命周期.自定义初始化方法.Debug BeanPostProcessor执行过程及在Spring底层中的应 ...
- 浅尝Spring注解开发_AOP原理及完整过程分析(源码)
浅尝Spring注解开发_AOP原理及完整过程分析(源码) 浅尝Spring注解开发,基于Spring 4.3.12 分析AOP执行过程及源码,包含AOP注解使用.AOP原理.分析Annotation ...
- 浅尝Spring注解开发_Servlet3.0与SpringMVC
浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...
- 【ASP.NET MVC系列】浅谈数据注解和验证
[ASP.NET MVC系列]浅谈数据注解和验证 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google C ...
- 关于Spring注解配置的步骤
今天分享一下 关于Spring注解配置的流程 1 导包:如下图所示 2 书写User和Car类 代码如下 package cn.lijun.bean; public class Car { priv ...
- Spring注解配置和xml配置优缺点比较
Spring注解配置和xml配置优缺点比较 编辑 在昨天发布的文章<spring boot基于注解方式配置datasource>一文中凯哥简单的对xml配置和注解配置进行了比较.然后朋 ...
随机推荐
- java环境变量配置问题
你要配置三个环境变量JAVA_HOMECLASSPATHPath你都配置了吗? 系统变量→新建 JAVA_HOME 变量 .变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) 系统 ...
- BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )
水状压dp. dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n) ------------------- ...
- net core 中间件详解及项目实战
net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...
- VDI转vmdk(VirtualBox与VMware硬盘格式转换)[转]
VirtualBox用了一段时间,感觉没想像中那么的好.虽然设置里可以分配多CPU,但是分配多CPU后经常系统挂掉.整体感觉不够稳定,但它也有好处就是开源免费.但经常挂机总不能一直使用它,索性转到Vm ...
- Oracle多表的简单查询
Oracle多表的简单查询 .多表查询 多表查询是指基于两个和两个以上的表或是视图的查询. 问题:显示雇员名,雇员工资及所在部门的名字[笛卡尔集]? select t.ename,t.sal,t1.d ...
- POJ - 1422 Air Raid 二分图最大匹配
题目大意:有n个点,m条单向线段.如今问要从几个点出发才干遍历到全部的点 解题思路:二分图最大匹配,仅仅要一条匹配,就表示两个点联通,两个点联通仅仅须要选取当中一个点就可以,所以有多少条匹配.就能够减 ...
- GreenDao数据库结构升级
1.先用GreenDao工具类编写自动创建代码,按照升级后的最新数据库结构来编写 2.GreenDao工具自动生成的代码覆盖到项目里去 3.在项目里找到对应的自动生成的数据库DaoMaster类 在D ...
- jquery 提交数据
目录 jquery ajax的应用 1 表单提交 2 ajax的提交(ajax post get) 普通的表单提交 <%@ page language="java" impo ...
- Tomcat 乱码设置
如果表单是以get方式提交就会出现中文乱码这时可以在tomcat中配置解决中文乱码问题. 方法如下:在tomcat的conf文件夹下的conf中找到server.xml文件 找到 Connector ...
- (1)前言——(10)jquery项目的历史(History of the jQuery project)
This book covers the functionality and syntax of jQuery 1.6.x, the latest version at the time of wri ...