spring自定义注解

Spring 实战-第四章-面向切面的Spring

冷暖自知 提交于 2020-01-21 11:19:23
软件开发中,散布于应用中多处的功能被称为横切关注点(cross-cutting concern),这些横切关注点从概念上是与应用的业务逻辑相 分离的(但是往往会直接嵌入到应用的业务逻辑中)。把这些横切关注点与业务逻辑相分离正式面向切面编程(AOP)所要解决的问题。 如果要重用通用功能,最常见的面向对象技术是继承(inheritance)或委托(delegation)。但是,如果在整个应用中都是用相同的基 类,继承往往会导致一个脆弱的对象体系;而是用委托可能需要对委托对象进行复杂的调用。 横切关注点可以被模块化为特殊的类,这些类被称为切面(aspect)。这样做有两个好处:首先,现在每个关注点都集中于一个地方, 而不是分散到多处代码中;其次,服务模块更简洁,因为它们只包含主要关注点(或核心功能)的代码,二次要关注点的代码被转移到切面中。 AOP术语 通知(Advice) 切面的工作被称为通知,通知定义了切面是什么以及何时使用。Spring切面可以应用5中类型的通知: 前置通知(Before):在目标方法被调用之前调用通知功能; 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么; 返回通知(After-returning):在目标方法成功执行之后调用通知; 异常通知(After-throwing):在目标方法抛出异常后调用通知; 环绕通知(Around)

spring boot验证框架

不羁岁月 提交于 2020-01-21 01:27:02
在平时开发中,前端一般都会做参数的正确化校验,但是单单前端做校验是不够保险的,所以后端也需要加上相关的参数校验,防止有人绕过前端直接调用接口。 而spring boot就提供有这样的验证框架,默认实现用的是Hibernate validator。我们只需要将@Validated注解标注在方法参数上,spring boot就可以对参数进行校验,同时把校验结果放在BindingResult对象里。 spring boot验证框架提供的一系列常用注解 @Null:验证对象是否为空 @NotNull:验证对象是否不为空 @NotEmpty:验证对象不为空,或者集合不为空 @NotBlank:验证字符串不为空,或者不是空字符串("“或者” ") @Size(min=,max=):验证对象的长度,字符串或集合都行 @Length:字符串的长度 @Max:验证数字是否小于等于指定的值 @Min:验证数字是否大于等于指定的值 @Digits:验证数字是否符合指定格式 @Range:验证数字是否在指定范围内 @Email:验证邮件格式是否正确,值为null的话,不做校验 @Pattern:验证String对象是否符合正则表达式 怎么使用spring boot验证框架 新建一个普通的spring boot+swagger2项目,有一个Employee员工对象来做测试,每个字段都加了一个常用校验注解:

面向切面的Spring

不羁的心 提交于 2020-01-20 21:52:28
我们知道如何使用依赖注入(DI)管理和配置我们的应用对象,DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与他们所影响的对象之间的解耦。切面能帮助我们模块化横切关注点,横切关注点可以被描述为影响应用多处的功能。 定义AOP术语,描述切面的术语有通知,切点和连接点。 通知定义了切面是什么以及切面何时开始使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它应该应用在某个方法被调用之前?之后?之前和之后都调用?还是只在方法抛出异常时调用? Spring切面可以应用5种类型的通知: 前置通知:在目标方法被调用之前调用通知功能; 后置通知:在目标方法完成之后调用通知功能; 返回通知:在目标方法成功执行之后调用通知功能; 异常通知:在目标方法抛出异常后调用的通知功能; 环绕通知:通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。 我们的应用可能有数千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点,这个点可以是调用方法时,抛出异常时,甚至修改一个字段时,切面代码可以利用这些点插入到应用正常的流程之中,并添加新的行为。 如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确的类和方法名称

SpringMVC应用:笔记

孤人 提交于 2020-01-20 18:15:59
1、SpringMVC实现RESTful风格:@PathVariable注解的使用。 2、SpringMVC返回字符串结果,并解决中文乱码问题。 3、Spring引入多个xml配置文件。 4、注解:@ Controller、@Service、@Repository、@Component的区别。 5、注解:@Autowired、@Resource、@Qualifier的区别和使用。 6、Spring MVC 转发和重定向。 1、SpringMVC实现RESTful风格:@PathVariable注解的使用 使用@PathVariable注解,在其中指定参数的key名称,并映射在后面定义的形参上。 @RequestMapping(value = "/getStaff/{id}",method = RequestMethod.GET) public StaffInfo getStaffInfo(@PathVariable("id") int staffId) { // 忽略其他代码... } 2、SpringMVC返回字符串结果,并解决中文乱码问题 /** * SpringMVC返回字符串结果,并解决中文乱码问题 */ @RequestMapping(value = "getUserName",produces = "text/text;charset=UTF-8")

Spring自定义校验

允我心安 提交于 2020-01-20 16:09:40
参考资料 JSR303、349 -Bean Validation 数据校验规范使用说明和验证流程源码分析 Spring 全局异常处理 注意事项 使用Java JSR303、349 Bean Validation 数据校验规范来做数据校验 参考资料: JSR303、349 -Bean Validation 数据校验规范使用说明和验证流程源码分析 利用好分组 减少校验的逻辑代码 分组的class 需要的是接口,我们可以专门定义一个包来存放 配置全局异常统一处理 ,这样可以对业务异常,以及校验异常等进行统一的处理,解放代码逻辑 带分组的Demo MobileValidator 校验类如下: import javax . validation . ConstraintValidator ; import javax . validation . ConstraintValidatorContext ; public class MobileValidator implements ConstraintValidator < Mobile , String > { @Override public boolean isValid ( String s , ConstraintValidatorContext constraintValidatorContext ) { System .

JavaWeb之Eclipse中使用Maven构建SpringMVC项目

谁都会走 提交于 2020-01-20 15:16:27
为了学习spring和maven我这也是拼了老命了,光使用maven配置springmvc我花了上周一周的时间,下班回来就搞,一直有bug,一个bug接着一个,昨天一整天都在解决配置的问题,让大学同学亲自出马,这里先谢谢蒙了,今天又专门跑去新天下,找之前公司的小伙伴来帮忙。我也是参考的网上的博客,不过根据参考的自己在配置过程中也出现了好多的坑。想着使用Maven配置springmvc主要是先大致的了解下maven和spring,然后再慢慢的深入的了解maven和spring。 1.Eclipse创建Maven Project 2.选择Archetype,这里是创建web的项目,所以选择的是webapp 3.输入GroupId,Artifact Id和Viesion,这样算是输入了坐标,方便以后查找。关于坐标是maven的概念,这个以后会经常用到。 4.选中项目点右键找到属性,在build path中可以看到有几个文件不存在,可以按照缺失的增加上。 5.配置仓库 上面创建完成之后引入spring开始就bug一个接着一个,我现在pom.xml中配置了spring的几个部分,但是发现下面的错误,问了下同学告诉我说的仓库的问题,访问不了。建议使用阿里的国内的,于是我就重新设置了下仓库。需要在maven的安装目录下的conf/下的settings.xml中设置。

Spring Boot入门介绍

旧巷老猫 提交于 2020-01-19 23:23:30
SpringBoot介绍 1.什么是SpringBoot? SpringBoot就是为了解决Spring缺点而生的,主要是简化了使用 Spring 的难度,节省了繁重的配置,开发者能够快速上手。 SpringBoot的核心功能有两个,起步依赖,自动配置,也就是他的默认配置; 起步依赖就是将具备某种功能的坐标打包到一起, 并解决了Spring的jar包冲突问题。 自动配置就是SpringBoot在底层给我们自动做了一些配置,所以springboot项目不编写配置文件也可以正常运行,但是根据我们的具体开发需要修改SpringBoot自动配置的默认值; 2.Spring Boot 优点非常多,如: 独立运行,使用java -jar xx.jar即可运行. 简化配置 自动配置 无代码生成和XML配置,通过注解来实现 内嵌服务容器. 3.SpringBoot的核心功能 核心功能: 1.1: springboot项目为独立运行的spring项目,使用java -jar xx.jar即可运行. 1.2: 内嵌servlet容器(可以选择内嵌: tomcat ,jetty等服务器.). 1.3: 提供了starter的pom 配置 简化了 maven的配置. 1.4: 自动配置spring容器中的bean.当不满足实际开发场景,可自定义bean的自动化配置. 1.5: 准生产的应用监控(基于:

Spring面试专题之aop

[亡魂溺海] 提交于 2020-01-19 20:37:00
1.背景 aop是编程中非常非常重要的一种思想,在spring项目中用的场景也非常广 2.面试问题 2.1.简单的面试问题 1、什么是aop,aop的作用是什么? 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。 Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上允许用户实现自定义切面,用AOP来完善OOP的使用可以把Spring AOP看作是对Spring的一种增强。 2、AOP里面重要的几个名词概念解释: 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。 连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang

Spring标准event和自定义event

廉价感情. 提交于 2020-01-19 02:25:07
Spring的事件同样是基于观察者模式,只要是观察者模式,就含有主题,主题,针对该主题的事件(事件),向主题发布事件的人(发布者),订阅主题并接收事件的人(订阅者)。 在Spring中,一般是这样玩的: 如果一个类扩展了ApplicationEvent则它是一个针对某某主题的事件,该类中的source可以当作这个主题 如果一个类实现了ApplicationListener接口,并将其注册为一个bean,它是一个订阅者 如果一个类实现了ApplicationEventPublisherAware然后注册为bean,并调用了publishEvent,它是一个发布 从Spring4.2起,这个机制也被优化为只要在一个对象上增加事件注解,就可以使用事件机制,因为在这个对象被发布时,spring会将其包装成一个事件。 你可以自定义event,玩法如下: 这是一个针对主题source的事件 public class BlackListEvent extends ApplicationEvent { private final String address; private final String content; public BlackListEvent(Object source, String address, String content) { super(source); this

spring+策略模式

懵懂的女人 提交于 2020-01-19 00:14:56
需求: 这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。 1. 常规代码实现 1.1 实体类 import lombok.Data; import java.math.BigDecimal; @Data public class OrderDTO { private String code; private BigDecimal price; /** * 订单类型 * 1: 普通订单 * 2: 团购订单 * 3: 促销订单 */ private String type; } 1.2 接口类 import qinfeng.zheng.strategy.dto.OrderDTO; public interface IOrderService { /** * 根据订单类型做出相应的处理 * * @param orderDTO * @return */ String handle(OrderDTO orderDTO); } 1.3 接口实现 import org.springframework.stereotype.Service; import qinfeng.zheng.strategy.dto.OrderDTO; import qinfeng.zheng.strategy.service.IOrderService;