Day2 bean标签
bean标签
id
作用:唯一标识bean
用法:
<bean id="userDao" ...>
name
作用:设置bean名称,可以设置多个,多个名称可以使用空格、逗号、或者分号分隔;
用法:
<bean name="userDao userDao1,userDao2;userDao3" ...>
示例:
xml配置
<bean id="user" name="user2 user3,user4;user5" class="com.bailiban.day1.helloworld.model.User" />
测试代码:
static void nameTest() {
// 打印user的别名
Arrays.asList(context.getAliases("user")).forEach(System.out::println);
// 可以使用别名获取bean
System.out.println(context.getBean("user") == context.getBean("user3"));
}
结果:
user2
user5
user3
user4
false
class
作用:设置bean的class全限定类名;
用法:
<bean id="user" class="com.bailiban.day1.helloworld.model.User">
scope
作用:设置bean的作用范围;
取值:
- singleton
单例,默认值。即在当前Spring IOC容器中,只会出现该类的一个实例; - prototype
多例,每个依赖的地方,都注入一个新的实例; - request
每个HTTP请求(request),对应一个实例; - session
每个HTTP回话(session),对应一个实例; - application
每个servlet上下文(ServletContext),对应一个实例; - websockt
每个websockt对应一个实例;
后面4个取值,只出现在web应用中。
用法:
<bean id="user" class="com.bailiban.day1.helloworld.model.User" scope="prototype">
示例:
xml配置
<bean id="counter" class="com.bailiban.day2.beans.Counter" scope="prototype">
<property name="count" value="0" />
</bean>
<bean id="counterTest1" class="com.bailiban.day2.beans.CounterTest1">
<property name="counter" ref="counter" />
</bean>
<bean id="counterTest2" class="com.bailiban.day2.beans.CounterTest2">
<property name="counter" ref="counter" />
</bean>
测试代码:
// 测试类
@Data
public class Counter {
private int count;
public void inc() {
System.out.println(++this.count);
}
}
@Data
public class CounterTest1 {
private Counter counter;
public void count() {
this.counter.inc();
}
}
@Data
public class CounterTest2 {
private Counter counter;
public void count() {
this.counter.inc();
}
}
// 测试代码
static void scopeTest() {
CounterTest1 counterTest1 = context.getBean(CounterTest1.class);
counterTest1.count();
counterTest1.count();
CounterTest2 counterTest2 = context.getBean(CounterTest2.class);
counterTest2.count();
counterTest2.count();
}
结果:
count: 1
count: 2
count: 1
count: 2
问题:singleton和prototype如何选择?
一般原则:对象无状态(或状态可共享)选singleton,有状态(状态不共享)选prototype。
例如上述示例代码:
- 如果每个CounterTestX都要单独计数,那么Counter应该设置为prototype;
- 如果所有CounterTestX可以共享Counter计数,那么Counter设置为单例即可;
扩展:单例模式
参照:https://www.cnblogs.com/cheng18/p/12055382.html
lazy-init
作用:设置单例bean实例化时间;
取值:
- false:默认值,在Spring IOC容器初始化是,实例化单例bean;
- true:将单例bean的实例化推迟到使用时;
默认情况下,Spring会在初始化容器时,实例化所有单例bean;
用法:
<bean id="user" class="com.bailiban.day1.helloworld.model.User" lazy-init="true">
bean注入
通过Spring实例化对象的成员变量。
构造函数
标签:
作用:设置构造参数
用法:
参数取值
- value:基本类型,如int,String等;
- ref:指向其他bean;
参数匹配 - name
<bean id="testModel1" class="com.bailiban.day2.beans.TestModel">
<constructor-arg name="id" value="1001" />
<constructor-arg name="name" value="Jim" />
<constructor-arg name="user" ref="user" />
</bean>
- index (从0开始)
<bean id="testModel2" class="com.bailiban.day2.beans.TestModel">
<constructor-arg index="0" value="1002" />
<constructor-arg index="1" value="Kitty" />
<constructor-arg index="2" ref="user" />
</bean>
- type
<bean id="testModel3" class="com.bailiban.day2.beans.TestModel">
<constructor-arg type="int" value="1003" />
<constructor-arg type="java.lang.String" value="David" />
<constructor-arg type="com.bailiban.day1.helloworld.model.User" ref="user" />
</bean>
setter方法
标签:
用法:
<bean id="user" class="com.bailiban.day1.helloworld.model.User">
<property name="id" value="1001"/>
<property name="name" value="Jim"/>
</bean>
注意:对应属性必须要有setter方法;
Autowiring
用法:
<bean id="counterTest3" class="com.bailiban.day2.beans.CounterTest2" autowire="byName" />
好处:省去<property>
设置。
集合类型注入
Spring支持数组、List、Set、Map等集合类型的注入。
- 数组、List、Set
标签:<array>, <list>, <set>
,三者可以互换。 - Map
标签:<map><entry key="" value="" /></map>
示例:
<bean id="testModel4" class="com.bailiban.day2.beans.TestModel">
<property name="id" value="1001" />
<property name="name" value="Jim" />
<property name="user" ref="user" />
<property name="priceArray">
<array>
<value>100</value>
<value>110</value>
<value>120</value>
</array>
</property>
<property name="idList">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="descSet">
<set>
<value>description111</value>
<value>description222</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="a1" value="v1" />
<entry key="a2" value="v2"/>
</map>
</property>
</bean>
p命名空间
作用:简化属性注入
示例:
<bean id="user10" class="com.bailiban.day1.helloworld.model.User" p:id="1001" p:name="Jim" />
注意:
使用p命名空间需要在beans标签中添加p命名空间: xmlns:p="http://www.springframework.org/schema/p"
完整写法:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
可以利用idea帮我们自动添加。