Bean的三种管理方式
<!--spring ioc 实例化bean的三种方式-->
<!--方式一:无参构造方式(推荐)
在默认情况下,它会通过反射调用无参构造函数来创建对象。如果类中没有无参构造函数,将创建 失败。
-->
<!--<bean id="connectionUtils" class="com.wjy.utils.ConnectionUtils"/>-->
<!--另外两种方式,是为了将我们自己new的bean加入ioc容器管理-->
<!--方式二:静态方法-->
<!--<bean id="connectionUtils" class="com.wjy.factory.CreateBeanFactory" factory-method="getStaticConnectionUtils"/>-->
<!--方式三:实例化方法
此种方式和上面静态方法创建其实类似,区别是用于获取对象的方法不再是static修饰的了,而是 类中的一 个普通方法。
-->
<bean id="createFactory" class="com.wjy.factory.CreateBeanFactory"/>
<bean id="connectionUtils" factory-bean="createFactory" factory-method="getConnectionUtils"/>
public class CreateBeanFactory {
public static ConnectionUtils getStaticConnectionUtils() {
return new ConnectionUtils();
}
public ConnectionUtils getConnectionUtils() {
return new ConnectionUtils();
}
}
Bean标签属性
在基于xml的IoC配置中,bean标签是最基础的标签。它表示了IoC容器中的一个对象。
- id属性: 用于给bean提供一个唯一标识。在一个标签内部,标识必须唯一。
- class属性: 用于指定创建Bean对象的全限定类名。
- name属性: 用于给bean提供一个或多个名称。多个名称用空格分隔。
- factory-bean属性: 用于指定创建当前bean对象的工厂bean的唯一标识。当指定了此属性之后, class属性失效。
- factory-method属性: 用于指定创建当前bean对象的工厂方法,如配合factory-bean属性使用, 则class属性失效。如配合class属性使用,则方法必须是static的。
- init-method属性: 用于指定bean对象的初始化方法,此方法会在bean对象装配后调用。必须是 一个无参方法。
- destory-method属性: 用于指定bean对象的销毁方法,此方法会在bean对象销毁前执行。它只 能为scope是singleton时起作用。
- scope属性: 用于指定bean对象的作用范围。通常情况下就是singleton。当要用到多例模式时, 可以配置为prototype。
Scope | 描述 |
---|---|
singleton | (默认)单例模式:一个IOC容器中只有一个实例 |
prototype | 多例模式/原型模式,每次从IOC容器中获取,都创建新的实例 |
request | 一个HTTP Request ,创建一个实例 |
session | 一个HTTP Session ,创建一个实例 |
application | 一个ServletContext ,创建一个实例 |
websocket | 一个WebSocket ,创建一个实例 |
单例模式:singleton
对象出生:当创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当销毁容器时,对象就被销毁了。
一句话总结:单例模式的bean对象生命周期与容器相同。
多例模式:prototype
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象⻓时间不用时,被java的垃圾回收器回收了。
一句话总结:多例模式的bean对象,spring框架只负责创建,不负责销毁。
DI配置
Spring依赖注入的分类
- 按照注入方式分类:
- 构造函数注入: 需要被管理的类提供有参构造函数注入数据
<constructor-arg/>
- set方法注入: 需要被管理类提供属性的set方法;
<property/>
- 构造函数注入: 需要被管理的类提供有参构造函数注入数据
- 按照注入数据类型分类:
- 基本类型&