spring-bean 的理解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="bean1" class="com.Bean1" />
<bean id="bean2" class="com.Bean2" />
</bean>
id:用来指明 bean 的标识符,这个标识符具有唯一性,Spring 对 bean 的管理以及 bean 之间这种依赖关系都需要这个属性
class: 指明该 bean 的具体实现类,这里不能是接口(可以是接口实现类)全路径包名.类名
Bean 在 Spring 容器中两种行为(通过 scope 来设置默认不写为 singelton)
singleton:单实例模式(默认,构造方法为 private),整个 Spring 的容器中只有一个共享实例存在(singleton)
non-singelton:每次请求该 bean,Spring 容器都会新建立一个 bean 实例,然后返回给程序(request,session,prototype)
创建 Bean 步骤
创建 XML 文件—-写入配置信息—生成 Bean 类—-加入 Bean 到配置文件
注入 Bean
-ref 元素进行标识
Ref 元素通常有两个属性:
bean:指定不在同一个 XML 文件中的 bean 的 id
<bean id="test" class="com.pb.test">
<property name="user">
<ref bean="其他的 bean 的 id"/>
</property>
</bean>
</bean>
value 和 ref 的区别:
使用 ref 元素,可以让 Spring 在部署时验证依赖的 Bean 是否真实存在
使用 value 元素,进行指定仅在创建 Bean 实例时做验证,会导致错误的延时出现,而且还会带来额外的类型转制开销
集合注入(了解 list,map, props,set)
<bean id="test" class="com.pb.test">
<property name="lists">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
</bean>
<bean id="test" class="com.pb.test">
<property name="map">
<map>
<entry key="key1">
<value>value1</value>
</entry>
<entry key="key2">
<value>key2</value>
</entry>
</map>
</property>
</bean>
<bean id="test" class="com.pb.test">
<property name="props">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
</property>
</bean>
<bean>
< property name ="interest" >
< set >
< value > 唱歌 </ value >
< value > 跳舞 </ value >
< value > 书法 </ value >
</ set >
</ property >
</bean>
容器中 Bean 的生命周期
Spring 可以管理 singleton 作用域 Bean 的生命周期,Spring 可以精确地知道 singleton 域 bean 何时被创建,何时初始化完成
,以及容器何时准备销毁 Bean 实例。因为,对于 singleton 作用域的 Bean,客户端的每次请求都返回同一个 Bean 实例,客户端代码不能控制 Bean 的销毁,它的生命周期都在 Spring 的掌握之中。这么一来,容器就可以管理实例化结束后(某些资源的申请)和销毁之前(进行某些资源的回收)的行为。管理 Bean 的生命周期行为主要有两个时机:注入依赖关系后,销毁实例之前;具体的管理方法如下
Spring 提供两种方式在 Bean 全部属性设置成功后执行特定行为
使用 init-method 属性(代码污染小)
在类中编写一个方法,在属性中指定该方法在依赖关系设置完成后自动执行。
实现 InitializingBean 接口(耦合较高)
编写 afterPropertiesSet()方法的具体实现
同理,若在 Bean 销毁之前,执行特定的方法,只需要①使用 destroy-method 属性②实现 DisposableBean 接口(实现 destroy()方法)
对于 prototype 作用域的 Bean,Spring 容器只负责 Bean 的创建,当容器创建实例完成后,Bean 将完全交给客户端代码管理,容器不再负责其生命周期。每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会产生一个全新的 Bean 实例交个客户端(prototype 就是这么任性),Spring 容器本省也不知道自己创建了多少个实例,更无从知道这些实例什么时候才会被销毁。
Spring 的 Bean 和 JavaBean 比较
规范:Spring 容器对 Bean 没有特殊要求,不像 JavaBean 一样遵循一些规范(为每个属性提供相应的 setter 和 getter 方法),不过对于设值注入的 Bean,一定要提供 setter 方法。
作用:Spring 中的 Bean 是 java 实例,java 组件,它的作用几乎无所不包,任何应用组件都被称为 Bean,而传统的 Java 应用中的 JavaBean 通常作为 DTO(数据传输对象),来封装值对象,在各层之间传递数据。
生命周期:传统的 JavaBean 作为值对象传递,不接受任何容器管理其生命周期,Spring 中的 Bean 有 Spring 管理其生命周期行为。
Spring 的 Bean 继承和 java 继承的区别
Spring 中子 Bean 和父 Bean 可以是不同的类型,而 java 中的继承子类只是父类的一种特殊类型。
Spring 中 Bean 的继承是实例之间的关系,主要表现为参数值的延续,而 java 终的继承是类之间的关系,主要表现为属性,方法的延续。
评论