此文为Spring Framework 5.1.5版本Core部分的用户手册的学习。对部份内容进行了翻译摘取和学习理解,为了方便本身的在使用中具体细节处的回顾,建议配合原用户手册一块儿观看。用户手册的地址为html
https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/java
目 录web
1 IOC容器... 3spring
1.1 简介IOC容器和Beans. 3api
1.2 容器概览... 3数组
1.2.1 配置信息... 3mvc
1.2.2 初始化一个容器... 3app
1.3 Bean概览... 4框架
1.3.1 Bean命名... 5ide
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
单机模式最多见的ClassPathXmlApplicationContext
or FileSystemXmlApplicationContext
除了xml以外,还有两种方式,第一种是在xml文件里添加<context:annotation-config/>,开启自动配置;第二种是经过一些注解。
能够一次读取多个xml。
还能够在xml文件的beans标签内经过import引入其余xml文件。
Bean在容器中存储是以BeanDefinition的形式存在的。
下边的是Bean的一些属性
而后还能够调用getBeanFactory方法以后得到一个BeanFactory对象,而后再注册不在容器中的Bean。
Bean里边的id属性和name属性是不一样的。
Id传惟一id,name能够传别名,可用经过逗号和分号分隔好多别名
Xml里边还能够传入alias标签,提供额外的别名。这样就能够经过后边的别名访问Bean
经过class指定要生成什么类,还能够经过如下两种方法生成,后边会有。
若是想要一个内部类的话,那么要使用二进制方法。下边加了个$号
经过静态工厂方法实例化Bean
这个例子不太好,其实应该是一个工厂类里边生成一个实例,ServiceFactory里边生成一个service比较好。注意,这个里边的class并非返回对象的类型,这个xml中甚至都没有返回的类型。
经过实例工厂实例化Bean,工厂须要实例,因此先建立一个工厂,而后Bean再跟工厂创建联系。固然一个工厂里边能够产出好多不一样的对象,这里就不在截图了。
经过构造器方法实现依赖注入,下边那种index起始值是0.
注解@ConstructorProperties能够标注在构造器方法上
选择构造器注入仍是setter注入呢?强制的参数用构造器,可选的参数用setter。
依赖解析的过程
使用构造器注入可能会有循环依赖的问题。那么就改造下,用setter注入吧。
静态工厂中也能够经过构造器注入的方式生成Bean,看下边的。
可使用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赋值,要保证路径上的属性都不为空。
Bean之间有依赖关系,就是让一些要被注入到别的Bean的Bean,做为属性的Bean要提早完成实例化。
若是Bean被设置为延迟初始化的话,可是另外一个非延迟的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中。
看官方文档没看懂,网上搜了下,这个就是能够将抽象方法经过方法注入的方式变得可使用。见下边的两个网址好了。Look-up method 和replace-method。还有@Lookup注解。
http://www.javashuo.com/article/p-crqinxfm-co.html
https://www.cnblogs.com/atwanli/articles/6154920.html
这里关于web那块的说明能够到时候结合用户手册再看看。
关于把一个短生命周期的Bean注入到一个长声明周期的Bean中,能够在Bean中添加<aop:scoped-proxy/>。缘由能够见下边的博文。
https://blog.csdn.net/soonfly/article/details/69360680
这里就是定义容器Container和Bean在整个生命周期里边干什么,经过实现不一样的接口来实现每个环节的处理。
这里先是将能够在Bean中的属性设置init-method 和destroy-method标签,没什么好主意的。有一点,能够在Beans属性中配置default-init-method,来自动识别每一个Bean里边的init,这样省去了每一个Bean中都单独设置init的麻烦。default-destroy-method同理。
这里讲了目前能够经过三种方式控制Bean的生成和摧毁,他们有着这样的顺序。
ApplicationContextAware接口实现后能够在建立Bean的同时,让Bean得到容器的控制权。
BeanNameAware的做用是让Bean直到本身再容器中的名字。
在xml文件中能够经过以下方式开启注解扫描。
该注解用在setter方法上,是要求该属性在配置Bean的信息时必须被注入。
在JSR 330规范中可使用@Inject代替本注解
该注解能够在构造器方法、setter方法、属性上。
还能够把一样的不少Bean放到数组里或者其余集合里。
甚至在Map容器能够。
可使用@Order和@Priority来控制容器中Bean的顺序
默认状况下自动注入若是没有能够注入的话会报错,因此咱们能够用@Autowired(required = false)实现非强制性的注入,这样没有Bean就不会报错了。
采用Java8提供的Optional特性和Spring5中提供的@Nullable注解(可为空)来表达依赖注入的非必要性。
@Autowired注解还能够标注在Spring的容器属性上。
同一种类型的Bean,标注了这个那么优先用。
该注解可让自动装配的注解有必定优先级,或者作相关的模式匹配。
而后生成Bean的时候能够指定qualifier的value。
@Qualifier注解还能够被开发者组合或继承实现新的注解。
能够标注在属性或setter方法上。
@Resource和@PostConstruct @PreDestroy自己属于java的,但在高版本jdk中就不是了,因此使用要注意。
@Component @Service @Controller @Repository @SessionScope
下边的例子是能够在那些注解里边添加名称,若是没有添加名称的话那么就是类首字母小写形式的命名。
能够实现BeanNameGenerator接口来实现自动装配Bean的命名规则
@Scope注解能够代表Bean的做用域
能够经过实现ScopeMetadataResolver接口实现@Scope配置的解析生成一个ScopeMetadata对象。
还有底下的,同1.5.4节讲的内容
虽然类路径扫描速度很是快,但能够经过在编译时建立候选的静态列表来提升大型应用程序的启动性能。在此模式下,全部做为组件扫描目标的模块都必须使用此机制。
须要导入额外的模块。
经过一个注解配置类传入applicationcontext中,还能够把标注Configuration的类也穿进去。
@Bean能够传入别名,也能够添加@Description描述
使用@Import注解能够导入别的配置类
@Configuration注解能够配合@ImportResource注解使用。
使用@Profile注解代表环境
而后能够组合注解
而后经过xml的方式实现上边不一样环境同样的效果
激活一种环境Activating a Profile。
@EnableLoadTimeWeaving
嗯。。讲了一些怎么用ctx读取资源,没什么以为特别重要的。
Spring提供了一个Validator接口。
它提供了两个方法,supports方法用于验证是否是对应的类,validate方法用于提供验证逻辑,而且能够把错误交给Error处理。
这里还提供了一个ValidationUtils类帮助咱们作不少的验证处理。
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而后在其上实施操做。
下边是一个其的用例,使用它完成绑定。
Spring提供了不少能见类和string进行对应转换的PropertyEditor类。
举了两个例子:
ClassEditor:在spring中帮助咱们将xml中的string找到对应的class。
还有在springmvc中不少的PropertyEditor将http请求转换成mvc中对应的类。
Spring中经过java.beans.PropertyEditorManager能够实现必定程度的自动注册,可是具体的类名和文件结构要按照下边的格式。
这一章节还讲了几种实现Editor和其注册的方法。
实现类型转换
ConditionalGenericConverter接口用来实现条件converter
ConversionService的相关实现类能够起到必定的注册converter的做用。
对于要转换一些复杂类型,好比list中是Integer的到list中是String的,经过使用TypeDescriptor。
AnnotationFormatterFactory经过实现这个类去实现和Formatter进行相关绑定。
能够学习AnnotationFormatterFactory类,学习他如何与@NumberFormat这个注解进行绑定的。
LocalValidatorFactoryBean使用这个类,选择某一种规格的Validator。
这里的意思应该是指定不一样的Validator。
要实现Validation,要两步:一、@Constraint包含的注解。二、javax.validation.ConstraintValidator实现这个类
这一章节就是讲SpEL的,大概内容就是好比xml或者注解中那些用#{}表示的内容。
关键的类就是ExpressionParser及其衍生类
经过两种开始开启aop。
做为切点的方法必须是void类型的
切点里边声明的关键字有如下这些。
这里有几个简单的切点的例子。
这一小节有不少的例子,能够看看如何使用。
这里主要讲了@DeclareParents这个注解,能在不改动原类代码的状况下额外添加方法,实际上是经过实现另外一个接口来实现的。
这里最重要的就是用mvn导入spring-aop的时候,它包含的aspectj是不全的,要使用@DeclareParents类,须要aspectj框架的jrt,tools和weaver,aop只包含了最后一个。不少教材都没说这一点,在网上看了看估计是spring版本的问题,老的版本估计aop把包都包含了,反正在如今5.1.5的版本要本身额外引入。
能够指定切面的实例化方式,perthis和pertarget
选择spring-aop仍是aspectj的问题。
选择xml风格仍是@Aspect注解实现aop的问题。
这里介绍了什么时候使用jdk动态代理和cglib。能够经过以下设置强制设置使用cglib
大概讲了一堆,看了一下貌似是说自调用是不会触发aop的。(就是好比要切的类含有两个方法,一个方法里边调用了另外一个,这样是不会触发aop的)。
能够看到下边的是使用AspectJProxyFactory工厂,传入目标类、(多个)切面,最终获取到代理对象后在执行。
在本节中,咱们将介绍如何使用AspectJ编译器或weaver代替Spring AOP或者除了Spring AOP以外,若是您的需求超出了Spring AOP提供的功能。
@Configurable注解,这章主要讲的。
没什么用这章。
前一章描述了Spring使用@AspectJ和基于模式的方面定义对AOP的支持。在本章中,咱们将讨论较低级别的Spring AOP API以及Spring 1.2应用程序中经常使用的AOP支持。对于新应用程序,咱们建议使用前一章中描述的Spring 2.0及更高版本的AOP支持。可是,当您使用现有应用程序时(或者当您阅读书籍和文章时),您可能会遇到Spring 1.2风格的示例。 Spring 5仍然向后兼容Spring 1.2,本章中描述的全部内容在Spring 5中都获得了彻底支持。
这章就是讲了spring的xml文件应该怎么搞。
@EnableLoadTimeWeaving 注解或<context:load-time-weaver/>配置
讲了织入能够分为:编译器、类加载期、运行期(动态代理和cglib属于这个)
Ltw属于类加载期。
第二个url的例子本身跑了一遍,也结合第一个url的例子的说明,ltw能够起到这么一个做用:
同一份代码、同一份配置,只须要在VM启动参数中稍加变化,便可实现同一个应用包在不一样环境下能够自由选择使用使用AOP功能。https://sexycoding.iteye.com/blog/1062372
http://www.javashuo.com/article/p-edorvjyy-cd.html