Spring框架学习
Posted mosakashaka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架学习相关的知识,希望对你有一定的参考价值。
Spring框架包含很多内容,需要了解spinrg cloud就要看spring boot,而spring boot又要看Spring Core(Spring Framework)
的基本介绍。
花了两天左右,断断续续看了spring core相关的教程,包括
- java2blog:看的一个回答推荐的,不过内容可能略有陈旧,倒不是体现在版本,而是页面之间跳转有问题,层次有点不清,感觉是疏于维护的样子
- tutorialspoing,没有细看,因为想找一个稍微系统一点的,而在这里,似乎是只有spring的
- 官方文档,以详细程度来说的确无出其右,但是有官方文档的通病,涉及各种细节,初学很容易陷进去,我初步浏览了一下bean和resource部分。里面会涉及不少我不了解的东西,因为本身对java也不太熟,所以不知道是java还是spring的内容。而有些内容的确是前后颠倒了,比如
java annotation
相关的一些,在开始的时候看到会感觉一头雾水。 - howtodoinjava,这个看的比较多,是个人作者写的,比较通俗易懂,也没有涉及太多细节。
Spring学习内容
初步了解Spring以后,个人理解Spring的功能就是做依赖注入(从我目前了解的Spring Core
的角度来说,Spring Boot
等还没学习)。Spring Framework的各种功能,围绕如何配置依赖注入展开。
关于Bean
Bean是Spring操作的基本单位,Bean可以被注入依赖,也可以作为依赖被注入到其他的Bean中。
那么什么是Bean,任何Class可以通过XMl配置,或者注解annotation
的方式被识别为Bean。
一个类/对象,从Bean的角度,他还有类的类型,Bean的名字、别名等相关信息,通过这些信息,可以以各式各样的手段,设置需要被注入的Bean。
框架基础
Bean的信息被加载到ApplicationContext
中,或者说ApplicationContext
维护一系列Bean的关系,在需要的时候生成Bean,在需要的地方使用适当的Bean注入,并且对Bean的生命周期可以进行一系列定制化操作。
怎么维护bean的信息
- 通过xml文件定义bean,以及bean中的属性依赖的bean/或者字面值
- 通过@Autowired等注解,标注一个类的某个字段、或者构造函数需要自动注入依赖。
- 通过@Component等标识标明一个类为Spring的组件,通过ApplicationContext的组件扫描方法,将所有扫描到的组件加入到框架维护的bean中。
如何生成需要的bean
默认spring的容器在初始化时就会创建所有的bean,bean是单例模式的,除非特别的指明其他的scope
(如prototype)。
所以当其他地方需要某个bean时,初始化时创建的bean 就会被提供出来。
什么是需要的地方?
首先spring的依赖注入,都是基于bean的基础上进行的。
需要的地方可以是一个bean的:
- 构造函数
- 类成员(可以是Private)
- getter/setter
通过XML配置,或者@Autowired/@Inject等注解方式,标识这个地方的参数需要依赖注入
需要的地方所谓的合适的bean是什么?
一般是通过名字注入。
比如一个bean注册时,名字叫CapitalA
的Capital类,另一个bean需要一个名称为CapitalA
的bean,就可以通过
@Autowired
@Qualifier("CapitalA")
private Capital capital;
来配置注入。
当然可以有更简单的方式,比如整个程序里,只有一个Capital类型的bean,那么省略bean的名字,Spring也可以按类型定位到所需要的bean。
另外还可以通过字段的名字来寻找,是第三优先级的查找。
维护生命周期
bean的生命周期,有初始化前,初始化中,初始化后,销毁等。
bean的初始化中和销毁前的这两个情况,可以通过如下方式定义
- XML配置
init-method
,destroy-method
- 注解
@PostConstruct
和PreDestroy
- 实现特定相应接口,并实现对应的回调方法,spring框架会进行调用
bean的初始化前和初始化后可以通过BeanPostProcessor
接口的各个实现类来注册,spring会识别接口的实现,自动在每个(或者指定的)bean的两个阶段调用接口方法。
各种-Aware接口
这个其实类似生命周期的概念,bean可能需要引用spring这个容器类(ApplicationContext本身,或者他实现的一些其他接口),获取一些特定的不是配置生成的bean,或者获取资源文件等。
这时候通过实现各种-Aware接口的方法,spring会在创建bean的初始化过程中,注入这个bean需要的容器相关的类。
关于注解
除了spring自带的,还有JSR-250JSR-330等规范定义的注解。
首先注解也都是为了实现依赖注入相关功能的,不过比较一开始令我疑惑的是@Component/@Service/@Repository/@Controller。
这里说的我觉得比较清楚,这些注解其实都是扩展的Bean类,都能被组件扫描到,使用不同的注解,Spring在处理过程中会稍有不同,比如Repository会特殊处理其中抛出的异常以匹配数据库异常。
另外这些注解多用于语义表述,清楚的标明每个类的层次,相比而言@Component没有确切业务层次含义。
以上是关于Spring框架学习的主要内容,如果未能解决你的问题,请参考以下文章
Spring+SpringMVC+MyBatis+Maven框架整合