切面

Spring进行面向切面编程的一个简单例子

夙愿已清 提交于 2019-11-29 22:47:33
一、eclipse新建java项目取名SpringTest 二、导入sping包到构建路径 还需要aspectjweaver.jar 三、创建java类(当然先要创建各种包) IHelloService.java package com.zjptcc.wxw.spring.hello; public interface IHelloService { public void sayHello(); public void sayChinaHello(); } HelloServiceImpl.java package com.zjptcc.wxw.spring.hello; public class HelloServiceImpl implements IHelloService { private String Hello; private String ChinaHello; @Override public void sayHello() { // TODO 自动生成的方法存根 System.out.println(Hello); } @Override public void sayChinaHello() { // TODO 自动生成的方法存根 System.out.println(ChinaHello); } public String getHello() {

理解Spring的两大特征:IOC与AOP

本秂侑毒 提交于 2019-11-29 19:32:07
Spring的核心特性就是IOC和AOP。 IOC (Inversion of Control),即“控制反转”; AOP (Aspect-OrientedProgramming),即“面向切面编程”。(参考书《Spring In Action》) IOC:IOC,另外一种说法叫DI(Dependency Injection),即依赖注入。它并不是一种技术实现,而是一种设计思想。在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等等)。 举例: 某一天,你生病了,但是你不清楚自己到底得了什么病,你只知道自己头疼,咳嗽,全身无力。这个时候你决定去药店买药,药店有很多种药,仅仅是治疗头疼就有好几十种,还有西药中药等区别。然后你自己看了看说明书,选择了一盒你自己觉得最能治疗自己病症的药,付钱吃药,期待可以早点好起来。 但是这个过程

SpringBoot登录登出切面开发

倾然丶 夕夏残阳落幕 提交于 2019-11-29 10:51:13
阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本。 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验,即用户输入登录信息,系统对其进行判断,如果信息准确放行并下发一个token值到用户的cookie中,接下来用户的每一个操作(对系统的读写操作等),后台系统都会验证token的准确性还有存在性,以此确定用户的登录信息正常,登出时就清除token,如下图所示。 那么可能意味着,我们对每一个Controller层的方法都需要加一个token验证的代码段,这是非常浪费时间的流程。 那么SpringBoot中就有非常方便我们处理这个同意验证的方式,我们可以通过切面Aspect,通过定义切面类,并使用Poincut指定切入点,比如某字段开头的全部Controller类的方法,并在Before之前进行验证,我们就进行写一个验证说实现,即查询Cookie中是否存在token字段,token字段与下发的原始token是否相同,进行验证,如果不对,就抛出自定义的验证异常如AuthorizeException类(其继承RuntimeException),然后在定义了一个捕获异常的handler,对验证异常的返回做统一的数据返回格式。 如下流程图所示。 还有一点,我们下发的token是要存放在哪里呢

Spring学习的第三天

限于喜欢 提交于 2019-11-29 08:26:16
问题分析 :在刚开始进行银行转账案例时,会获取四个连接,分别是查询接入、转出账户、更新转入、转出账户。这样会使转账不同步,如果某一处出现异常,前面的代码执行了,而后面的更新却没执行,导致一个账户加钱而另一个账户却没有减钱。 解决方法 :将其整个过程只弄成一个连接,需要使用ThreadLocal对象把Connection和当前线程绑定,从而使一个线程中只有一个能控制事务的对象。 事务的控制应该是在业务层,需要用到两个工具类,关于线程绑定连接的和事务管理的,用起来非常麻烦。需要用到动态代理技术,将事务管理的方法进行增强,使得被代理对象的任何方法都会经过该方法。    第三天学习的主题:    AOP面向切面编程   定义: 通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP为OOP的延续,是函数式编程的一种衍生泛型。   简单来说就是把程序的重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对已有方法进行增强。    AOP的作用 :在程序的运行期间,不修改源码对已有方法进行增强。    优势 :减少重复代码,提高开发效率,维护方便。    AOP的实现方式 :使用动态代理的技术。   *Spring中的AOP[重点]   说明:学习Spring的AOP,就是通过配置的方式,实现动态代理。   相关术语: JoinPoint(连接点)

发锁事务重试机制(JPA高并发下的乐观锁异常)

此生再无相见时 提交于 2019-11-29 06:37:35
乐观锁: model实体类加version字段 @JsonProperty("_version") @Column(name = "version", nullable = false) @Version private Long version = 0L; 问题场景 先在库里查询出该实体,转化为持久态,在这时库里的该数据被修改了,并且version发生变更,此时持久态实体进行save操作,会触发乐观锁异常。 1:解决方案 定义Aspectj拦截器,指定方法发生乐观锁异常时,进行重试。 2:show coding. (1) 因为不是所有方法发生乐观锁异常都是需要重试机制的,所以需要先定义切面接口定义IsTryAgain /** * 自定义尝试切面接口 */ @Retention(RetentionPolicy.RUNTIME) public @interface IsTryAgain { // marker annotation } (2)Service接口方法加上切面接口定义 /** * 并发乐观锁需要重试的方法 */ @IsTryAgain boolean TryAgainMethod() throws Exception; (3)定义Aspectj切面拦截器 定义重试切面方法,是为了发生乐观锁异常时在一个全新的事务里提交上一次的操作,直到达到重试上限;因此切面实现 org

框架 | Spring面试题总结

隐身守侯 提交于 2019-11-29 05:37:01
1、什么是Spring? Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性。Spring框架的目标是使得Java EE应用程序的开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格。 2、Spring有哪些优点? 轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。 控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。 面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。 容器:Spring包含并管理应用程序对象的配置及生命周期。 MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。 事务管理:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。 异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常。 3、Spring 事务实现方式 编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。声明式事务管理

Spring AOP的理解和使用

北城以北 提交于 2019-11-29 03:15:53
AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。 掌握AOP的实现技术   Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。 AOP编程思想及术语   AOP是面向切面的编程,其编程思想是把散布于不同业务但功能相同的代码从业务逻辑中抽取出来,封装成独立的模块,这些独立的模块被称为切面,切面的具体功能方法被称为关注点。在业务逻辑执行过程中,AOP会把分离出来的切面和关注点动态切入到业务流程中,这样做的好处是提高了功能代码的重用性和可维护性。   Spring框架提供了@AspectJ 注解方法和基于XML架构的方法来实现AOP。前面的案例是基于XML架构的方法,后面一节会讲述基于@AspectJ 注解的方法。下面结合前面的案例讲述一下AOP的相关术语。   ● Aspect   表示切面。切入业务流程的一个独立模块。例如,前面案例的VerifyUser类,一个应用程序可以拥有任意数量的切面。   ● Join point   表示连接点。也就是业务流程在运行过程中需要插入切面的具体位置。例如

简单理解AOP(面向切面编程)

懵懂的女人 提交于 2019-11-29 01:27:08
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期 动态代理 实现程序功能的统一维护的一种技术。   AOP与OOP是面向不同领域的两种设计思想。   OOP(面向对象编程)针对业务处理过程的 实体 及其 属性 和 行为 进行 抽象封装 ,以获得更加清晰高效的逻辑单元划分。   AOP则是针对业务处理过程中的 切面 进行提取,它所面对的是处理过程中的某个 步骤 或 阶段 ,以获得逻辑过程中各部分之间低耦合性的 隔离效果 。   我们可以单单从上面的字面上来理解AOP和OOP的话,用下面的理解也不为过:   OOP实际上是对对象的属性和行为的封装,而AOP对于这点就无从谈起,但是AOP是处理某个步骤和阶段的,从中进行切面的提取,也就是说,如果几个或更多个逻辑过程中,有重复的操作行为,AOP就可以提取出来,运用动态代理,实现程序功能的统一维护,这么说来可能太含蓄,如果说到权限判断,日志记录等,可能就明白了。如果我们单纯使用OOP,那么权限判断怎么办?在每个操作前都加入权限判断?日志记录怎么办?在每个方法里的开始、结束、异常的地方手动添加日志?所有,如果使用AOP就可以借助代理完成这些重复的操作,就能够在逻辑过程中,降低各部分之间的耦合了。二者扬长补短,互相结合最好。   下面详细了解一些AOP的概念: 方面(Aspect)

Spring入门(十一):Spring AOP使用进阶

半腔热情 提交于 2019-11-28 19:27:27
在上篇博客中,我们了解了什么是AOP以及在Spring中如何使用AOP,本篇博客继续深入讲解下AOP的高级用法。 1. 声明带参数的切点 假设我们有一个接口CompactDisc和它的实现类BlankDisc: package chapter04.soundsystem; /** * 光盘 */ public interface CompactDisc { void play(); void play(int songNumber); } package chapter04.soundsystem; import java.util.List; /** * 空白光盘 */ public class BlankDisc implements CompactDisc { /** * 唱片名称 */ private String title; /** * 艺术家 */ private String artist; /** * 唱片包含的歌曲集合 */ private List<String> songs; public BlankDisc(String title, String artist, List<String> songs) { this.title = title; this.artist = artist; this.songs = songs; } @Override

spring面试合集

人盡茶涼 提交于 2019-11-28 18:13:22
Spring是一个开源的轻量级Java SE / Java EE开发应用框架。在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚 Spring框架可以帮我们管理对象及其依赖关系,另外还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,以及管理数据库事务,除了本身提供了一套简单的JDBC访问实现,还提供与第三方数据访问框架集成,与各种Java EE技术整合(如Java Mail、任务调度等),提供一套自己的web层框架Spring MVC。可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。 spring的aop的实现方式 AOP的实现是代理模式 动态代理的实现方式和区别 jdk动态代理和使用cglib产生代理。 一般jdk动态代理用于目标类都是基于统一的接口,cglib多用于对类的代理,这些类不需要实现统一的接口。 spring源码+原理 说到spring原理,我们就一定要提到spring的整体架构,也就是它的主要模块。 spring中创建bean的底层原理流程 1、 ResourceLoader 从存储介质中加载Spring配置信息,并使用