- 浏览: 38692 次
- 性别:
- 来自: 北京
文章分类
首先写个题记吧 --- 如果你是 Spring 高手。那么我所写的文章对你可能一文不值 ( 至少最近几篇 ) ,就等于说让你看小学课本 ( 本人水平也一般 ) ;如果你觉得你是个新手,希望这篇文章没有浪费你的时间,让你有所收获!
前两篇文章一直不断的在给 Spring 之 AOP 做铺垫。如果你刚接触 AOP 不久还是希望你从 JDK 动态代理那篇文章一一看起,那也是我学习 AOP 的一个缩影。我觉得今天该写写所谓 Spring 中的 AOP 了,其实这并不是个什么新鲜事物只是 Spring 将它纳入自己的框架取名曰: AOP( 面向切面编程 ) 。
在 Spring 中 AOP 有两种实现技术:一种不太用的是通过 Annotation( 注解 ) 实现。另一种方法就是通过配置文件来实现也就是我们的 configuration ,通过配置达到目的。 ( 这也是现在提倡的用法 ) 。但是为了理解原理,我还是从 Annotation 说起吧。懂了原理其他就好办了。
Annotation 方式实现 AOP ,首先得添加架包支持这两个包就是: aspectjrt.jar 和 aspectjweave.jar 。当然你还得添加一些其他的 Spring 支持。我们通过代码来来讲解吧
因为是面向切面编程了,那知道横切关注点了(假如我要实现安全验证),那我们得将其抽取出来,模块成一个类(也就是 AOP 的关键工作寻找切面 ,或者说自己创建切面 。这个是可以按需所求的,就是说你可以设计自己需要功能的切面)。那我就创建一个安全类吧:但为了体现面向接口编程的思想,我们想抽取成接口然后在通过接口的实现类来实现这一功能:
创建接口:(这个是普通类的接口,也就是后面要使用切面的目标类的类接口)
- package com.jummy.aop;
- public interface UserManager {
- public void addUser(String string,String name);
- public void delUser(int id);
- public void modifyUser(int id,String name,int age);
- }
package com.jummy.aop; public interface UserManager { public void addUser(String string,String name); public void delUser(int id); public void modifyUser(int id,String name,int age); }
接着是接口的实现类: ( 截图比较模糊 ,我附有源码的 )
- package com.jummy.aop;
- public class UserManagerImpl implements UserManager {
- public void addUser(String id, String name) {
- System.out.println("---UsreManagerImpl中的addUser方法的实现-----");
- }
- public void delUser(int id) {
- System.out.println("-----delUser方法的实现-----");
- }
- public void modifyUser(int id, String name, int age) {
- System.out.println("----modifyUser方法的实现-----");
- }
- }
package com.jummy.aop; public class UserManagerImpl implements UserManager { public void addUser(String id, String name) { System.out.println("---UsreManagerImpl中的addUser方法的实现-----"); } public void delUser(int id) { System.out.println("-----delUser方法的实现-----"); } public void modifyUser(int id, String name, int age) { System.out.println("----modifyUser方法的实现-----"); } }
创建切面的接口:(所有的切面都可以从此接口继承,这里这样写主要是体现面向接口编程的思想。这里提供实现安全验证的接口)
- package com.jummy.aop;
- public interface MySecurityManager {
- public void security();
- //也可以添加多个方法
- //public void security2();
- }
package com.jummy.aop; public interface MySecurityManager { public void security(); //也可以添加多个方法 //public void security2(); }
创建切面 ( 类 ) :这是重点,除了实现接口中的方法以外,还需要在 Aspect 中定义 Pointcut 以及 Advice 。当然这一切是通过文章开头说的 Aspectj 实现的,主要功能有两个架包提供我们可直接引用( aspectjrt.jar 和 aspectjweave.jar )!
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- /*
- * 我们已经把横切关注点抽取出来了
- * 那就需要定义我们的Aspect了(类)
- */
- @Aspect
- //使用@Aspect之前记得要引入aspectjrt.jar和aspectjweaver.jar
- public class MySecurityManagerImpl implements MySecurityManager {
- /*
- * 定义切入点,切入
- *
- * 该方法只是一个标识(而且只作为标识并不是常态下的方法,并不供人调用所以没有返回值最好设置为private), 切入点的内容是一个表达式。
- * 根据这个表达式就可以用来判断切入哪些对象的哪些方法
- */
- @Pointcut("execution(* add*(..))")
- /*
- * 下面对表达式简单说一下: execution(* add*(..))第一个*说匹配是方法的任意返回值类型
- * 待会可以试验一下。add*就是表示以add开头的方法名都可以匹配想到正则表达式了吗? (..)这两个就是表示方法里所传递的参数类型也是任意匹配。
- * 具体的请参考spring的开发手册, 这一点Spring讲的比较清楚。
- *
- */
- private void addAllMethod() {
- }
- /*
- * 定义Advice,标识在哪些切入点(切入点有ADD这是我们上面通过pointcut定义的。当然你也可以定义别的)
- * 的何处(何处就是指是切入点的前面呢?后面?还是其他情况)织入通知 当然除了before还有其他类型的通知。这里就不在累赘了
- *
- */
- @Before("addAllMethod()")
- public void security() {
- System.out.println("-----调用security方法-------");
- }
- /*这里也可以添加一些其他的前置方法
- * @Before("addAllMethod()")
- public void security2() {
- System.out.println("-----调用security方法2-------");
- }
- */
- }
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; /* * 我们已经把横切关注点抽取出来了 * 那就需要定义我们的Aspect了(类) */ @Aspect //使用@Aspect之前记得要引入aspectjrt.jar和aspectjweaver.jar public class MySecurityManagerImpl implements MySecurityManager { /* * 定义切入点,切入 * * 该方法只是一个标识(而且只作为标识并不是常态下的方法,并不供人调用所以没有返回值最好设置为private), 切入点的内容是一个表达式。 * 根据这个表达式就可以用来判断切入哪些对象的哪些方法 */ @Pointcut("execution(* add*(..))") /* * 下面对表达式简单说一下: execution(* add*(..))第一个*说匹配是方法的任意返回值类型 * 待会可以试验一下。add*就是表示以add开头的方法名都可以匹配想到正则表达式了吗? (..)这两个就是表示方法里所传递的参数类型也是任意匹配。 * 具体的请参考spring的开发手册, 这一点Spring讲的比较清楚。 * */ private void addAllMethod() { } /* * 定义Advice,标识在哪些切入点(切入点有ADD这是我们上面通过pointcut定义的。当然你也可以定义别的) * 的何处(何处就是指是切入点的前面呢?后面?还是其他情况)织入通知 当然除了before还有其他类型的通知。这里就不在累赘了 * */ @Before("addAllMethod()") public void security() { System.out.println("-----调用security方法-------"); } /*这里也可以添加一些其他的前置方法 * @Before("addAllMethod()") public void security2() { System.out.println("-----调用security方法2-------"); } */ }
所有原理我都注释在源码中。其中在 Aspect 中需要做的就是定义 Pointcut 以及 Advice 。在定义 Pointcut 的过程中我们需要注意几点:首先在 Aspectj 的支持下, @Pointcut(“execution(* add*(..))”) 来实现。表达式我不多讲了自己看 Spring 的手册去吧。解释代码中 private void addAllMethod(){} 这是一个没有返回值的空方法体,它程序的实际运行过程中并不执行 ( 同时我们也不希望它被其他人调用所以设置为 private 以权限控制 ) 。它只是一个标识,这个标识会被下面代码中的 Advice( 也就是 @before(“addAllMethod()”) 调用。它的作用类似于变量名,起一个被调用的载体的作用 ( 所以称为标识 ) ;当然切入点的内容 ( 也就是引号里的一些表达式 ) 它们起到的作用就是来描述我们要切入哪些对象的哪些方法。
OK , pointcut 我们定义完成轮到 Advice 了。 Advice 是通过 @before(“addAllMethod()”) 来定义的,当然你可以是 after/throws 等等其他类型的通知。代码 public void security(){-------} ;
这就是通知的具体方法实现,也就是我前面说的要添加的安全验证。而且我申明了该验证在我执行所有的以 add 开头的方法之前执行。
最后看看 spring 的配置文件里怎么写吧。
< aop:aspectj-autoproxy /> // 这里就是申明添加 aspectj 的支持,跟导入一个包类似的作用
<!— 下面是切面的注入 -->
< bean id = "mySecurityManagerImpl" class = "com.jummy.aop.MySecurityManagerImpl" ></ bean >
<!-- 这是目标对象的注入 -->
< bean id = "userManagerImpl" class = "com.jummy.aop.UserManagerImpl" ></ bean >
大家可能看到了,通过 Aspectj 对 Annotation 支持实现 , 所有的 Advice 啊 Pointcut 啊都是直接在代码中实现的 当然里面具体逻辑是 Spring 帮你通过代理来实现的,毕竟你自己的实现类中(如 UserManagerImpl 类中并没有任何对安全性检查的调用)
发表评论
-
Tomcat解决URL传中文的方法
2007-09-28 19:03 891在TOMCAT-HOME/conf/server.xm ... -
介绍两个jsp上传组件commons-fileupload和SmartUpload(部分来自网页)
2007-09-28 21:39 1105第1个上传组件commons-fileupload ==== ... -
仍一个能增减行的javascript
2007-10-08 18:52 742<html><head> <s ... -
jFreeChart(动态web应用)
2007-10-09 14:12 763JFreeChart 1.0.2的动态应用,根据数据库中的 ... -
jFreeChart初探(静态应用)
2007-10-09 14:17 589初学JFreeChart,整理一个例子:(部分来自网页) ... -
初探tomcat连接池
2007-10-11 18:30 551相关工具: tomcat版本5.5 ,mysql,drp(数据 ... -
初探struts中的(Converter)的一个例子
2007-10-18 19:09 584Struts中的Converter可以将一些特定对象转换成字符 ... -
other
2007-10-19 18:23 647最近正在抽时间研究jive的源代码,如果有谁想 ... -
struts(il8n)实现国际化的一个例子
2007-10-19 20:45 833struts利用在session中放一个local对象来 ... -
struts中自定义taglib函数例子
2007-10-21 12:43 645首先建立自己的函数:package com.struts; ... -
一个从另一个打开页面返回值的javascript例子
2007-11-16 14:52 776今天写项目的时候用到了需要从另一个打开页面取值的j ... -
struts中利用ExceptionHandler处理异常
2007-11-22 13:33 660在Struts1.X的版本中加入了对异常的处理 ... -
DWR学习及应用
2007-11-25 20:31 645DWR是一个开源的类库,可以帮助开发人员开发包含AJAX技术 ... -
java群
2007-12-03 20:25 63刚健了一个java群,用于大家互相探讨java,共同促进学习, ... -
ibatis学习(三)---ibatis与spring的整合
2007-12-07 18:26 2000Spring通过DAO模式,提供了对iBATIS的良好支持 ... -
ibatis学习(二)--ibatis使用介绍
2007-12-07 18:27 716SqlMapClient对象 这个对象是iBatis操作 ... -
ibatis学习(一)--ibatis介绍以及用例
2007-12-07 18:31 648介绍 iBATIS是以SQL为中 ... -
dwr实现级联菜单
2007-12-08 10:39 790Dwr的介绍请见:http://www.blogjava. ... -
JSF学习及应用一-(安装配置)
2007-12-11 09:38 733JSF(JavaServer Faces) JSF是JA ... -
JSF学习及应用二-(用例)
2007-12-11 09:41 567实例1 1、 创建一个JSP 2、 在相同的路径下,用. ...
相关推荐
NULL 博文链接:https://tianhei.iteye.com/blog/978969
总的来说,基于Annotation的AOP实现使得我们在编写Spring应用时能更加专注于业务逻辑,而不必关心那些横切关注点。这种编程方式提高了代码的可读性和可维护性,同时也减少了代码重复。通过学习和熟练掌握这一技术,...
这篇博客"使用EJB+Annotation实现AOP的DEMO"主要介绍了如何在EJB中利用注解(Annotation)来实现AOP的功能。在Java EE中,EJB 3.0及后续版本引入了大量的注解,使得开发者可以免去编写XML配置文件,直接在代码中声明...
本篇“spring学习之五”主要介绍的是注解驱动的AOP实现。 1. **定义切面**:在Spring中,我们通常通过创建一个带有`@Aspect`注解的类来定义切面。在这个类中,我们可以定义切点和通知。例如: ```java @Aspect ...
总的来说,"Spring_Annotation_AOP"资料将帮助你掌握如何在Spring框架中利用注解实现面向切面编程,理解AOP的核心概念和实际应用场景,从而提升你的Java开发技能。通过学习和实践,你可以更加熟练地运用Spring框架来...
本实例将详细探讨如何通过注解(Annotation)来实现Spring AOP的方法拦截。 一、Spring AOP基础 Spring AOP是Spring框架的一部分,它提供了一种在运行时织入横切关注点(如日志、事务管理等)到目标对象的能力。AOP...
Spring AOP提供了两种主要的方式来实现这一点:基于XML的配置和基于注解的配置。 对于基于XML的配置,我们需要在`<aop:config>`标签内定义切点表达式和通知(advice),如下: ```xml <aop:config> <aop:pointcut...
通过阅读《学习Spring笔记_AOP_Annotation实现和XML实现》,你可以更好地理解Spring AOP的工作原理,以及如何在实际项目中灵活运用。无论是注解还是XML配置,都是为了提高代码的可读性和可维护性,使我们能够更专注...
总结来说,Spring通过注解实现AOP提供了一种声明式的方法来管理横切关注点,使得代码更加整洁,提高了可读性和可维护性。通过熟练掌握这些注解的使用,开发者可以更高效地处理系统中的共性问题,提升代码质量。
Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar
本篇文章将重点讲解如何通过XML配置方式在Spring中实现AOP。 首先,了解AOP的基本概念是必要的。AOP的核心是切面(Aspect),它封装了多个相关操作,形成了一个关注点。切点(Pointcut)定义了这些操作应用到何处,...
在实际项目中,我们通常会结合Spring Boot和Spring MVC,通过`@Controller`、`@Service`、`@Repository`等注解来定义我们的业务层,然后通过AOP注解来增强这些服务。例如,我们可以在`@Service`类中定义业务逻辑方法...
通过AOP,我们可以将这些通用的功能抽取出来,形成独立的切面,而不是在每个需要它们的地方重复编写代码。在Spring中,注解使得AOP的使用更加简洁,避免了XML配置的繁琐。本篇文章将详细讲解五种主要的AOP通知注解...
在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...
这篇博客文章将探讨如何在Spring 2.0中使用AOP实例,特别是通过注解来实现。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了横切关注点,即那些跨越多个对象的行为或责任。在Spring中,切...
可以通过`<aop:aspectj-autoproxy>`元素来实现。 ```xml <aop:aspectj-autoproxy /> ``` 2. **定义切面(Aspect)**:切面是AOP的核心,它包含了通知和切入点表达式。在Java代码中,可以创建一个带有`@Aspect`注解...
在早期的Spring版本中,AOP主要通过XML配置来实现。开发者需要在`<aop:config>`标签内定义切面,包括切入点表达式(pointcut expression)和通知类型。虽然这种方式相对繁琐,但它提供了最大的灵活性,因为所有细节...
在本篇Spring学习笔记中,我们将深入探讨如何利用Spring配置文件来实现面向切面编程(AOP)。面向切面编程是Spring框架的核心特性之一,它允许我们把关注点分离,将横切关注点(如日志、事务管理、权限控制等)与...