@EnableGlobalMethodSecurity
spring security默认是关闭注解的,要开启spring security注解,需要在继承WebSecurityConfigAdapter的类上加上此注解,它有以下三个参数:
- securedEnabled = true:表示开启@Secured注解过滤权限
- jsr250Enabled = true:表示开启@RolesAllowed注解过滤权限
- prePostEnabled = true:表示四个方法级的安全注解可用
- @PreAuthorize:在方法调用之前,基于表达式的计算结果来限制对方法的访问,自定义权限表达式的类使可用@注解的方式
- @PostAuthorize:允许方法调用,但是如果按照表达式计算结果为false,将抛出一个安全异常
- @PostFilter:允许方法调用,但必须按照表达式来过滤方法的结果
- @PreFilter:允许方法调用,但是必须在进入该方法之前过滤输入值
List集合
List接口继承了Collection接口,list集合中允许出现重复的元素,并且是线性存储,能够依据索引实现对元素的访问。list接口的两种典型实现是:
- ArrayList:底层是数组,特点是查询元素很快,但是增加删除很慢
- LinkedList:底层是链表,特点是增加删除元素很快,但是查询元素很慢
list集合的stream操作
通过将list结合转换为一种叫做stream的元素序列,通过声明性方式,能够对集合中的每个元素实现一系列并行或串行的流水线操作
- stream()或parallelStream()方法,能够将集合转换为流或者并行流,并行流能够实现对集合元素的并行操作
- collect(toList)方法可以将流转换为集合
- map(T -> R)将流中每一个元素T映射成R,类似类型转换
- flatMap(T -> Stream(R)):将流中的每一个元素T映射成一个流,再把每一个流连接成另外一个流,如flatMap(Arrays::stream)首先Arrays::stream()将string[ ] 元素变成string流,然后flatMap将其连成一个新流
java lambda表达式
Lambda允许把函数作为一个方法的参数传递进方法中,语法:(接收的参数) -> 函数的返回值
注意:表达式内使用外部变量时需要变量是final或者等效final的,等效final是变量在初始化后,未被再重新赋值
Object类
所有的类都默认继承自Object类,包括数组集合等
java newInstance()方法
Class类的newInstance()方法是调用该类的无惨构造方法创建对象,如果该类没有对应的无参构造方法,将抛出异常
new 和newInstance()方法的区别
- new是关键字,而后者是方法,并且后者只能调用无参构造方法
- 后者使用的类加载机制创建对象,因此使用其之前必须保证这个类已经被加载,而new不需要提前加载类
为何会有这两种创建对象的方法,主要是考虑到软件的可伸缩,可扩展,可重用等软件设计思想,如设计模式工厂模式中经常使用newInstance方法解耦合
@PathVariable注解
带占位符的url是spring3.0新增的功能,该功能在springMVC向REST目标挺进发展过程中具有里程碑意义。通过此注解可以将url中占位符参数绑定到控制器处理方法的参数中
REST:Representational State Transfer,即表现层状态转换,是目前最流行的一种互联网软件架构。
- 表现层:把资源呈现出来的形式叫做表现层,如json数据,xml数据等
- 状态转换:http协议是一个无状态的协议,即所有的状态都保存在服务器端。如果客户端想要操纵服务器,就必须通过某种手段让服务器实现状态转换,这种状态转换是建立在表现层之上的。具体来说,就是http协议里面的四个方法,get,post,put,delete
Swagger
- 将项目中所有的接口展现在页面上,这样后端程序员就不需要为前端人员编写专门的接口文档
- 当接口更新之后,只需要修改代码中的swagger描述就可以实时生成新的接口文档
- 通过swagger页面,可以直接对接口调用,降低了项目开发阶段的调试成本
java注解
注解是一种被添加到java代码中的元数据,类,方法,变量,参数和包都可以用注解来修饰注解对于它所修饰的代码并没有直接的影响,注解可以有属性值,也可以没有属性值
注解作用范围
- 源码(source)期间有效,如将当前的源代码生成帮助文档时
- 编译(class)期间有效,如@override,@deprecated,@suppresswarning注解
- 运行(runtime)期间有效,
自定义注解需要用@Rentention声明注解作用范围,用@Target声明注解作用的对象是方法,类还是其他
dependencyManagement标签与dependencies标签
前者标签之内声明的依赖仅仅是一个声明,并不会引入到项目中,而后者标签之内的声明的依赖可以直接引用到项目中。这两个标签常用于聚合工程中,父工程中声明依赖,子工程中直接引入依赖,并且不用写版本号,会自动使用父工程中的版本号