Spring中的bean

1.定义和别名

定义一个bean可以为其制定如下属性

default-lazy-init:延迟初始化(默认false,即立即初始化)

default-merge:从父类合并继承属性值

default-autowire:可以按byName,byType等方式完成自动装配

default-autowire-candidates:自动装配时候排除此bean

bean可以使用id定义唯一名字,还可以使用name定义别名,例如<bean id="person" name="#abc,@123" />

还可以使用<alias>标签定义别名,例如<alias name="person" alias="jack" />

2.bean作用域

使用scope属性可以指定bean作用域,例如<bean id="person" class="spi.Person" scope="singleton" />

默认作用域为 singleton,即单例,可重复使用,也可以指定为prototype,每次使用bean时Spring都重新new出一个实例。

此外还有三种web中的作用域,分别是request (每个HTTP请求都创建一个新bean),session(每个HTTP session使用同一个bean),global session全局的HTTP session对应一个bean实例

3.设置普通属性值

使用value属性或者<value>标签可以为bean设置普通属性值,Spring自动判断数据类型,例如

1 <bean id="person" class="spi.Person">
2     <!-- 使用value属性设置普通属性值,这里是int类型-->
3   <property name="personId" value="1">
4     <!--使用嵌套 value 标签的方式设置普通属性值,这里是double类型 -->
5   <property name="high">
6     <value>1.76</value>
7   </property>
8 </bean>

4.自动装配

如果指定了bena的autowire属性可以进行自动装配

如果在<beans>标签添加default-autowire属性,将对所有<bean>起作用,如果在<bean>标签添加autowire(注意这里不是default-autowire),则只对单个bean起作用。

autowire支持no, byName, byTye, constructor, autoetect值。

byName: 根据bean中setter方法的名称,去容器中查找对应的bean,例如Person类中有一个setter方法叫做 setSchool(), 那么就在容器中查找<bean id="school" ../>,找得到就进行注入。

 1 class Person {
 2     School school;
 3     public setSchool(School school) {
 4         this.school = school;
 5     }
 6 }
 7
 8 class School {
 9     String schoolName;
10 }
1 <bean id="person" class="Person" autowire="byName" />
2 <bean id="school" class="School" />

byType: 根据bean中setter方法的参数类型查找,还是上面的例子,Person的setSchool()方法需要一个School类型的参数,Spring就会在容器中查找类型为School的bean。配置如下。

1 <bean id="person" class="Person" autowire="byType" />
2 <bean id="school" class="School" />

类似的,constructor会根据构造函数的参数类型,在容器中查找对应的bean

注意的是,对于byType和constructor两种自动装配, 在容器中查找对应的bean不能超过一个,否则Spring无法决定装配哪一个。

例如上面的例子,假如有第三个bean继承自School,叫做HighSchool,容器中配置了<bean id="highSchool" class="HighSchool" />,那么Spring就不知道要装配哪一个给Person了。

autodetect: 由容器自行决定自动装配策略。如果找到默认构造函数,则使用byTpye策略。

自动装配可以减少配置代码量,但是会增加不透明性,对于大型项目不推荐自动装配。

5.注入嵌套bean

<bean>中嵌套一个bean,嵌套的bean只能用来注入,其本质与ref注入是一样的,区别是嵌套的bean不能被容器访问,因此也不再需要id属性,例如下面,

1 <bean id="person" class="Person">
2   <property name="school">
3     <bean class="School">
4   </property>
5 </bean>

6.注入集合值

如果类中定义了list, set, map, properties, array等集合属性,在bean中要为集合属性注入值时,可以在<property>标签下面嵌套<list>, <set> , <map> , <props> 等标签为其注入值。

下面是一个为集合属性注入值的例子,假如有如下类(bean),

1 public class CollectionBean {
2     private List<String> schools;
3     private Map scores;
4     private Map<String, Axe> phaseAxes;
5     private Properties health;
6     private Set axes;
7     private String[] books;
8 ...
9 }

则对应的XML配置如下,

 1     <bean id="collectionBean" class="CollectionBean">
 2         <!-- 为schools注入list集合类型的值 -->
 3         <property name="schools">
 4             <list>
 5                 <value>小学</value>
 6                 <value>中学</value>
 7             </list>
 8         </property>
 9
10         <!-- 为scores注入map集合类型的值 -->
11         <property name="scores">
12             <map>
13                 <entry key="语文" value="89" />
14                 <entry key="数学" value="88" />
15             </map>
16         </property>
17
18         <!-- 为phaseAxe注入map集合类型的值,key为String类型,value为Axe类型 ,复合类型的值使用value-ref进行引用-->
19         <property name="phaseAxe">
20             <map>
21                 <entry key="原始社会" value-ref="stoneAxe" />
22                 <entry key="农业社会" value-ref="steelAxe" />
23             </map>
24         </property>
25
26         <!-- 为health注入properties集合类型的值 -->
27         <property name="health">
28             <props>
29                 <prop key="血压">正常</prop>
30                 <prop key="身高">175</prop>
31             </props>
32         </property>
33
34         <!-- 为axes注入set集合类型的值 -->
35         <property name="axes">
36             <set>
37                 <!-- 每个value,ref,bean..都可以配置一个set元素 -->
38                 <value>普通字符串</value>
39                 <ref bean="stoneAxe" />
40                 <bean id="steelAxe" class="spi.SteelAxe" />
41                 <!-- 为set集合配置一个list集合作为一个元素 -->
42                 <list>
43                     <value>20</value>
44                     <!-- 再次为list集合配置一个set集合作为元素 -->
45                     <set>
46                         <value type="int">30</value>
47                     </set>
48                 </list>
49             </set>
50         </property>
51
52         <!-- 为books注入一个数组值 -->
53         <property name="books">
54             <!-- 数组和list使用一样的注入方法 -->
55             <list>
56                 <value>语文</value>
57                 <value>英语</value>
58             </list>
59         </property>
60     </bean>

7.注入组合属性

假如有一个类Person中有一个属性为School school,这里的school也是一个类对象,也包含属性,而相对于Person的对象来说,school对象的属性就是组合属性。

1 class Person {
2     School school = new School();
3 }
4
5 class School {
6     String schoolName;
7 }

如果我们现在需要为组合数学注入值,那么在XML中的配置如下,

1 <bean id="person" class="Person">
2   <property name="person.schoolName" value="北京大学" />
3 </bean>

为组合属性注入值要注意两点,

一是组合属性对应的对象不能为空,例如上面的school对象,必须初始化。

二是组合属性除了最后一段可以为null,其他都不能,否则会出现空指针异常。例如假如有foo.bar.name,则name可以为null,bar和foo都不可以为null

时间: 2024-08-07 07:02:22

Spring中的bean的相关文章

spring配置,spring中的bean 的id不能相同

lib下加入包 spring.jar commons-logging.jar src下添加 applicationContext.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLS

JSP访问Spring中的bean

JSP访问Spring中的bean <%@page import="com.sai.comment.po.TSdComment"%> <%@page import="com.sai.comment.service.CommentService"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import

传统javabean与spring中的bean的区别

javabean已经没人用了 springbean可以说是javabean的发展, 但已经完全不是一回事儿了 用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean. 写法不同:传统javabean作为值对象,要求每个属性都提供getter和setter方法:但spring中的bean只需为接受设值注入的属性提供setter方法. 生命周期不同:传统javabean作为值对象传递,不接受任何容器管理其生命周期:spring中的

第2章 Spring中的Bean

2.1 Bean的配置 Bean本质是Java中的类.Spring可以被看做一个大型工厂,这个工厂的作用就是生产和管理Spring容器zho中的Bean.想在项目中使用这个工厂,就需要对Spring的配置文件进行配置. Spring支持XML和Properties两种格式的配置文件.常用XML文件配置,该方式通过XML文件来注册并管理Bean之间的依赖关系. XML配置文件的根元素是<beans>,包含了多个<bean>子元素,每个子元素地定义一个Bean. <bean>

spring 中的 bean 是线程安全的吗?

Spring 不保证 bean 的线程安全.默认 spring 容器中的 bean 是单例的.ZFX代理申请www.fx61.com/brokerlist/zfx.html,当单例中存在竞态条件,即有线程安全问题.如下面的例子计数类package constxiong.interview.threadsafe;/** 计数类 @author ConstXiong @date 2019-07-16 14:35:40*/public class Counter {private int count

Spring 中的bean 是线程安全的吗?

结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究. Spring 的 bean 作用域(scope)类型 1.singleton:单例,默认作用域. 2.prototype:原型,每次创建一个新对象. 3.request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下. 4.ses

spring中bean的五种作用域?Spring中的bean是线程安全的吗?

spring中bean的五种作用域 当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bea

Spring中的Bean——装载

Bean的装配方式 Bean的装配可以理解为依赖关系注入 基于XML的装配 a) 设值注入 i.要求: Bean 类必须提供一个默认的无参构造方法. Bean 类必须为需要注入的属性提供对应的setter方法. b) 构造注入 package com.itheima.assemble; import java.util.List; public class User { private String username; private Integer password; private List

半夜思考之查漏补缺 , Spring 中的 Bean 继承机制

这里的继承 , 不是 Java 中的继承 , 下面就总结下 Bean继承与Java继承的区别: Spring 中的子类 Bean 和父 Bean 可以是不同类型 , 但是 Java 中的继承则可保证子类是一种特殊的父类 ; Spring 中 Bean 的继承时实例之间的关系 , 因此主要表现为参数值的延续 ; 而 Java 中的继承是类之间的关系 , 主要表现为方法和属性的延续 ; Spring 中的子 Bean 不可作为父 Bean 使用 , 不具备多态性 ; 而 Java 中的子类实例完全可

Spring讲解二:Spring中的Bean配置1---基于XML文件的方式

一.在Spring的IOC容器中配置Bean 在xml文件中通过bean节点配置bean id:Bean的名称: (1) 在IOC容器中必须是唯一的 (2) 若id没有指定,Spring自动将权限限定性类名作为bean的名字 (3) id可以指定多个名字,名字之间可以用逗号.分号.或空格分隔 二.Spring容器 在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行初始化.只有在容器实例化后,才可以从IOC容器中获取Bean实例并使用. Spring提供了两种类型的IOC