Spring
2023-08-30 16:59:55 0 举报
Spring
作者其他创作
大纲/内容
Spring基础
基础
架构详情
Spring 结构体系
Spring 架构图
模块详解
Data Access/Integration 数据访问集成
JDBC
提供一个JDBC模版
消除传统冗长的JDBC编码,还必须事务控制
能享受到Spring管理事务的好处
ORM
提供"对象-关系"映射框架无缝集成API
包括JPA,JDO,Hibernate,MyBatis等
使用Spring管理事务
OXM
提供一个支持Object/XML映射的抽象实现
将XML数据映射成Java对象,或将Java对象映射成XML数据
JMS
java消息服务,提供一套"消息生产者和消息消费者"模版用于更加简单的使用JMS
JMS 用在用于两个应用程序之间,或分布式系统中发送消息,进行异步通信
Transactions
事务模块 支持编程和声明式事务管理
Web 模块
Web
提供基本的Web开发集成特性
例如 文件上传功能,使用Servlet监听器的IOC容器初始化以及web应用上下文
Servlet
提供了一个SpringMVCWeb框架的实现
SpringMVC框架提供了基于注解的请求资源注入
更简单的数据绑定,数据验证等及一套非常易用的JSP标签,完全无缝与其他技术协作
WebSocket
提供了简单的接口
用户只要实现响应接口就可以快速搭建WebSocket Server ,从而实现双向通信
Portlet
提供Portlet环境中使用MVC实现类似于WebSocket Server模块功能
Core Container Spring的核心容器
Beans
提供框架的基础部分,包括控制反转和依赖注入
Core 核心模块
封装了Spring框架的底层部分,包括资源访问,类型转换及一些常用工具类
Context 上下文模块
建立在Core和Bean模块的基础之上
集成Beans模块功能并添加一下功能
资源绑定
数据验证
国际化
JavaEE支持
容器生命周期
事件传播
ApplicationContext接口是上下文模块的焦点
SpEL模块
提供了强大的表达式语言支持
支持访问和修改属性值,方法调用
支持访问及修改数组,容器和索引器命名变量
支持算数和逻辑运算
支持从Spring容器获取Bean
它也支持列表投影,选择,和一般的列表聚合
AOP
面向切面编程的实现
Aspects
提供与AspectJ的集成,是一个功能强大且成熟的面向切面编程(AOP)框架
Instrumentation
提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用
Messaging
提供了 对消息传递体系结构和协议支持
注解
简述
Bean声明
@Componet
定义基础层的通用组件,没有明确的角色
@Service
定义业务逻辑层的服务组件
@Rpository
@Controller
Bean注入
@Autowired
@Resource
配置类注解
@Configuration
@Bean
@ComponetScan
AOP注解
@EnableAspectJAutoProxy
@Aspect
属性支持注解@Bean
@Scope
@PostConstruct
@PreDestroy
@Value
@PropertySource
异步操作注解
@EnableAsync
@Async
定时任务相关
@EnableScheduling
@Sceduled
开启功能支持
@EnableAspectJAutoProxy
@EnableAsync
@EnableScheduling
@EnableConfigurationProperties
@EnableWebMVC
@EnableJpaRepositories
@EnableTransactionManagement
@EnableCaching
测试相关注解
@RunWith
@ContextConfiguration
SpringMVC注解
@Controller
@RequestMapping
@ResponseBody
@PathVariable
@RestController
@ExceptionHandler
@InitBinder
常用注解
特性
轻量级框架
jar依赖相对较小
运行期间消耗的系统资源也比较小
模块化处理,按需选择依赖模块,功能模块耦合度低
控制反转
对象与对象之间的依赖关系交给Spring来管理
当一个对象初始化过程中需要依赖其他对象时,Spring会将这个依赖的对象传递过去
Spring通过控制反转技术实现对象之间的解耦
面向容器
通过注解或者XML对对像进行配置化来完成对象生命周期的管理,已经Bean对象创建依赖关系
实例对象可以是单例模式,也可以是原型模式
面向切面
通过面向切面技术来分离系统逻辑和业务逻辑,提高系统的内聚性
无需关注重复的系统功能,只需要关注业务逻辑即可
通过面向切面技术主动将系统逻辑植入业务逻辑当中
核心概念
横切关注点
定义对哪些方法进行拦截,以及在拦截后执行哪些操作
切面Aspect
横切关注点的抽象
连接点
在Spring中,连接点指被拦截到的方法,但是从广义上来说,连接点换可以是字段或者构造器
切入点Pointcut
对连接点进行拦截定义
通知advice
拦截到连接点之后要执行的具体操作
前置通知
后置通知
成功通知
失败通知
异常通知
环绕通知
目标对象
代理的目标对象
植入
将切面应用到目标对象并执行代理对象创建的过程
引入
在运行期为类动态的添加一些方法或字段而不用修改类的代码
AOP代理方式
JDKd
基于接口的动态代理
主要通过java.lang.reflect包中Proxy类和InvocationHandler接口来实现
CGLib
基于子类的动态代理 Enhancer
使用Enhancer的create方法,被代理类不能是最终类也就是final修饰的方法
可以运行期间扩展java类和实现java接口
采用ASM字节码生成框架,使用字节码技术生成代理类,比使用 Java 反射效率要高
CGLIB 的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对 final 修饰的类进行代理
框架灵活
基于容器化管理对象
对象可被声明式创建,如XML,注解等方式
具有事务管理,持久化框架,web框架的服务的集成
启动流程
初始化容器 注册内置的BeanPosProcessor的BeanDefinition到容器中
实例化BeanFactory的[DefaultListableFactory]工厂,用于生成Bean对象
实例化BeanDefinitionReader注解配置读取器
用于对特定注解(如@Service,@Repository)的类转化为BeanDefinition对象
实例化ClassPathBeanDefinitionScanner路径扫描器
用于指定的包目录进行扫描查找bean对象
将配置类的BeanDefinition注册到容器里
调用refresh()方法刷新容器
prepareRefresh()
刷新容器前的预处理
obtainFreshBreanFactory()
获取容器初始化时创建的BeanFactory
prepareBeanFactory(beanFactory)
BeanFactory的预处理工作,向容器添加一些组件
postProcessBeanFactory(beanFactory)
子类重写该方法,可以实现BeanFactory创建并预处理完成以后的进一步的设置
invokeBeanFactoryPostProcessors(benaFactory)
BeanFactory标准初始化之后执行的BeanFactoryPostProcess的方法 即BeanFactory后置处理器
registerBeanPostProcessors(beanFactory)
向容器中注册Bean的后置处理器BeanPostProcessor
主要是干预Spring初始化bean的流程
从而完成代理,自动注入,循环依赖等功能
initMessageSource()
初始化MessageSource
用于国际化功能,消息绑定和消息解析
initApplicationEventMulitcaster()
初始化时间派发器,在注册监听中用到
onRefresh()
留给子容器,子类重写这个方法,在容器刷新的时候可以自定义逻辑
registerListeners()
注册监听器
将容器中的所有ApplicationListener注册到事件派发器中
并派发之前步骤产生的事件
finshBeanFactoryInitialization(beanFactory)
初始化所有剩下的单实例bean
核心的方法是preInstantiateSingletons()会调用getBean()方法创建对象
finishRefresh()
发布BeanFactory容器刷新完成事件
Bean生命周期
四个阶段
实例化Instantiation
属性赋值 Populat
初始化Initialization
销毁Destruction
具体流程
实例化bean
对于BeanFactory容器->createBean()
对于ApplicationContext容器->获取BeanDefinition中的信息
设置对象属性(依赖注入)
实例化后的对象被封装在BeanWrapper对象中
根据BeanDefinition中的信息
以及通过BeanWrapper提供设置属性的接口完成属性设置与依赖注入
处理Aware接口
通过Aware类型实现的接口,获取Spring容器的资源
BeanNameAware接口
会调用它实现的setBeanName(String beanId)方法,传入Bean的名字
BeanClassLoaderAware
调用setBeanClassLoader()方法,传入ClassLoader对象的实例
BeanFactoryAware
会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身
ApplicationContextAware
会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文
BeanPostProcessor前置处理
Bean实现了BeanPosProcessor接口
会调用postProcessBeforeInitialization(Object obj, String s)方法
InitializingBean
Bean实现了InitializingBean接口
执行afeterPropertiesSet()方法
init-method
Bean在Spring配置文件中配置了 init-method 属性
则会自动调用其配置的初始化方法
BeanPostProcessor
Bean实现了BeanPostProcessor接口
会调用postProcessAfterInitialization(Object obj, String s)方法
Bean初始化结束时调用的,所以可以被应用于内存或缓存技术
DisposableBean
当Bean不再需要时,会经过清理阶段
Bean实现了DisposableBean这个接口
会调用其实现的destroy()方法
destroy-method
Bean的Spring配置中配置了destroy-method属性
会自动调用其配置的销毁方法
SpringBean的作用域
singleton单例模式
Spring默认的作用域
全局有且仅有一个实例,无论多少个Bean引用他,始终都指向同一个bean对象
该模式下多线程是不安全的
prototype原型模式
每次获取bean的时候,容器都会创建一个新的bean实例
request
每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP有效,request有效
session
每次HTTP请求都会产生一个新的bean,同时该Bean仅在当前HTTP Session内有效
Global Session
全局的HTTP Session中容器会返回该Bean的同一个实例,且仅在使用Portlet Context时有效
Spring源码关键字
BeanDefinition(bean定义)
定义
主要用来描述bean,存储bean的信息
主要包括一下bean的定义
name 名字
class name 类名
scope 作用域
isLazylnit 是否懒加载
DependsOn 依赖其他的bean
AutowireCandidate 是否自动注入 只对Autowired注解有效
isPrimary 是否是主要候选bean
FactoryBeanName Bean的工厂类
FactoryMethodName Bean 的工厂方法
ConstructorArgumentValues Bean 构造方法参数值、所有属性
isSingleton 是否是单例
isPrototype 是否是原型
isAbstract 是否是抽象 Ture代表容器无需对Bean实例化
OriginatingBeanDefinition 获取原始的Bean定义
BeanDefinition合并
子BeanDefinition会从父BeanDefinition中继承没有的属性
一般父BeanDefinition会被将abstract=true,作为模板使用,不会实例化父
每次需要用到BeanDefinition都进行一次合并
相关的类
继承的类
AttributeAccessor
提供了一个获取属性跟设置属性的方法
BeanMetadataElement
作用是可以持有XML文件的一个bean标签对应的Object
子类
AnnotatedBeanDefinition
其用来操作注解元数据。 通过注解方式得到的 Bean(@Component、@Bean)
其实现类
AnnotatedGenericBeanDefinition 通过@Import导入的类
ScannedGenericBeanDefinition 通过注解@Service,@Compent扫描的类
ConfigurationClassBeanDefinition 通过@Bean的方式
AbstractBeanDefinition
定义默认值
ChildBeanDefinition
被GenericBeanDefiniton 替代
RootBeanDefinition
运行时统一BeanDefinition 视图
Spring 启动初始化的几个实例的BeanDefinition的类型都是RootBeanDefinition
通过@Bean 注解配置的bean,也是此类型的BeanDefition,实际上是ConfigurationClassBeanDefinition
GenericBeanDefinition
Spring2.5 以后新加入的 BeanDefinition 实现类
GenericBeanDefinition 可以动态设置父 Bean
同时兼具 RootBeanDefinition 和 ChildBeanDefinition 的功能
通过注解配置以及配置类(@Bean 除外)的BeanDefinition类型都是GenericBeanDefinition
子类实现
ScannedGenericBeanDefinition 通过扫描包的方式
AnnotatedGenericBeanDefinition 通过注解的方式
相对父类多提供
getMetadata 获取注解信息
getFactoryMethodMetadata() 被@Bean注解标记的方法,就被解析成了FactoryMethodMetadata
FactoryBean(工厂bean)
定义
定制化Bean的创建逻辑
当我们实例化一个对象逻辑很复杂时,使用FactoryBean是很有必要的,这样会规避去使用冗长的XML配置
其最大的一个作用是:可以让我们自定义Bean的创建过程
比如SqlSessionFactoryBean 实现了FactoryBean,和第三方框架的整合
主要功能
返回对象实例
创建bean的Class类型
是否是单例,默认为单例的
BeanFactory(bean工厂)
定义
Spring容器的顶级接口,对容器做了基本的定义,Bean容器的基本客户端视图
主要提供了一下功能
获取bean实例
获取bean的提供者(对象工厂)
判断是否包含bean
单例,原型,bean类型的判断
获取bean的类型,别名
详细功能
FactoryBean定义的详情
getBean
根据指定名称或指定类型获取bean
getBeanProvider
获取指定的Bean的提供者
containsBean
检查容器中是否含有这个名称的Bean
isSingleton
Bean是否为单例
isPrototype
Bean是否为原型=
isTypeMatch
Bean类型是否匹配
getType
返回指定Bean的类型
getAliases
返回指定Bean的别名
子类扩展的接口
HierarchicalBeanFactory(提供了访问父容器的能力)
对顶层的BeanFactory做了扩展
提供了对父容器的访问功能
子类ConfigurableBeanFactory(提供了对容器的配置能力)
主要提供了对BeanFactory的配置能力
该接口扩展的内容较多,比如类加载器,类型转化,属性编辑器,BeanPostProcessor
作用域,bean定义,处理bean依赖关系,合并其他ConfigurableBeanFactory,bean如何销毁等
子类
ConfigurableListableBeanFactory
继承了三个接口 ListableBeanFactory,AutowireCapableBeanFactory,ConfigurableBeanFactory
并扩展了忽略依赖
自动装配判断
冻结bean的定义
枚举所有bean名称的功能
ListableBeanFactory(提供了对bean的枚举能力)
查找容器中所有BeanDefinition的相关信息,提供了对bean的枚举能力
根据指定类型获取容器中的对应的Bean的名称,可能会有多个
获取指定类型的Bean,返回一个map,key为bean的名称,value为对应的Bean
获取添加了指定注解的Bean的名称
AutowireCapableBeanFactory(提供了自动装配能力)
主要提供了自动装配能力
类中的方法都跟装配Bean,配置Bean相关
作用就是对于一些不受Spring管理的Bean,也能为其提供依赖注入的功能
AbstractBeanFactory
实现了大部分的方法,其中最终的实现为getBean()/doGetBean()方法的实现,提供了模版。其实createBean抽象方法,还是子类去实现的
实现的抽象基类
提供ConfigurationBeanFactorySPI的全部功能
可以用作bean工厂实现的基类
实现从某些后端资源获取 beanDefinitions
该类提供了一个单例缓存
通过DefaultSingletonBeanRegistry、单例或者原型确定
处理、别名、子bean定义的bean定义合并和bean销毁,接口、自定义销毁方法
子类要实现的主要模板方法
getBeanDefinition
给定的bean名称检索bean定义
createBean
为给定的bean定义创建bean实例
操作的默认实现可以在
DefaultListableBeanFactory.getBeanDefinition
AbstractAutowireCapableBeanFactory.createBean
AbstractAutowireCapableBeanFactory
抽象bean工厂超类,实现默认bean创建
具有RootBeanDefinition类指定的全部功能
AbstractBeanFactory的createBean
AutowireCapableBeanFactory 接口的实现
提供bean创建(带有构造函数解析)、属性填充、连接(包括自动连接)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动连接构造函数、按名称列出的配置和按类型列出的配置
子类要实现的主要模板方法是
resolveDependency
用于按类型自动注入
对于能够搜索其bean定义的工厂,通常将通过这种搜索实现匹配bean
对于其他工厂样式,可以实现简化的匹配算法
DefaultListableBeanFactory (重点 最终实现类)
描述
BeanDefinitionRegistry bean定义信息注册中心
Spring内部的唯一使用的工厂实现(XmlBeanFactory已废弃)基于bean definition对象,是一个成熟的bean factroy
默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definition对象,是一个成熟的bean factroy
它是整个bean加载的核心部分,也是spring注册加载bean的默认实现
BeanFactoryPostProcessor(bean工厂后置处理器)
后置工厂处理器
可以对Bean配置元数据(这里的配置元数据其实指的就是BeanDefinition)进行操作
允许其BeanFactoryPostProcessor读取指定Bean的配置元数据
并在实例化之前修改它
可以配置多个BeanFactoryPostProcess
如果实现Order接口 ,还可以控制实现顺序
其子类
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor 与 BeanDefinitionRegistryPostProcessor 对比
容器初始化的过程中 首先执行 BeanDefinitionRegistryPostProcessor 然后执行 BeanFactoryPostProcessor
其中优先级数据 PriorityOrdered >Ordered
BeanPostProcessor(bean后置处理器)
接口定义两个回调方法
postProcessBeforeInitialization 初始化前的后期处理
postProcessAfterInitialization 初始化后的后期处理
通过实现这两个方法我们可以提供自己的实例化以及依赖注入等逻辑
如果我们想要在Spring容器完成实例化,配置以及初始化一个Bean后进行一些定制的逻辑
我们可以插入一个甚至更多的BeanPostProcessor的实现
实现Ordered 接口 也可以控制执行顺序
子类
InstantiationAwareBeanPostProcessor 实例化感知Bean后置处理器
DestructionAwareBeanPostProcessor 销毁后感知Bean后置处理器
PropertyPlaceholderConfigure()属性处理器
在XML文件中用${…}替换指定的properties文件中的值
继承以下接口
PropertiesLoaderSupport
这个类主要包含定义了属性的加载方法
PropertyResourceConfigurer
这个类主要可以对读取到的属性进行一些转换
PlaceholderConfigurerSupport
主要负责对占位符进行解析
ApplicationContext(上下文)
主要继承的能力
MessageSource 国际化资源
应用程序运行时,可根据客户端操作系统的国家/地区,语言的不同而显示不同的界面
不同的环境提供不同的资源文
ApplicationEventPublisher 事件发布功能
事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法。
事件源:ApplicationEventPublisher 发布事件
事件:MyEvent, @EnableAsync 开启事件 @Async 异步处理
事件监听器:EventListener 监听消费
EnvironmentCapable 获取容器当前运行的环境
不同环境运行不同profile,@Profile (具体环境)
通过EnvironmentCapable激活具体的运行环境
返回值Environment->继承PropertyResolver从而可以操作程序运行时的属性资源
ResourceLoader 加载资源文件
PropertyResolver ->接口中主要提供了对当前运行环境中属性的操作
DefaultResourceLoader->ProtocolResolver 自定义协议解析器
Resouce
InputStreamSource 父类
getInputStream 获取资源文件IO流
每次调用都将返回一个当前资源对应的java.io. InputStream字节流
抽象基类AbstractResource
大多数Resource的实现类的基类,提供了很多通用的方法
FileSystemResource
基于java的文件系统封装而成的一个资源对象
AbstractFileResolvingResource
将URL解析成文件引用,既会处理协议为:“file“的URL,也会处理JBoss的”vfs“协议。然后相应的解析成对应的文件系统引用。
ByteArrayResource
根据一个给定的字节数组构建的一个资源。同时给出一个对应的输入流
BeanDefinitionResource
只是对BeanDefinition进行的一次描述性的封装
InputStreamResource
流资源的转换
UrlResource
UrlResource代表URL资源,用于简化URL资源访问。
HTTP
FTP
File
ClassPathResource
使用Class对象的getResource(String path)获取资源URL
使用ClassLoader对象的getResource(String path)获取资源URL
BeanFactory 负责配置,创建,管理bean,IOC功能的实现主要就依赖于该接口子类实现
体系拆分
web体系
WebApplicationContext 最顶级接口
定义了一堆常量,以及一个方法,约束了所有的web容器必须能返回一个Servlet的上下文(ServletContext)
相关子类
ConfigurableWebApplicationContext 指定上下文配置加载的位置
applicationContext.xml 路径配置 默认/WEB-INF/applicationContext.xml
AbstractRefreshableWebApplicationContext
在web程序启动的时候,提供一个configLocations属性
XmlWebApplicationContext
进一步指定了配置文件的加载形式,WebApplicationContext的实现,它从XML文档中获取其配置
AnnotationConfigWebApplicationContext
WebApplicationContext的实现它接受注释类作为输入
非web体系
ConfigurableApplicationContext
,提供了web应用上下文的可配置的能力,获取或配置上下文
AbstractApplicationContext
抽象公共的上下文特性
AbstractRefreshableApplicationContext
刷新上下文,每次刷新在内部创建一个新的bean工厂的实例
AbstractRefreshableConfigApplicationContext
添加了对指定的配置文件路径的公共的处理
可以把他看作基于XML的应用上下文的基类
AbstractXmlApplicationContext
用于描绘包含能被XmlBeanDefinitionReader所理解的bean定义的XML文档
GenericApplicationContext
通用上下文的实现
能够加载配置文件,xml,properties等等
它的内部持有一个DefaultListableBeanFactory的实例
实现了BeanDefinitionRegistry接口,以便能通过BeanDefinitionReader读取bean的配置,并注册
AnnotationConfigApplicationContext
提供了注解配置和类路径扫描(scan方法)的支持
BeanWrapper(基础设施中心)
定义
BeanWrapper对Spring中的Bean做了包装,为的是更加方便的操作Bean中的属性
PropertyDescriptor(属性描述符)
能够描述javaBean中的属性,通过属性描述符我们能知道这个属性的类型,获取到操纵属性的方法(getter/setter)
相关接口能力
PropertyEditorRegistry(属性编辑器注册器)
就是用来注入属性编辑器(PropertyEditor)
PropertyEditor(属性编辑器)
是JavaBean规范定义的接口
其设计的意图是图形化编程上,方便对象与String之间的转换工作
而Spring将其扩展,方便各种对象与String之间的转换工作。
Spring中对PropertyEditor使用的实例
直接通过字面值来设置Bean中的属性
SpringMVC在解析请求参数时,也是使用的PropertyEditor
PropertyAccessor(属性访问器)
ProperyValue
如果某个值要给赋值给bean属性,Spring都会把这个值包装成ProperyValue对象
TypeConverter(类型转换器)
定义了进行类型转换时的一些规范,就像名字定义的那样,主要用来做类型转换
通常(但不一定)与PropertyEditorRegistry接口一起实现
由于TypeConverter实现通常基于PropertyEditors
ConfigurablePropertyAccessor(可配置属性访问器)
用于封装PropertyAccessor的配置方法的接口
还扩展了PropertyEditorRegistry接口
该接口定义了PropertyEditor管理的方法
主要实现功能
对Bean进行包装
对Bean的属性进行访问以及设置
在操作属性的过程中,必然涉及到类型转换,所以还有类型转换的功能
涉及java机制
内省机制
JavaBean(一种特殊的类,主要用于传递数据信息)
属性都是私有的
有无参的public构造方法
对私有属性根据需要提供公有的getXxx方法以及setXxx方法
getters必须有返回值没有方法参数;setter值没有返回值,有方法参数
JDK中提供了一套API用来访问某个属性的getter/setter方法,这些API存放在java.beans中,这就是内省(Introspector)
内省和反射的区别
反射
java反射机制是在运行中,对任意一个类,能够获取得到这个类的所有属性和方法;它针对的是任意类
反射可以操作各种类的属性
反射可直接操作属性Field
内省
内省(Introspector):是Java语言对JavaBean类属性、事件的处理方法
内省只是通过反射来操作JavaBean的属性
内省设置属性值肯定会调用setter方法
源码分析
接口实现
PropertyEditorRegistrySupport,PropertyEditorRegistry的基础上做了进一步的扩展,提供的还是属性编辑器注册的功能
TypeConverterSupport 接口实现了TypeConverter,所以它具有类型转换的能力
AbstractPropertyAccessor 只是实现了批量设置属性的方法,真正的setPropertyValue还是留待子类实现
AbstractNestablePropertyAccessor 这个类开始真正的将属性访问跟类型转换结合到一起,它真正的实现了setPropertyValue
Formatter(数据格式)
将返回数据调整成指定格式或者指定类型返回到前端页面
Printer 将T类型的数据根据Locale信息打印成指定格式,即返回字符串的格式
通过聚合接口对String类型数据的解析以及格式化
具体子类
CurrencyStyleFormatter 货币
PercentStyleFormatter 百分比
NumberStyleFormatter 正常数字
DateFormatter 时间格式化
FormatterRegistry注册这些格式化器
@EnableWebMvc 配置SpringMVC中的格式化器
Bean Validation(数据校验)
@Validated跟@Valid的区别
@Valid是JSR的规范,来源于javax.validation包下
@Validated是Spring自身定义的注解,位于org.springframework.validation.annotation包下
@Validated无法作用在字段上,正因为如此它就无法完成对级联属性的校验
@Valid的 没有这个限制。
@Validated注解中可以提供一个属性去指定校验时采用的分组
@Valid没有这个功能,因为@Valid不能进行分组校验
@Valid对JavaBean的校验
@Validated对JavaBean嵌套属性的校验效果
Data Binder(数据绑定)
PropertyEditorRegistry 属性编辑器注册表
TypeConverter 类型转换器
BeanWrapperImpl跟DataBinder DataBinder底层也是同样也是采用了Java的内省机制只会根据setter方法以及getter来设置或者获取Bean中的属性
Resource(资源)
0 条评论
下一页