2KB项目,专业的源码交易网站 帮助 收藏 每日签到

用 Spring 完成 AOP

  • 时间:2019-06-12 14:02 编辑:2KB 来源:2KB.COM 阅读:506
  • 扫一扫,手机访问
  • 分享
摘要:
Spring AOP 英文原文:Implementing AOP in Spring

不断以来,面向方面的编程(AOP)都是Spring框架中一个最根本的构成部分。因为这类编程模子将一些底层构造表露给了Spring开发者,所以它已经显得有点庞杂。可能就是由于这个缘由,Spring中的AOP编程只把握在初级开发者手中。比来发作了非常多变更 —— Spring曾经改良了非常多,AOP异样也失掉了改良。我将在本文中籍由对AOP的一个威望性说明,睁开解说怎么在Spring中完成AOP编程。所以,在我们真正上手之前,先来个小插曲。

函数式编程

在函数式编程(FP)的状况下,一切问题都要分化为由函数构成的模块,每一个模块完成一组特定的Task。每一个函数经过函数挪用同其它函数打交道。整体的观点就是经过运用内聚性的函数模块对问题域(problem domain)实行分化。

如今让我们想象一下由函数挪用构成的庞杂的网状构造的情况。你失掉的是象一碗意大利面条一样凌乱的代码!

spaghetti code

意大利面条式的代码

面向工具的编程

在面向工具的编程(OOP)中,设计使用程序的思想进程失掉了一种范型(paradigm)上的改变。分歧的Task不再是模子化为一组函数,而是转化为一个共同的工具,每一个工具反应的是问题空间中一个分歧的实体。

因而,设计庞杂的代码变成为了一个愈加明晰地别离存眷点的进程。可是,依旧另有。。。

Table


一些问题仍然存在。
  • 有如许的状况呈现:不是一切的Task都可以归类为一个工具,或者完成如许的工具其实不依靠于营业存眷点自身。
  • 假定有点或一切的工具都运用了统一个进程(procedure),比方将一条音讯记入日记的进程。如今要完成它,需求要末在每一个工具中定义一个成员函数logMessage,要末定义一个独自的类并将 logMessage定义为其或静态或非静态的成员函数,只要如许才干让程序员经过或者承继或者创立一个新的Logger工具,或者只是挪用其静态成员函数或者经过运用Spring的依靠注入(dependency injection)功用,运用该功用。

不管在那种状况下,以上文描绘的方法实行设计都不是个特殊好的主见。要留意的是,在上面说起的状况中最经常使用的工具实践上倒是最不主要的工具。Logger工具并没有增加任何额定的营业功用。它只是对完成营业功用的进程供给了一种支撑,而在工具交互中它取得的倒是最大量的留意力。OOP还不错,但仍需求寻觅别的一个条理的模块化思绪,以处理对互相穿插的存眷点实行更洁净的别离问题。

面向方面的编程

AOP奇妙地将OOP范型中的模块化推向了一个全新的程度。经过引入了一个新的称之为“方面”的模块化单位,AOP供给了一种对互相穿插的存眷点实行别离的新思绪。“方面”侧重于某个特定的穿插功用,为使用程序中的中心营业类免除了穿插性存眷点方面的担负。这一切都是经过方面编织器(aspect weaver)完成的,方面编织器经过一个称为编织(weave)的进程,将中心类同穿插性的“方面”组合为终极的系统。AOP进一步改造了OOP,从而让程序的设计、完成和保护变得愈加容易。

Spring框架中的AOP

Spring的中心包含依靠注入(dependency injection)、企业级服务笼统(enterprise service abstraction)和面向方面的编程。依靠注入可以把本有关联的很多部件以一种声明式的方法衔接成为一个具有完好功用的使用程序,企业级服务笼统用来留心定稳定的使用逻辑同易变的根底设备代码隔分开来,而AOP可让你将穿插性存眷点的完成细节同营业存眷点离开实行处置。Spring中的这三件套可以完满地整合到一同,为你供给一个极具竞争力的处理计划。

在Spring中完成AOP

所需软件:

Aspectj编程需求

  • Aspectj: Aspectj编译器可认为恣意版本的Java平台生成代码,但该编译器自身需求Java2 (1.4或更新) 才干运转。
  • Cglib: 代码生成库,用于在运转态(at run time)下扩大Java类和完成接口。
  • Aopalliance : Guice和Spring等很多框架都会用到的一组接口。
  • asm: 万能型Java字节码把持和剖析框架,用于直接以二进制格局修正已有的类或静态发生类

Spring框架需求

  • Spring:  Java平台上的开源使用框架和把持反转(Inversion of Control)容器。
  • Common-logging: 用于记载日记信息的库

Java SEEclipse(注:任何其它的IDE都可以但本文运用的是Eclipse)

为AOP设置装备摆设你的Project

起首安装Java SE和Eclipse。运用以下jar文件在Eclipse中创立用户库并包括以下所列的库。

创立aspectj用户库并导入以下jar文件

1.    aopalliance-x.x.x.jar

2.    cglib-nodep-x.x.x.jar

3.    aspectjrt.jar, aspectjweaver.jar (可能需求解压aspectj-x.x.x.jar才干失掉这两个文件)

4.    asm-x.x.jar

创立Spring用户库并包括以下jar文件

1.    commons-logging-x.x.x.jar

2.    spring-framework-x.x.x/dist中一切的jar文件

在Eclipse中完成以上创立用户库的任务后,你就能够将该库反复运用于任何你盼望具有aspectj特征的项目中。

注:在Eclipse中可以经过点击菜单Windows->Preference,然后睁开preference窗口左边的列表到Java->Build Path->User Libraries实行用户库的创立。

例子

该例子中包括四个类:EmployeeDepartment是数据模子类(model class),Main是使用程序的进口,LoggingAspect是“方面”类。

package org.***aop.model;
public class Employee {
       private String name;
       ...
       //Getters and Setters
}
 
package org.***aop.model;
public class Department {
       private String location;
       ...
       //Getters and Setters
}

Main类中展现了Spring中的依靠注入功用。

package org.***aop.app;
//...import statements
public class Main {
       public static void main(String[] args) {
             ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
             
             Employee emp = context.getBean("employee", Employee.class);
             emp.setName("Jerry Mouse");
             
             Department dept = context.getBean("department", Department.class);
             dept.setLocation("Disney Land");
             
             System.out.println("Name :"+emp.getName());
             System.out.println("Department :"+dept.getLocation());
       }
 
}

设置装备摆设文件spring.xml展现的是依靠注入和AOP的设置装备摆设细节。

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
       
       <aop:aspectj-autoproxy />
       <bean name="employee" class="org.***aop.model.Employee"/>
       <bean name="department" class="org.***aop.model.Department"/>
       <bean name="loggingAspect" class="org.***aop.aspect.LoggingAspect" />
 
</beans>


LogginAspect类展现了Spring中的AOP完成办法。请留意,它只是一个annotation为@Aspect的容易POJO。 在该类中可以编写恣意多的建议(英文为advice,建议是一个AOP术语,指的就是一个带有AOP annotation前缀的函数),可使用的annotation包含有@Before、@After、@Within、@Around、@Pointcut等。

package org.***aop.aspect;
//..import statements
 
@Aspect
public class LoggingAspect {
       
       @Before("execution(public String getName())")
       public void beforeAdvice(){
             System.out.println("Before advice. Runs before the function called");
       }
       //...other advices
}


@Before意思就是,名为beforeAdvice的这个建议会在每次对public String getName()这个 函数的挪用之前失掉履行。@Before另有其它一些变更,比方:

@Before("execution(public
String org.***aop.Employee.getName())")

分歧的地方在于,所指定的建议仅会在对Employee类的getName函数挪用之前失掉履行。

此中还可使用通配符:

@Before("execution(public * get*())") 

表现的是对具有恣意前往类型而且没有参数但函数名字的前缀为“get”的public函实行的挪用。

@Before("execution(public * get*(..))") 

表现的是对具有恣意前往类型而且具有零个或多个参数但函数名字的前缀为“get”的public函实行的挪用。

@Before("execution(public * get*(*))") 

表现的是对具有恣意前往类型而且具有一个或多个参数但函数名字的前缀为“get”的public函实行的挪用。

需求更多的例子息争释请拜见Spring中关于某些方面编程的文档

AOP的用法

有点状况下AOP会十分好用,最多见的用例中可能会有记载日记和功能剖析。

  • 在事务管理中AOP可以大有效武之地,可以将恳求处置办法用@Around建议封装起来,从而可以在呈现问题的时立刻将事务回滚(roll back)。
  • 可使用@Before建议树立起一种拜访权限把持或者平安机制,在让用户进入时对其拜访凭证( access credential)实行验证。
  • 当营业办法要抛出异常时可以对异常实行封装。@After抛出异常建议可以用于处置这类状况。例如,当你想要将一切的SQLException封装为数据拜访层异常,其实不想在每一个DAO办法中对它们实行处置,只是将它们抛回服务层时,就能够这么做。

AOP象如许的用法多不堪数。这里罗列的几项仅仅是走马观花罢了。

本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
上一篇:Docker 公司已死
下一篇:奇虎360 和 go
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部