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的作用范围;
取值:

  1. singleton
    单例,默认值。即在当前Spring IOC容器中,只会出现该类的一个实例;
  2. prototype
    多例,每个依赖的地方,都注入一个新的实例;
  3. request
    每个HTTP请求(request),对应一个实例;
  4. session
    每个HTTP回话(session),对应一个实例;
  5. application
    每个servlet上下文(ServletContext),对应一个实例;
  6. 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。
例如上述示例代码:

  1. 如果每个CounterTestX都要单独计数,那么Counter应该设置为prototype;
  2. 如果所有CounterTestX可以共享Counter计数,那么Counter设置为单例即可;
扩展:单例模式

参照:https://www.cnblogs.com/cheng18/p/12055382.html

lazy-init

作用:设置单例bean实例化时间;
取值:

  1. false:默认值,在Spring IOC容器初始化是,实例化单例bean;
  2. true:将单例bean的实例化推迟到使用时;

默认情况下,Spring会在初始化容器时,实例化所有单例bean;

用法:
<bean id="user" class="com.bailiban.day1.helloworld.model.User" lazy-init="true">

bean注入

通过Spring实例化对象的成员变量。

构造函数

标签:
作用:设置构造参数
用法:
参数取值

  1. value:基本类型,如int,String等;
  2. ref:指向其他bean;
    参数匹配
  3. 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>
  1. 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>
  1. 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等集合类型的注入。

  1. 数组、List、Set
    标签:<array>, <list>, <set>,三者可以互换。
  2. 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帮我们自动添加。

posted @ 2019-12-18 22:43  cheng_18  阅读(270)  评论(0编辑  收藏  举报