Spring学习:Spring中的Bean
Bean的实例化方法
- 构造器实例化(最常用)
- 静态工厂方式实例化
- 实例工厂方式实例化
Bean的作用域
- singleton(单例):始终使用的同一个对象 (默认)
- prototype(原型):,每次都是一个新的Bean实例
- request
- session
- globalSession
- application
- Websocket
Bean的生命周期
- init-method属性
用于指定Bean类中的初始化方法的名称,该方法会在Bean实例创建之后被执行
【相当于Servlet的init()方法】 - destroy-method属性
用于指定Bean类中的销毁方法的名称,该方法会在Ioc容器关闭时,Bean实例销毁之前被执行
【相当于Servlet的destroy()方法】
【注意】必须设置 scope=“singleton”,销毁方法才能生效
Bean的装配方式(默认单例)(重点)
- 基于XML的装配
- 设值注入
满足条件:1.Bean必须有一个无参构造方法2.必须提供setter方法
使用 为属性注入值
- 构造注入
满足条件:Bean必须提供有参构造方法
使用来为参数注入值 - 基于注解(Annotation)的装配 (最常用)
- 自动装配
注解自动注入
添加注解自动扫描包<context:component-scan base-package="包名"/>
@Controller …
作用域注解:@Scope(value=“singleton|prototype”)
初始化方法注解:@PostConstruct
销毁方法注解:@PreDestory
简单类型的参数:@Value<无需提供set方法>
引用类型的参数:@AutoWired 通过类型 可以与@Qualifer注解搭配 按照名称匹配
@Resource 默认按照名称,也可以按照类型
集合数据类型无法使用注解注入,只能通过XML配置实现
注意
Bean标签的id属性和name属性的区别
id和name都可以取出bean,但是id属性用来唯一标识bean,id的属性值不可重复
name的属性值可以有多个,用逗号隔开,并可能和其他bean重名
ApplicationContext和BeanFactory的区别
- 使用ApplicationContext子接口创建Spring IOC容器时,Bean对象使用立即加载方式,创建IOC容器的同时创建Bean对象
- 使用BeanFactory根接口创建Spring IOC容器时,Bean对象使用延迟加载方式,只有真正调用getBean()方法时,才真正创建Bean对象
IOC容器创建Bean实例的执行流程 重点
-
创建IoC容器时,解析配置文件,获取每一个标签的class属性(Bean的完整类名),通过反射调用Class.forName(“完整类名”).newInstance()方法创建Bean对象(调用无参的构造方法),并将标签的id属性作为key,对象作为value,保存在IoC容器内部的一个Map中
-
调用getBean()方法时,IoC容器根据方法中指定的Bean的id属性值,查找Map中是否存在对应的key,如果存在,则直接将此key对应的Bean对象返回