spring自定义注解

使用Spring MVC HandlerExceptionResolver处理异常

那年仲夏 提交于 2020-02-27 07:55:30
Spring MVC的确很强大,在每一个你想的到和想不到的地方都会留下钩子,来插入自定义的实现,透明替换默认实现, 拦截器堆栈结构设计的非常强大,多种试图的解析,url mapping的多种实现,Locale resolver、Theme resolver 、multipart file resolver,Excepiton hanlder Resolver等等,能让Spring MVC从1.0到3.0经历巨大变化, 仍能向后兼容,并支持很酷的RESTful风格和强大的简化xml配置的注解。 这些功能我们在项目中经常用到,但是Excepiton hanlder Resolver可能是个生僻一点的东东,因为我们通常对错误 的处理通常不是非常的复杂,很多情况下只是根据异常或者http error code跳转到错误页面,这个是JSP/servlet就可 以搞定,在web.xml配置一下即可。 今天遇到一个事情,让我想用到HandlerExceptionResolver这个东东来处理异常。今天准备把自助系统进入上线状态, 所以把log的级别从DEBUG调到INFO,结果没有catch的Runtime异常在log记录,后来跟踪了一下原来Spring把异常处理的log, 直接使用的是debug,而不是error,所以log级别设置为INFO导致异常没有记录,看了一下spring的源代码: /

Spring的事件机制详解

蹲街弑〆低调 提交于 2020-02-26 05:12:21
同步事件和异步事件   同步事件:在一个线程里,按顺序执行业务,做完一件事再去做下一件事. 异步事件:在一个线程里,做一个事的同事,可以另起一个新的线程执行另一件事,这样两件事可以同时执行.   用一个例子来解释同步事件和异步事件的使用场景,有时候一段完整的代码逻辑,可能分为几部分,拿最常见的注册来说,假设完整流程是,1.点击注册->2.检验信息并存库->3.发送邮件通知->4.返回给用户.代码这么写是正确,但不是最好的,缺点如下:  1.逻辑复杂,业务耦合,我们把校验数据并存库和发送邮件写到一个大的业务方法里了,发邮件我们可以看做一个相对独立的业务方法     2.效率低,假设2和3分别需要1秒的时候,那么用户在点击注册2秒后才能看到相应   同步事件可以解决上面第一个问题,我们把发邮件的方法独立出来,放到事件里执行,这样注册的这个方法就可以只做2操作,完成之后发布一个事件去执行3,可以很好的解决业务耦合的问题.   异步事件可以完美解决以上两个问题,注册方法执行2操作,执行之后发布一个异步事件,另起一个线程执行3操作,注册方法所在的线程可直接返回给用户,这样不仅实现了业务解耦还提高了效率,用户点击注册,1秒后就能看到响应. Spring的事件机制   spring事件发送监听涉及3个部分   ApplicationEvent:表示事件本身,自定义事件需要继承该类

spring retry, guava retrying 的整合-sisyphus java 重试

风流意气都作罢 提交于 2020-02-26 05:01:17
Sisyphus 支持过程式编程和注解编程的 java 重试框架。 特性 支持 fluent 过程式编程 基于字节码的代理重试 基于注解的重试,允许自定义注解 无缝接入 spring 接口与注解的统一 解决 spring-retry 与 guava-retrying 中的不足之处 设计目的 综合了 spring-retry 和 gauva-retrying 的优势。 调整一些特性,使其更利于实际使用。 采用 Netty 类似的接口思想,保证接口的一致性,和替换的灵活性。 借鉴 Hibernate-Validator 的设计,允许用户自定义注解。 spring-retry 与 guava-retrying 中的不足之处 更新记录 更新记录 开源地址 sisyphus 快速开始 引入 <plugin> <groupId>com.github.houbb</groupId> <artifactId>sisyphus-core</artifactId> <version>0.0.6</version> </plugin> 入门代码 详情参见 [RetryerTest]() public void helloTest() { Retryer.<String>newInstance() .retry(new Callable<String>() { @Override public

Spring事务管理之几种方式实现事务(转)

我怕爱的太早我们不能终老 提交于 2020-02-25 00:30:35
转自 一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销。Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下Spring事务。 事务具备ACID四种特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。 (1)原子性(Atomicity)     事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。   (2)一致性(Consistency)     事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。   (3)隔离性(Isolation)     指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态

自定义注解实现(spring aop)

拟墨画扇 提交于 2020-02-24 12:58:37
1.基本概念 1.1 aop 即面向切面编程,优点是耦合性低,能使业务处理和切面处理分开开发,扩展和修改方面,当引入了注解方式时,使用起来更加方便。 1.2 应用场景 打日志、分析代码执行时间、权限控制、事务处理、访问频率控制、异常处理等等。 1.3 主要概念 几乎所有涉及aop的地方都会对这些概念进行说明,这里只说说个人的理解,可先了解一下基本概念,然后看完例子之后回头结合这些概念,才能更深刻的理解。 Aspect:关注点的模块化。类似于类声明,包含PointCut和对应的Advice。在Spring AOP中被定义为接口@Aspect,作用于TYPE(类、接口、方法、enum) JoinPoint:程序执行过程中明确的点,如方法的调用或特定的异常被抛出。常用的是getArgs()用来获取参数,getTarget()获得目标对象。 Pointcut:表示一组JoinPoint,这些JoinPoint或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。 在Spring AOP中被定义为作用于METHOD上的接口@Pointcut Introduction:添加方法或字段到被通知的类。 Advice: 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around

Spring Boot自动化配置原理

时间秒杀一切 提交于 2020-02-24 12:40:28
Spring Boot自动化配置原理依赖于 @Conditional 注解来实现: @Conditional是Spring4提供的一个新特性用于根据条件来控制Bean的创建行为。 我们从大家熟知的Spring Boot 的启动类开始 @SpringBootApplication public class DemoApplication { public static void main ( String [ ] args ) { SpringApplication . run ( DemoApplication . class , args ) ; } } @SpringBootApplication 注释,我们可以先从它开始分析,查看源码后可以发现它是一个包含许多注解的组合注解。 @Target ( { ElementType . TYPE } ) @Retention ( RetentionPolicy . RUNTIME ) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan ( excludeFilters = { @Filter ( type = FilterType . CUSTOM , classes = { TypeExcludeFilter

Spring Boot 中的切面编程,实例场景讲解(日志打印)

十年热恋 提交于 2020-02-23 01:30:00
文章目录 1.什么是切面编程AOP 2.Spring Boot 集成AOP 2.1添加maven依赖 2.2 切面编程 (实现日志打印实例) 2.2.1 创建切面类LogAspectHandler.java 2.2.2 @Pointcut:切点 2.2.3 @Before:前置建言 2.2.4 @After:后置建言 2.2.5 @AfterReturning 2.2.6 @AfterThrowing 2.2.7 @Around:环绕 3.有什么应用场景 4.总结 1.什么是切面编程AOP 官方解释: AOP 通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。可以在代码阶段实现分离关注,实现松耦合,然后在运行时将相关动作特征植入运行,从而改变程序的运行顺序,达到拦截或者增加功能的目的。 好吧,我承认,读起来很拗口,而且估计你读完一遍再读一遍,也不能理解是什么意思。 下面我提出一种场景,看看你会怎么实现,用此例子来理解切面编程。 有A,B, C三个方法,但是在调用每一个方法之前,要求打印一个日志:某一个方法被开始调用了!在调用每个方法之后,也要求打印日志:某个方法被调用完了!统计一下每个方法执行的耗时。 一般人会在每一个方法的开始和结尾部分都会添加一句日志打印吧,这样做如果方法多了,就会有很多重复的代码,显得很麻烦,这时候有人会想到

借鉴 spring 面试内容

风流意气都作罢 提交于 2020-02-21 16:40:29
1. Spring的IOC有三种注入方式 : 第一是根据属性注入,也叫set方法注入; 第二种是根据构造方法进行注入; 第三种是根据注解进行注入 Spring的优点 :主要是根据它的IOC和AOP体现的。IOC主要是解决了代码的耦合性问题,而AOP是面向切面编程的最好解释! 2.Spring中IOC, AOP IOC就是控制翻转或是依赖注入。通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过Spring的bean工厂为你长生这样一个对象。 AOP就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类, 那你每一类中都要写关于日志的方法。但是如果你用AOP,那么你可以写一个方法,在这个方法中有关于数据库操作的方法, 3.Spring的IOC/AOP/代理 IOC是控制反转,是Spring的核心思想。通过面向接口编程来实现对业务组件的动态依赖。 aop是面向切面编程,它并不是只在Spring或者java中才有的,它和面向对象编程(oop)是相对而言的另一种编程思想。 Spring在实现AOP编程时利用的是java的代理机制。个人觉得java代理机制真的是很神奇。核心内容并不多 4.Spring的IOC是解耦,AOP是干什么的 AOP面向切面编程将程序中的交叉业务逻辑(比如安全,日志,事务等)

Spring5学习(kuang)

*爱你&永不变心* 提交于 2020-02-20 13:37:56
Spring 一、Spring 1.1 简介 Spring:春天 2002年,首次推出了Spring框架的雏形:interface21框架 Spring框架以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版本 Rod Johnson ,Spring Framework创始人 Spring理念:使现有的技术更加容易使用 官网:https://spring.io/projects/spring-framework <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.3.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring

深入理解spring注解之@ComponentScan注解

旧街凉风 提交于 2020-02-17 19:12:16
今天主要从以下几个方面来介绍一下@ComponentScan注解: @ComponentScan注解是什么 @ComponentScan注解的详细使用 1,@ComponentScan注解是什么 其实很简单,@ComponentScan主要就是定义 扫描的路径 从中找出标识了 需要装配 的类自动装配到spring的bean容器中 2,@ComponentScan注解的详细使用 做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个 共同的注解@Component ,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中,好下面咱们就先来简单演示一下这个例子 在包com.zhang.controller下新建一个UserController带@Controller注解如下: package com.zhang.controller;import org.springframework.stereotype.Controller;@Controllerpublic class UserController {} 在包com.zhang.service下新建一个UserService带