Spring5.1.5-用户手册-Core-学习
此文为Spring Framework 5.1.5版本Core部分的用户手册的学习。对部分内容进行了翻译摘取和学习理解,为了方便自己的在使用中具体细节处的回顾,建议配合原用户手册一起观看。用户手册的地址为
https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/
目 录
1 IOC容器... 3
1.1 简介IOC容器和Beans. 3
1.2 容器概览... 3
1.2.1 配置信息... 3
1.2.2 初始化一个容器... 3
1.3 Bean概览... 4
1.3.1 Bean命名... 5
1.3.2 实例化Bean. 5
1.4 依赖... 7
1.4.1 依赖注入... 7
1.4.2 依赖配置的一些补充... 9
1.4.3 使用depends-on属性... 15
1.4.4 延迟初始化Bean. 15
1.4.5 Xml中Bean标签中的自动装配... 16
1.4.6 Method Injection 方法注入##. 17
1.5 Bean的作用域... 17
1.5.5 自定义Bean的作用域... 18
1.6 定制Bean的特性... 18
1.6.1 生命周期回调... 18
1.6.2 ApplicationContextAware and BeanNameAware. 19
1.6.3 其他Aware. 20
1.7 Bean的继承关系... 21
1.8 容器Container扩展的关键点... 21
1.8.1 BeanPostProcessor 21
1.8.2 BeanFactoryPostProcessor 21
1.8.3 FactoryBean. 21
1.9 基于注解的容器配置... 21
1.9.1 @Required. 22
1.9.2 @Autowired. 22
1.9.3 @Primary. 24
1.9.4 @Qualifier 24
1.9.5 可以自动注入到泛型类中... 27
1.9.6 CustomAutowireConfigurer 27
1.9.7 使用@Resource实现注入... 27
1.9.8 @PostConstruct @PreDestroy. 27
1.10 路径扫描和注解管理... 27
1.10.4 使用@ComponentScan过滤要扫描的注解... 27
1.10.6 对自动注入的Bean实现命名... 28
1.10.7 给自动注入的Bean实现提供作用域... 29
1.10.9 生成一个候选Component的坐标... 30
1.11 使用JSR330标准的注解... 30
1.11.1 @Inject @Named. 31
1.11.2 @ManagedBean. 31
1.11.3 JSR330注解的一些限制... 31
1.12 通过Java代码实现容器的配置... 32
1.12.2 AnnotationConfigApplicationContext 32
1.12.3 @Bean的一些相关... 33
1.12.5 Composing Java-based Configurations. 34
1.13 环境抽象... 35
1.13.1 Bean Definition Profiles. 35
1.13.2 PropertySource. 37
1.13.3 Using @PropertySource. 37
1.14 Registering a LoadTimeWeaver 37
1.15 ApplicationContext容器的一些额外功能... 38
1.16 BeanFactory. 38
2 Resources. 38
3 验证、参数绑定、类型转换... 39
3.1 验证器... 39
3.3 BeanWrapper 39
3.3.1 settings and gettings. 39
3.3.2 PropertyEditor 40
3.4 Spring Type Conversion. 41
3.4.1 Converter接口... 41
3.4.2 ConverterFactory. 42
3.4.3 GenericConverter 42
3.4.4-3.46 ConversionService. 42
3.5 Spring Field Formatting. 43
3.5.1 Formatter格式器... 43
3.5.2 Annotation-driven Formatting. 43
3.5.3 FormatterRegistry格式器注册... 45
3.5.4 FormatterRegistrar格式器注册... 45
3.6 Configuring a Global Date and Time Format 45
3.7 Spring Validation. 46
3.7.1 JSR-303 Bean Validation API. 46
3.7.2 Configuring a Bean Validation Provider 46
3.7.3 Configuring a DataBinder 48
4 Spring Expression Language (SpEL) 48
5 AOP. 49
5.4 @AspectJ support 49
5.4.1. Enabling @AspectJ Support 49
5.4.2. Declaring an Aspect声明切面... 49
5.4.3. Declaring a Pointcut 声明切点... 50
5.4.4. Declaring Advice声明通知... 52
5.4.5 Introductions-@DeclareParents. 52
1 IOC容器
1.1 简介IOC容器和Beans
1.2 容器概览
单机模式最常见的ClassPathXmlApplicationContext
or FileSystemXmlApplicationContext
1.2.1 配置信息
除了xml之外,还有两种方式,第一种是在xml文件里添加<context:annotation-config/>,开启自动配置;第二种是通过一些注解。
1.2.2 初始化一个容器
可以一次读取多个xml。
还可以在xml文件的beans标签内通过import引入其他xml文件。
1.3 Bean概览
Bean在容器中存储是以BeanDefinition的形式存在的。
下边的是Bean的一些属性
然后还可以调用getBeanFactory方法之后获得一个BeanFactory对象,然后再注册不在容器中的Bean。
1.3.1 Bean命名
Bean里边的id属性和name属性是不同的。
Id传唯一id,name可以传别名,可用通过逗号和分号分隔好多别名
Xml里边还可以传入alias标签,提供额外的别名。这样就可以通过后边的别名访问Bean
1.3.2 实例化Bean
通过class指定要生成什么类,还可以通过以下两种方法生成,后边会有。
如果想要一个内部类的话,那么要使用二进制方法。下边加了个$号
通过静态工厂方法实例化Bean
这个例子不太好,其实应该是一个工厂类里边生成一个实例,ServiceFactory里边生成一个service比较好。注意,这个里边的class并不是返回对象的类型,这个xml中甚至都没有返回的类型。
通过实例工厂实例化Bean,工厂需要实例,所以先创建一个工厂,然后Bean再跟工厂建立联系。当然一个工厂里边可以产出好多不同的对象,这里就不在截图了。
1.4 依赖
1.4.1 依赖注入
通过构造器方法实现依赖注入,下边那种index起始值是0.
注解@ConstructorProperties可以标注在构造器方法上
选择构造器注入还是setter注入呢?强制的参数用构造器,可选的参数用setter。
依赖解析的过程
使用构造器注入可能会有循环依赖的问题。那么就改造下,用setter注入吧。
静态工厂中也可以通过构造器注入的方式生成Bean,看下边的。
1.4.2 依赖配置的一些补充
可以使用namespace。
可以在Bean中按下边的方式传入Properties对象。
可以使用idref标签防错,防止出现下边的情况,把引用类型和值类型搞错了。并保证引用的值一定存在。
在ref中使用parent属性可以指定父容器中的值。
Inner Beans
Collections,参数中涉及集合类型
Collection Merging
空值和null值,如果是字符串类型的话,在xml里边“”代表空字符串,要用null标签表明是null值。
XML Shortcut with the p-namespace
这里大概讲了下命名空间的使用。
XML Shortcut with the c-namespace
复合属性名称,如下边的fred属性有bob属性,bob属性有sammy属性,最终给sammy赋值,要保证路径上的属性都不为空。
1.4.3 使用depends-on属性
Bean之间有依赖关系,就是让一些要被注入到别的Bean的Bean,作为属性的Bean要提前完成实例化。
1.4.4 延迟初始化Bean
如果Bean被设置为延迟初始化的话,但是另一个非延迟的Bean依赖了它,那么他还是会在容器建好的时候被初始化。
1.4.5 Xml中Bean标签中的自动装配
这里讲的是在xml中也可以对于当个Bean设置自动配置,比如一个A Bean依赖B Bean,那么B Bean配置好之后 ,在A Bean里边可以不用ref指定BBean,在A的标签中通过添加autowire属性来设置自动装配,根据不同的装配规则,会把B自动注入到A中。
但是自动装配有一些缺点和限制。不精确,容易有歧义,不能装配基础类型,然后会被精确地依赖注入所覆盖。
将一个Bean排除在自动装配之外,可以对Bean标签中设置autowire-candidate属性为false。
default-autowire-candidates标签可以指定自动装配哪些Bean,在Beans标签中设置,通过模式匹配。比如有A依赖B,我们将autowire属性设置为byType,在xml中2个B,这样在idea里边xml会被红波浪线警告,因为A无法判断应该加载哪个,我们在最顶层的Beans标签中通过模式匹配的方式将default-autowire-candidates的值设置为能匹配上某一个标签,那么最后所对应的B Bean就会被注入到A中。
1.4.6 Method Injection 方法注入##
看官方文档没看懂,网上搜了下,这个就是可以将抽象方法通过方法注入的方式变得可以使用。见下边的两个网址好了。Look-up method 和replace-method。还有@Lookup注解。
https://www.cnblogs.com/ViviChan/p/4981619.html
https://www.cnblogs.com/atwanli/articles/6154920.html
1.5 Bean的作用域
这里关于web那块的说明可以到时候结合用户手册再看看。
关于把一个短生命周期的Bean注入到一个长声明周期的Bean中,可以在Bean中添加<aop:scoped-proxy/>。原因可以见下边的博文。
https://blog.csdn.net/soonfly/article/details/69360680
1.5.5 自定义Bean的作用域
1.6 定制Bean的特性
这里就是定义容器Container和Bean在整个生命周期里边干什么,通过实现不同的接口来实现每一个环节的处理。
1.6.1 生命周期回调
这里先是将可以在Bean中的属性设置init-method 和destroy-method标签,没什么好主意的。有一点,可以在Beans属性中配置default-init-method,来自动识别每个Bean里边的init,这样省去了每个Bean中都单独设置init的麻烦。default-destroy-method同理。
这里讲了目前可以通过三种方式控制Bean的生成和摧毁,他们有着这样的顺序。
1.6.2 ApplicationContextAware and BeanNameAware
ApplicationContextAware接口实现后可以在创建Bean的同时,让Bean获得容器的控制权。
BeanNameAware的作用是让Bean直到自己再容器中的名字。
1.6.3 其他Aware
1.7 Bean的继承关系
1.8 容器Container扩展的关键点
1.8.1 BeanPostProcessor
1.8.2 BeanFactoryPostProcessor
1.8.3 FactoryBean
1.9 基于注解的容器配置
在xml文件中可以通过如下方式开启注解扫描。
1.9.1 @Required
该注解用在setter方法上,是要求该属性在配置Bean的信息时必须被注入。
1.9.2 @Autowired
在JSR 330规范中可以使用@Inject代替本注解
该注解可以在构造器方法、setter方法、属性上。
还可以把同样的很多Bean放到数组里或者其他集合里。
甚至在Map容器可以。
可以使用@Order和@Priority来控制容器中Bean的顺序
默认情况下自动注入如果没有可以注入的话会报错,所以我们可以用@Autowired(required = false)实现非强制性的注入,这样没有Bean就不会报错了。
采用Java8提供的Optional特性和Spring5中提供的@Nullable注解(可为空)来表达依赖注入的非必要性。
@Autowired注解还可以标注在Spring的容器属性上。
1.9.3 @Primary
同一种类型的Bean,标注了这个那么优先用。
1.9.4 @Qualifier
该注解可以让自动装配的注解有一定优先级,或者做相关的模式匹配。
然后生成Bean的时候可以指定qualifier的value。
@Qualifier注解还可以被开发者组合或继承实现新的注解。
1.9.5 可以自动注入到泛型类中
1.9.6 CustomAutowireConfigurer
1.9.7 使用@Resource实现注入
可以标注在属性或setter方法上。
1.9.8 @PostConstruct @PreDestroy
@Resource和@PostConstruct @PreDestroy本身属于java的,但在高版本jdk中就不是了,所以使用要注意。
1.10 路径扫描和注解管理
@Component @Service @Controller @Repository @SessionScope
1.10.4 使用@ComponentScan过滤要扫描的注解
1.10.6 对自动注入的Bean实现命名
下边的例子是可以在那些注解里边添加名称,如果没有添加名称的话那么就是类首字母小写形式的命名。
可以实现BeanNameGenerator接口来实现自动装配Bean的命名规则
1.10.7 给自动注入的Bean实现提供作用域
@Scope注解可以表明Bean的作用域
可以通过实现ScopeMetadataResolver接口实现@Scope配置的解析生成一个ScopeMetadata对象。
还有底下的,同1.5.4节讲的内容
1.10.9 生成一个候选Component的坐标
虽然类路径扫描速度非常快,但可以通过在编译时创建候选的静态列表来提高大型应用程序的启动性能。在此模式下,所有作为组件扫描目标的模块都必须使用此机制。
1.11 使用JSR330标准的注解
需要导入额外的模块。
1.11.1 @Inject @Named
1.11.2 @ManagedBean
1.11.3 JSR330注解的一些限制
1.12 通过Java代码实现容器的配置
1.12.2 AnnotationConfigApplicationContext
通过一个注解配置类传入applicationcontext中,还可以把标注Configuration的类也穿进去。
1.12.3 @Bean的一些相关
@Bean可以传入别名,也可以添加@Description描述
1.12.5 Composing Java-based Configurations
使用@Import注解可以导入别的配置类
@Configuration注解可以配合@ImportResource注解使用。
1.13 环境抽象
1.13.1 Bean Definition Profiles
使用@Profile注解表明环境
然后可以组合注解
然后通过xml的方式实现上边不同环境一样的效果
激活一种环境Activating a Profile。
1.13.2 PropertySource
1.13.3 Using @PropertySource
1.14 Registering a LoadTimeWeaver
@EnableLoadTimeWeaving
1.15 ApplicationContext容器的一些额外功能
1.16 BeanFactory
2 Resources
嗯。。讲了一些怎么用ctx读取资源,没什么觉得特别重要的。
3 验证、参数绑定、类型转换
3.1 验证器
Spring提供了一个Validator接口。
它提供了两个方法,supports方法用于验证是不是对应的类,validate方法用于提供验证逻辑,并且可以把错误交给Error处理。
这里还提供了一个ValidationUtils类帮助我们做很多的验证处理。
3.3 BeanWrapper
3.3.1 settings and gettings
The way the BeanWrapper works is partly indicated by its name: it wraps a bean to perform actions on that bean, such as setting and retrieving properties.
原文中说BeanWrapper的作用如其名,包裹一个javaBean然后在其上实施操作。
下边是一个其的用例,使用它完成绑定。
3.3.2 PropertyEditor
Spring提供了很多能见类和string进行对应转换的PropertyEditor类。
举了两个例子:
ClassEditor:在spring中帮助我们将xml中的string找到对应的class。
还有在springmvc中很多的PropertyEditor将http请求转换成mvc中对应的类。
Spring中通过java.beans.PropertyEditorManager可以实现一定程度的自动注册,但是具体的类名和文件结构要按照下边的格式。
这一章节还讲了几种实现Editor和其注册的方法。
3.4 Spring Type Conversion
实现类型转换
3.4.1 Converter接口
3.4.2 ConverterFactory
3.4.3 GenericConverter
ConditionalGenericConverter接口用来实现条件converter
3.4.4-3.46 ConversionService
ConversionService的相关实现类可以起到一定的注册converter的作用。
对于要转换一些复杂类型,比如list中是Integer的到list中是String的,通过使用TypeDescriptor。
3.5 Spring Field Formatting
3.5.1 Formatter格式器
3.5.2 Annotation-driven Formatting
AnnotationFormatterFactory通过实现这个类去实现和Formatter进行相关绑定。
可以学习AnnotationFormatterFactory类,学习他如何与@NumberFormat这个注解进行绑定的。
3.5.3 FormatterRegistry格式器注册
3.5.4 FormatterRegistrar格式器注册
3.6 Configuring a Global Date and Time Format
3.7 Spring Validation
3.7.1 JSR-303 Bean Validation API
3.7.2 Configuring a Bean Validation Provider
LocalValidatorFactoryBean使用这个类,选择某一种规格的Validator。
Injecting a Validator
这里的意思应该是指定不同的Validator。
Configuring Custom Constraints
要实现Validation,要两步:1、@Constraint包含的注解。2、javax.validation.ConstraintValidator实现这个类
Spring-driven Method Validation
3.7.3 Configuring a DataBinder
4 Spring Expression Language (SpEL)
这一章节就是讲SpEL的,大概内容就是比如xml或者注解中那些用#{}表示的内容。
关键的类就是ExpressionParser及其衍生类
5 AOP
5.4 @AspectJ support
5.4.1. Enabling @AspectJ Support
通过两种开始开启aop。
5.4.2. Declaring an Aspect声明切面
5.4.3. Declaring a Pointcut 声明切点
作为切点的方法必须是void类型的
切点里边声明的关键字有以下这些。
Combining Pointcut Expressions
这里有几个简单的切点的例子。
Examples
这一小节有很多的例子,可以看看如何使用。
Writing Good Pointcuts
5.4.4. Declaring Advice声明通知
5.4.5 Introductions-@DeclareParents
这里主要讲了@DeclareParents这个注解,能在不改动原类代码的情况下额外添加方法,其实是通过实现另一个接口来实现的。
这里最重要的就是用mvn导入spring-aop的时候,它包含的aspectj是不全的,要使用@DeclareParents类,需要aspectj框架的jrt,tools和weaver,aop只包含了最后一个。很多教材都没说这一点,在网上看了看估计是spring版本的问题,老的版本估计aop把包都包含了,反正在现在5.1.5的版本要自己额外引入。
5.4.6. Aspect Instantiation Models
可以指定切面的实例化方式,perthis和pertarget
5.5. Schema-based AOP Support 基于xml的AOP
5.6 Choosing which AOP Declaration Style to Use
选择spring-aop还是aspectj的问题。
选择xml风格还是@Aspect注解实现aop的问题。
5.8. Proxying Mechanisms
这里介绍了何时使用jdk动态代理和cglib。可以通过如下设置强制设置使用cglib
5.8.1 Understanding AOP Proxies
大概讲了一堆,看了一下貌似是说自调用是不会触发aop的。(就是比如要切的类含有两个方法,一个方法里边调用了另一个,这样是不会触发aop的)。
5.9. Programmatic Creation of @AspectJ Proxies用程序设置aop
可以看到下边的是使用AspectJProxyFactory工厂,传入目标类、(多个)切面,最终获取到代理对象后在执行。
5.10. Using AspectJ with Spring Applications直接使用aspectj框架
在本节中,我们将介绍如何使用AspectJ编译器或weaver代替Spring AOP或者除了Spring AOP之外,如果您的需求超出了Spring AOP提供的功能。
@Configurable注解,这章主要讲的。
6. Spring AOP APIs
没什么用这章。
前一章描述了Spring使用@AspectJ和基于模式的方面定义对AOP的支持。在本章中,我们将讨论较低级别的Spring AOP API以及Spring 1.2应用程序中常用的AOP支持。对于新应用程序,我们建议使用前一章中描述的Spring 2.0及更高版本的AOP支持。但是,当您使用现有应用程序时(或者当您阅读书籍和文章时),您可能会遇到Spring 1.2风格的示例。 Spring 5仍然向后兼容Spring 1.2,本章中描述的所有内容在Spring 5中都得到了完全支持。
7. Null-safety
9 spring xml文件的格式
这章就是讲了spring的xml文件应该怎么搞。
疑惑
@EnableLoadTimeWeaving 注解或<context:load-time-weaver/>配置
讲了织入可以分为:编译器、类加载期、运行期(动态代理和cglib属于这个)
Ltw属于类加载期。
第二个url的例子自己跑了一遍,也结合第一个url的例子的说明,ltw可以起到这么一个作用:
同一份代码、同一份配置,只需要在VM启动参数中稍加变化,即可实现同一个应用包在不同环境下可以自由选择使用使用AOP功能。https://sexycoding.iteye.com/blog/1062372
https://www.cnblogs.com/takumicx/p/10150344.html