2.Spring的Bean生命周期和组装方式
1.Spring IoC容器概述
Spring IoC容器:
Spring容器即体现了IoC原理
Spring容器通过读取配置元数据负责对Beans实例化、配置和装配
配置元数据可以用XML、Java注解或Java代码来描述
org.springframework.beans和org.springframework.context包是Spring框架IoC容器的基础
BeanFactory:
BeanFactory提供了一个先进的配置机制能够管理任何类型的对象
BeanFactory负责对Bean对象的实例化、装配和生命周期的管理
BeanFactory的实现:
XmlBeanFactory
创建该工厂需要传入一个Resource实例,例如ClassPathResource或者FileSystemResource等
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
从BeanFactory获取Bean实例
MyBean bean = (MyBean)factory.getBean("myBean")
ApplicationContext:
ApplicationContext是BeanFactory的一个子接口
ApplicationContext添加了更多的企业特定的功能:
例如增加了更方便的集成Spring的AOP功能
消息资源处理(用于国际化)
事件的发布
ApplicationContext的实现:
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext
AnnotationConfigApplicationContext
两者区别:
BeanFactory提供了配置框架和基本功能,ApplicationContext则添加了更多的企业特定功能
ApplicationContext是BeanFactory的一个子接口,同时也是它的一个完整的超集
实例Bean的载入方式不同:
BeanFactory延迟载入所有Bean,直到getBean()方法调用时才被创建
ApplicationContext启动后载入所有单实例Bean。通过预载入单实例Bean,确保当需要时可以使用。
Spring IoC容器:
Spring IoC容器的使用:
配置元数据
基于Xml的配置
基于Annotation的配置
基于Java的配置
实例化容器
使用容器
2.Bean的概述
Bean概念;
一个Spring IoC容器管理了一个或者多个beans
这些beans通过你提供给容器的配置元数据进行创建
Bean的实例化:
通过构造方法实例化
使用静态工厂方法实例化
使用实例工厂方法实例化
实例化Bean:
1.通过构造方法实例化:
当使用基于XML的元数据配置文件,可以这样来指定bean类:
2.使用静态工厂方法实例化:
当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法
注意,此定义并未指定返回对象的类型,仅指定该类包含的工厂方法,此例中createInstance方法必须是静态的。
3.使用实例工厂方法实例化:
使用实例工厂方法实例化:
使用这种方式时,class属性必须为空,而factory-bean属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称
bean的工厂方法必须通过factory-method属性来设定
Bean的声明周期:
Bean作用域:
注意事项:
单例作用域是针对一个Spring容器一个实例,并且是Spring中Bean的默认作用域
Spring不会管理原型作用域的完整生命周期,他只负责初始化、 配置,亦或者组装原型域的Bean对象,但是不会调用Bean的销毁方法。
Bean的生命周期:
步 骤 |
说 明 |
1.实例化 |
Spring实例化Bean |
2.设置属性 |
Spring注入Bean的属性 |
3.设置Bean名称,Bean工厂,应用上下文 |
如果Bean实现了XXXAware接口,执行对应方法 |
4.预处理(在初始化之前) |
调用BeanPostProcessor对象的postProcessBeforeInitialization()方法 |
5.初始化Bean |
实现InitializingBean接口的afterPropertiesSet()方法 声明了初始化方法,将调用声明的 |
6.预处理(在初始化之后) |
调用BeanPostProcessor对象的postProcessAfterInitialization()方法 |
7.Bean已经准备好 |
默认以单例的形式存在Spring容器中 |
8.销毁Bean |
实现DisposableBean接口的destroy()方法 声明了销毁方法,将调用声明的 |
实现*Aware接口:
有些时候我们需要在Bean的初始化中使用Spring框架自身的一些对象来执行一些操作,比如:
获取ServletContext的一些参数
获取ApplicaitionContext中的BeanDefinition的名字
获取Bean在容器中的名字等等
Spring提供了一组名为*Aware的接口,例如:
BeanNameAware:获得Bean在配置文件中定义的名字
BeanFactoryAware:获得BeanFactory对象,可用来检测Bean的作用域
ApplicationContextAware: 获得ApplicationContext对象,可以用来获取所有Bean definition的名字
ResourceLoaderAware:获得ResourceLoader对象,可以获得classpath中某个文件
ServletContextAware:在一个MVC应用中可以获取ServletContext对象,可以读取context中的参数
ServletConfigAware在一个MVC应用中可以获取ServletConfig对象,可以读取config中的参数
initialization和destroy:
有时我们需要在Bean属性设置好后和Bean销毁前做些事情,Spring提供了多种方法在Spring的Bean的生命周期中执行初始化和销毁
实现InitializingBean和DisposableBean接口
在bean的配置文件中制定init-method和destroy-method方法
使用@PostConstruct和@PreDestroy注解
实现InitializingBean和DisposableBean接口
该方法简单,但不推荐,因为会将Bean的实现和Spring框架耦合在一起
在bean的配置文件中制定init-method和destroy-method方法
3.Bean的依赖注入的
依赖注入指对象之间的依赖关系
Spring容器的工作就是创建Bean并注入他所依赖的Bean对象
Spring中的注入方式主要有2种:构造器注入和Setter方法注入
构造器注入:
基于构造器注入DI通过调用带参数的构造器来实现,每个参数代表着一个依赖关系
构造器参数通过参数类型进行匹配
我们还可以使用type属性指定构造参数的类型
我们还可以使用index属性指定构造参数的索引
我们还可以使用name属性制定构造参数的名字
Setter注入
基本Bean注入
注入基本数据类型
<property name="xxx" value="xxx" />
可注入:
字符串
数值型数据
布尔类型
Spring根据字段属性来决定转换成正确的类型
注入Null
<property name="xxx"><null /></property>
注入引用数据类型
引用
<property name="xxx" ref="xxxBean" />
<property name="xxx"> <ref bean="xxxBean" /></property>
注入内部Bean
<property name="xxx"> <bean class="org.xxx.XxxBean" /></property>
内部Bean不能复用,只能被注入
注入List类型和数组类型
对应的Java类型是:List和Array
<property name=“xxx”> <list> <ref bean=“aa” /> <ref bean=“bb” /> <value>aaa</value> <value>bbb</value> </list></property>
注入List类型和数组类型
对应的Java类型是:List和Array
<property name=“xxx”> <list> <ref bean=“aa” /> <ref bean=“bb” /> <value>aaa</value> <value>bbb</value> </list></property>
注入Set类型
对应的Java类型是:Set
<property name=“xxx”> <set> <ref bean =“aa” /> <ref bean =“bb” /> </set></property>
<set>保证其中每个元素都是唯一的
注入Map类型
对应的Java类型是:Map
<property name=“xxx”> <map> <entry key=“a” value-ref=“aa” /> <entry key=“b” value-ref=“bb” /> </map></property>
每个<entry>都有一个键和值组成
key: 指定map项的键为String
key-ref: 指定map项的键为Spring上下文中其他Bean的引用
value: 指定map项的值为String
value-ref: 指定map项的值为Spring上下文中其他Bean的引用
注入Properties类型
对应的Java类型是:Properties
<property name=“xxx”> <props> <prop key=“a”>aaa</prop> <prop key=“b”>bbb</prop> </props></property>
与Map唯一不同的是其限制了键和值都是String
集合合并:
对于相同类型的集合,
通过在子类中的merge属性,
可以将集合合并。
高级Bean注入:
Spring容器可以自动装配相互协作bean的关联关系
自动装配有以下好处:
自动装配可以显著得减少指定属性或者构造器参数的需求
当对象发生变化时自动装配可以更新配置而不需要修改配置
自动装配的局限性和缺点:
Property和constructor-arg显示的依赖设置会覆盖自动装配(故意而为)
自动装配没有显示编写精确
在容器中可能存在多个bean的定义与自动装配的setter方法或者构造方法参数匹配,若bean定义不唯一,装配时会抛异常
模板装配(声明父类Bean和子类Bean)
指定Bean的abstract="true"
表示<bean>声明是抽象的,不能被Spring实例化
通常也用来表示一个“模板”<bean>,用来抽象一些共同的属性
指定parent属性
<bean id="aa" parent="xxxBean" />
可以继承父Bean的属性,也会继承它的类
使用外部属性文件:
可以使用location属性处理单个属性文件
<property name="location" value="jdbc.properties"/>
处理多个属性文件用locations属性指定list
<property name="locations"> <list> <value>aa.properties</value> <value>bb.properties</value> </list></property>
使用${xxx.bbb}来获取值
可以覆盖继承的属性
2.Spring的Bean生命周期和组装方式的更多相关文章
- Spring中Bean生命周期
Spring中的bean生命周期是一个重要的点,只有理解Bean的生命周期,在开发中会对你理解代码是非常有用的.对于Bean的周期,个人认为可以分为四个阶段.第一阶段:Bean的实例化,在该阶段主要是 ...
- Spring:Bean生命周期
关于Bean生命周期,我在网上找了两张图: 图1: 图2: 总结起来就是: Bean构建: Bean对象创建 > @Autowired | @Resource> @PostConstruc ...
- Spring的Bean生命周期理解
首先,在经历过很多次的面试之后,一直不能很好的叙述关于springbean的生命周期这个概念.今日对于springBean的生命周期进行一个总结. 一.springBean的生命周期: 如下图所示: ...
- Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析
在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...
- spring学习笔记(四)我对spring中bean生命周期的理解
我相信大部分同学对spring中bean的生命周期都不陌生,但是如果要详细的说出每一个步骤,可能能说出来的也不多,我之前也是这样,前几天调了一下spring的源码,看了一点书,突然一下明朗了,理解了s ...
- spring注解-bean生命周期
https://www.jianshu.com/p/70b935f2b3fe bean的生命周期 bean创建---初始化----销毁的过程 容器管理bean的生命周期 对象创建:容器启动后调用bea ...
- Spring配置文件-Bean生命周期配置(init-method方法,destory-method方法)
1.UserDaoImpl类 public class UserDaoImpl implements UserDao { public UserDaoImpl(){ System.out.printl ...
- [转]Spring 之 Bean 生命周期
Spring 容器中可以注册多个后处理器,只要它们同时实现 org.springframework.core.Ordered 接口. 下载文件 :内容来自 <精通Spring+4.x++企业应用 ...
- Spring源码系列 — Bean生命周期
前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...
随机推荐
- 在Ubuntu里启用root账号
我的系统环境, 操作系统:Win7 虚拟机软件:VMware workstation 12 在虚拟机里安装了Ubuntu 18,安装时的账号frank,在安装其它软件的时候,报权限不足,因此,准备启用 ...
- 在PyCharm 软件中设置你的项目 使用的Python版本
在PyCharm 软件中设置你的项目 使用的Python版本 python2 和 python3 有很大的不同,使用python2 编写的程序,如果使用python3 就运行不了:使用python3编 ...
- ROS Learning-010 beginner_Tutorials 编写简单的启动脚本文件(.launch 文件)
ROS Indigo beginner_Tutorials-09 编写简单的启动脚本文件 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...
- EZOJ #80
传送门 分析 经典的树型DP 我们记录dp[i][0/1]表示i的子树中到i的长度分别为偶数和奇数的长度和 dp2[i][0/1]则表示不在i的子树中的点到i的长度分别为偶数和奇数的长度和 然后根据边 ...
- 100723H Obfuscation
传送门 题目大意 给你一个包含n 个单词的字典,给你一篇文章,文章包括若干词典里的单词,把句子里的空格都去掉,单词的首位字母都不变,中间的字符集为乱序,问能否恢复这篇文章,使得单词都是词典里的单词,如 ...
- js/jq基础(日常整理记录)-3-一个自定义表格
一.一个自定义的表格 这个js是我刚工作的时候,我们老大让我做一个功能,我觉得html自带的table功能单一,没有分页和排序功能,所有就尝试着做一下,所以这个东西就出来了.很久没写博客了,贴出来吧, ...
- Required plugin could not be found. Videos requires to install plugins to play files of the following types : MPEG-4-AAC decoder and H.264 decoder
https://linuxconfig.org/how-to-install-mpeg-4-aac-decoder-for-centos-7-linux 记得联网情况下才能下载.
- delphi xe6 android ListView增加 Header或Footer 的方法
var Item1: TListViewItem;begin Item1 := ListView1.Items.Add; Item1.Purpose:=TListItemPurpose. ...
- 转载-ActiveMQ通过JAAS实现的安全机制
JAAS(Java Authentication and Authorization Service)也就是java认证/授权服务.这是两种不同的服务,下面对其做一些区别:验证(Authenticat ...
- 以证书的方式登录ssh
常常要登录多台Linux服务器,过去在Windows下使用SecureCRT,比较省心,配置还可以放到云盘,实时同步.现在改用MAC貌似就没有那么好用的东西了,每次ssh命令登录都需要输入密码,很烦. ...