跳至主要內容

Spring 基础(二)

Yaien Blog原创大约 5 分钟Spring基础

Spring 基础(二)

Spring 基础笔记系列

对象的作用域与生命周期(不常用)

由Spring管理的对象,默认都是单例的!并且,都是饿汉式的单例模式。

在配置<bean>节点时,可以添加scope属性其是否单例,当取值为singleton时表示单例,该值也是默认值,当取值为prototype时表示非单例:

<bean id="user" class="cn.tedu.spring.User" scope="prototype"/>

在单例模式的基础之上,还可以通过lazy-init属性配置它是否为懒汉式的单例模式,默认值为false,即非懒汉式,也就是饿汉式的单例模式,当取值为true时,表示懒汉式的单例模式:

<bean id="user"
      class="cn.tedu.spring.User"
      scope="singleton"
      lazy-init="true"/>

如果某个类被配置为单例模式,还可以配置它的生命周期方法:首先,在类中声明2个方法,这2个方法都应该是public方法,返回值都是void,方法名称可以自由定义,方法必须没有参数,例如:

	public void init() {
		System.out.println("User.init()");
	}
	
	public void destroy() {
		System.out.println("User.destroy()");
	}

然后,在Spring的配置文件中,在<bean>节点中配置init-methoddestroy-method属性,即可配置初始化方法和销毁方法,这2个属性的取值都是需要调用的方法的名称:

<bean id="user"
      class="cn.tedu.spring.User"
      scope="singleton"
      lazy-init="true"
      init-method="init"
      destroy-method="destroy"/>

Spring的IoC

什么是IoC

IoC表示Inversion of control,即“控制反转”。传统模式下,对象的创建与管理都是由开发人员编写代码直接完成的,而使用Spring后,将创建与管理交给了框架,则称之为控制反转。

其中,比较重要的环节是为对象的某些属性进行赋值,称之为DI,即Dependency Injection,表示“依赖注入”,通俗的来说,是为其属性赋值,也称之为“为其属性注入值”。

Spring通过DI实现了IoC,即DI是实现手段,而IoC是需要实现的目标。

通过SET方式注入属性的值

假设User类中有名为name的属性,需要为该属性注入值,首先,需要为该属性添加SET/GET方法(其实只有SET方法是必须的):

	public void setName(String name) {
		this.name = name;
	}

然后,在<bean>节点子级添加<property>节点进行配置:

<bean id="user"
      class="cn.tedu.spring.User">
    <!-- 使用property节点为属性注入值 -->
    <!-- name:属性名 -->
    <!-- value:属性值 -->
    <property name="name" value="Kitty"></property>
</bean>

其实,框架在处理时,发现有<property>节点,就会尝试为属性赋值,它会基于该节点的name属性值得到SET方法的名称,规则就是set加上属性名且首字母改为大写,得到SET方法名称,如果属性名称是name
,则框架将调用的方法就是setName,如果属性名称是password,则框架将调用的方法已经setPassword,然后,将value
属性对应的值,作为将调用的方法的参数,以上示例代码中的配置,使得框架将调用对象.setName("Kityy");语句。

所以,在<property>节点中,name属性配置的其实是SET方法的方法名右侧的部分,且首字母改为小写!

但是,在实际使用时,SET方法都是由开发工具自动生成,生成规则与Spring框架处理时的规则是完全相同的,所以,也可以简单的认为<property>节点中配置的name就是属性的名称!

在某些情况下,需要注入的属性值并不是基本值(可以直接书写的值,例如数值、字符串等),而是另一个类的对象时,可以先使得Spring也管理另一个类的对象,然后,注入值时,通过ref属性引用那个<bean>即可:

通过构造方法注入属性的值(不常用)

如果某个属性是通过构造方法设置值的,例如:

	public class Person {
	
		// 25
		private Integer age;
	
		public Person(Integer age) {
			super();
			this.age = age;
		}
	
		@Override
		public String toString() {
			return "Person [age=" + age + "]";
		}
	
	}

则在配置时,应该使用<constructor-arg>节点进行配置:

<bean id="person" class="cn.tedu.spring.Person">
    <constructor-arg index="0" value="25"/>
</bean>

以上属性的配置中,index表示第几个参数,从0开始顺序编号,然后,根据值的类型选择使用valueref属性进行配置即可!

注入集合类型的值

如果某个类中的属性是List集合类型的,并需要注入值:

	public class SampleBean {
		
		// Alex, Lucy, Kitty, Henry
		public List<String> names;
	
		public void setNames(List<String> names) {
			this.names = names;
		}
	
	}

然后,在Spring的配置文件中:

<bean id="sampleBean"
      class="cn.tedu.spring.SampleBean">
    <property name="names">
        <list>
            <value>Alex</value>
            <value>Lucy</value>
            <value>Kitty</value>
            <value>Henry</value>
        </list>
    </property>
</bean>

如果需要注入Set类型的值,例如:

	// Beijing, Shanghai, Guangzhou, Shenzhen
	public Set<String> cities;

在配置注入时,使用<set>节点即可:

<property name="cities">
    <set>
        <value>Beijing</value>
        <value>Shanghai</value>
        <value>Guangzhou</value>
        <value>Shenzhen</value>
    </set>
</property>

另外,关于Map类型集合的配置例如:

<property name="session">
    <map>
        <entry key="username" value="Jack"/>
        <entry key="password" value="1234"/>
        <entry key="from" value="Nanjing"/>
    </map>
</property>

关于数组类型集合的配置例如:

<property name="numbers">
    <array>
        <value>9</value>
        <value>5</value>
        <value>2</value>
        <value>7</value>
    </array>
</property>

在配置数组时,也可以使用<list>节点,反之,在配置List集合时,也可以使用<array>节点,但是,推荐使用匹配的节点进行配置。

关于Properties类型的配置:

<property name="config">
    <props>
        <prop key="driver">com.mysql.jdbc.Driver</prop>
        <prop key="username">root</prop>
        <prop key="password">root</prop>
    </props>
</property>

在配置以上集合类型的值时,也可以事先使用例如<util:list>这类节点先将值配置好:

<util:list id="names">
    <value>Tom</value>
    <value>Alex</value>
    <value>Lucy</value>
    <value>Kitty</value>
    <value>Henry</value>
</util:list>

然后再注入到属性中:

<property name="names" ref="names"/>

比较特殊的是读取Properties类型的数据,在Spring中,可以通过<util:properties>节点的location属性指定需要读取的文件:

<util:properties id="config"
                 location="classpath:db.properties"/>

然后,就可以注入到相应的属性中:

<property name="config" ref="config"/>
上次编辑于:
贡献者: yanggl