Spring 容器中,使用 Bean 作为高效组件来填充容器,Bean 的实例方法完成依赖注入,实现方便快速地管理实例实现功能,Spring 中配置 Bean 的方法有多种,实际编写过程中要根据实际情况来选择方法。
1.最简单的声明 Bean
最简单的声明 Bean 需要在 Spring 的配置文件中实现的,例如代码:
- <bean id="HelloWorld" class="com.hundsun.spring.HelloWorld"></bean>
简单的 Bean 是由 <bean></bean>
标签包裹,其中两个属性:
id 的作用是作为 Bean 的唯一标识,以后使用 Bean 的时候就使用 id 后面的名字即可;
class 的作用是作为制定该 Bean 的实现类,运行中 Spring 会 new 该实现类的对象,因此 class 必须指向实现类,而非其他接口等。
2.通过构造器声明
构造器声明 Bean 适用于目标实现类中有含有参数的构造器。
例如代码:
- <bean id="HelloWorld" class="com.hundsun.spring.HelloWorld">
- <constructor-arg value="TOM"></constructor-arg>
- </bean>
与简单声明 Bean 方法有所区别的是,<bean></bean>
标签中增加了一个 <constructor-arg></constructor-arg>
标签,此标签中有 value 属性。多出的这个 constructor-arg 标签的作用就是为了填充目标实现类中含有参数的构造器中的参数。
如果不是特别明白,可以查看一下 bean 指向的实现类的源代码:
- package com.hundsun.spring;
- public class HelloWorld {
- public HelloWorld(String name) {
- System.out.println("Hello World"+name);
- }
- }
代码中含有一个带参的构造器,而 constructor-arg 中的 value 指的就是参数 name。不必担心 value 中的值的类型问题,Spring 会根据实现类中的变量类型自动转换 value 中的类型。
另
如果构造器中含有多个参数,可以添加多个 constructor-arg ,可以增加 index 属性排列顺序,顺序从小到大。
如果实现类中有多个构造器,但是参数类型不同,需要在 <constructor-arg></constructor-arg>
标签中增加属性 value 以区分具体声明的哪一个类型的参数。
3.通过工厂方法创建 Bean
工厂方法创建 Bean 的方法适用于单例类实例,即实例中只含有静态方法。
例如代码
- <bean id="staticFunction" class="com.hundsun.spring.StaticHello" factory-bean="HelloWorld"></bean>
相对简单方法,多出来一个 factory-bean 的属性,该属性指向的就是 StaticHello 实现类中 HelloWorld 静态方法。
4.使用 Set 方法注入 Bean 属性
要为创建 Bean 的实现类中的私有属性注入值,需要使用 Set 方法注入,简单安全。
要实现 set 方法注入 Bean 要做这样的步骤
1.在实现类中为目标私有属性生成 set 方法。
2.在构造 Bean 的 XML 文件中增加 <property name="xxx" value="xxx">
例如代码
- <bean id="demo" class="com.hundsun.spring.HelloWorld">
- <property name="message" value="你好"></property>
- </bean>
对应的 name 属性指的是 HelloWorld 实现类中 message 的私有属性,并且将 value 属性中的“你好”注入给 message。这个时候你若输出 message ,则会输出汉字“你好”。但是前提是你一定一定要在实现类中生成好 setMessage() 方法。
同样的,你可以给 Bean 属性赋值已有的其他 Bean,如代码所示。
- <!-- 事先声明好的person的bean -->
- <bean id="Sam" class="com.hundsun.spring.entity.Person"></bean>
- <bean id="demo" class="com.hundsun.spring.HelloWorld">
- <property name="message" value="你好"></property>
- <property name="person" ref="Sam"></property>
- </bean>
一个 id 名为 Sam 的 Bean 被一个 id 为 demo 的 Bean 引用,关键属性为 ref ,ref 直接指向了已有的 Bean。
假设我只希望名为 Sam 的 Bean 被 demo 引用,我可以使用注入内部 Bean,只需将上述代码修改为这样:
- <bean id="demo" class="com.hundsun.spring.HelloWorld">
- <property name="message" value="你好"></property>
- <property name="person">
- <bean id="Sam" class="com.hundsun.spring.entity.Person"></bean>
- </property>
- </bean>
5.其他零碎
1.Bean 的作用域
<bean></bean> 标签中的 scope 属性,该属性作用是控制 Bean 的作用域,默认情况下,Bean 是单例,即如果创建,如果被再次使用的话不会创建新的,而取之前创建过的 Bean 使用,如果想要每次都创建新的实例,则需要修改 scope 属性。
scope 属性值有:
singleton 一个 Bean 只有一个对象(默认)
prototype 每次都被重新创建一个实例
request 在一次 HTTP 请求中有效
session 在一次对话中有效
global-session 在整个 HTTP 请求中有效
2.初始化和销毁 Bean
两个属性:
init-method=""
在初始化 Bean 时执行实例中的某个方法。
destory-method=""
在 Bean 销毁时执行实例中的某个方法。
如果希望设置默认初始化和销毁方法的话,可以在文件头部<beans></beans>标签中增加两个属性:
default-init-method=""
default-destory-method=""
3.Spring 命名空间 p
为了简化 Bean 的装配,Spring 提供了 p 方法装配 Bean。
首先需要引入 p 的命名空间;
这个时候,Bean 可以改写为:
- <bean id="Sam" class="com.hundsun.spring.entity.Person"></bean>
- <bean id="demo" class="com.hundsun.spring.HelloWorld" p:message="你好" p:person-ref="Sam"></bean>
大大缩短了编写时间。
4.装配集合(略)
5.SpEL 表达式(略)
感谢你的赏识与认可
支付宝
微信支付
使用手机访问这篇文章
本文许可协议 © CC BY-NC-SA 4.0 转载请注明来源
- 上一篇: 占领杭州行动纲要-传说中的西湖1日游
- 下一篇: Spring 的自动装配
那么 bean 文件应该放在什么位置呢?