Spring-概述
Spring概述
Spring Framework Reference Documentation(4.1.3.RELEASE 完全中文翻译)
http://itmyhome.com/spring/index.html
Spring官方API文档
https://docs.spring.io/spring-framework/docs/current/javadoc-api/overview-tree.html
Spring 源码阅读
xuchengsheng / spring-reading
https://github.com/xuchengsheng/spring-reading
Spring Security 默认的过滤器链
1、WebAsyncManagerIntegrationFilter :Web异步管理集成过滤器, 使得异步线程可以从SecurityContextHolder中获取上下文信息
2、SecurityContextPersistenceFilter:两个主要职责:请求来临时,创建SecurityContext安全上下文信息,请求结束时清空SecurityContextHolder。
3、HeaderWriterFilter:(文档中并未介绍,非核心过滤器) 用来给http响应添加一些Header,比如X-Frame-Options, X-XSS-Protection*,X-Content-Type-Options.
4、CsrfFilter:在spring4这个版本中被默认开启的一个过滤器,用于防止csrf攻击,了解前后端分离的人一定不会对这个攻击方式感到陌生,前后端使用json交互需要注意的一个问题。
5、LogoutFilter:顾名思义,处理注销的过滤器
6、 UsernamePasswordAuthenticationFilter:这个会重点分析,表单提交了username和password,被封装成token进行一系列的认证,便是主要通过这个过滤器完成的,在表单认证的方法中,这是最最关键的过滤器。
7、 DefaultLoginPageGeneratingFilter:默认登录页面 生成器 过滤器
8、DefaultLogoutPageGeneratingFilter:默认退出登录页面 生成器 过滤器
9、BasicAuthenticationFilter:Basic认证方式过滤器
10、RequestCacheAwareFilter:(文档中并未介绍,非核心过滤器) 内部维护了一个RequestCache,用于缓存request请求
11、SecurityContextHolderAwareRequestFilter:此过滤器对ServletRequest进行了一次包装,使得request具有更加丰富的API
12、AnonymousAuthenticationFilter:匿名身份过滤器,这个过滤器个人认为很重要,需要将它与UsernamePasswordAuthenticationFilter 放在一起比较理解,spring security为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。
13、SessionManagementFilter : 和session相关的过滤器,内部维护了一个SessionAuthenticationStrategy,两者组合使用,常用来防止session-fixation protection attack,以及限制同一用户开启多个会话的数量
14、ExceptionTranslationFilter:直译成异常翻译过滤器,还是比较形象的,这个过滤器本身不处理异常,而是将认证过程中出现的异常交给内部维护的一些类去处理,具体是那些类下面详细介绍
15、FilterSecurityInterceptor :这个过滤器决定了访问特定路径应该具备的权限,访问的用户的角色,权限是什么?访问的路径需要什么样的角色和权限?这些判断和处理都是由该类进行的
IntelliJ IDEA 搭建Spring源码阅读环境
1、git clone 下载spring源码
https://github.com/spring-projects/spring-framework
2、IDEA 打开 spring-framework 源码,打开时提示如下,一切保持默认,什么都不用动,直接点OK,然后等待IDEA自动下载gradle,及gradle自动构建完成即可。
IDEA导入Spring源码
Spring IOC 容器源码分析系列文章导读
https://segmentfault.com/a/1190000015089790
spring入门实例
添加spring依赖
Eclipse中创建一个maven-archetype-quickstart 简单maven项目(非web项目),Artifact Id(即maven工程名)为spring-test,在pom.xml文件中添加spring的依赖,保存后稍等片刻,maven会将spring依赖的jar包下载到本地仓库目录中。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Spring版本 -->
<spring.version>3.1.4.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
创建类Hello
创建包com.masi.jmx.spring,在包内创建类Hello:
package com.masi.jmx.spring;
public class Hello
{
String name;
public void printHello() {
System.out.println("你好,"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
创建spring上下文配置文件
编辑Java Build path,创建src/main/resources文件夹,在其中新建xml配置文件applicationContext-hello.xml,添加Hello类的bean配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="com.masi.jmx.spring.Hello">
<property name="name" value="Matt马特" />
</bean>
</beans>
通过应用上下文获取bean
在包com.masi.jmx.spring中新建类HelloMain,加载spring上下文配置,获取bean,调用类方法:
package com.masi.jmx.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-*.xml");
Hello hello = (Hello)context.getBean("hello");
hello.printHello();
}
}
Run As->Java Application 运行,查看结果。
spring模块
- spring核心容器:提供依赖注入、Bean工厂、应用上下文
- AOP模块:提供面向切面编程
- 数据访问与集成:提供JDBC和DAO,以及ORM(Object-Relational Mapping)模块,例如Hibernate,iBatis
- Web与远程调用:Spring MVC框架,
- 测试模块
依赖注入
依赖注入和控制翻转是一个意思。
依赖注入(Dependency Injection, DI)
所谓依赖注入就是指:组件之间的依赖关系由容器在运行期决定,即由外部容器动态地将依赖对象注入到组件中。
目的是解除耦合,对象间只通过接口来表明依赖关系。
Spring通过依赖注入模式,将依赖关系从编码中脱离出来,从而大大降低了组件之间的耦合,实现了组件真正意义上的即插即用。这也是Spring最具价值的特性之一。
依赖注入,即 控制反转(Inversion of Control, IoC)
所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
POJO类
Plain Ordinary Java Object,简单的Java对象,有一些private的参数作为对象的属性,然后针对每个参数定义了get和set方法作为访问的接口,有一些简单的运算属性也是可以的,但不允许有业务逻辑。
面向切面编程
面向切面编程(Aspect Oriented Programming, AOP)
spring自带命名空间
spring核心框架自带的10个xml命名空间
命名空间 用途
aop 为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素
beans 声明bean和装配bean
context 配置Spring应用上下文,自动检测、自动装配bean,注入非Spring直接管理的对象
jee 提供了与java ee API的集成,例如JNDI和EJB
jms 为声明消息驱动的pojo提供了配置元素
lang 支持由Groovy、JRuby和BeanShell等脚本实现的bean
mvc 启用Spring MVC
oxm 支持Spring的对象到xml映射配置
tx 提供声明式事务配置
util 提供工具类元素
参考
跟我学spring3笔记–私塾在线
http://sishuok.com/forum/blogCategory/showByCategory/60/49.html?user_id=2
spring framework核心框架体系结构
https://zhuanlan.zhihu.com/p/24204354
上一篇 Java-正则表达式
下一篇 Java-字符串
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: