1. 程式人生 > >Spring中bean的配置和管理

Spring中bean的配置和管理

1 Spring中bean的配置

1.1 <bean>標籤的id和name區別

  • id        :使用了約束中的唯一約束。裡面不能出現特殊字元的。
  • name  :沒有使用約束中的唯一約束(理論上可以出現重複的,但是實際開發不能出現的)。裡面可以出現特殊字元。比如Spring和Struts整合的時候<bean name="/user"  class="xxx.xxx.xxx">

1.2 Bean生命週期的配置

  • init-method           :Bean被初始化的時候執行的方法
  • destroy-method    :Bean被銷燬的時候執行的方法(Bean在預設情況下是單例建立,工廠關閉)

1.3 Bean作用範圍的配置

  • singleton       :預設的,Spring會採用單例模式建立這個物件。
  • prototype       :多例模式。(Struts2和Spring整合會用到,因為Action是多例的)
  • request          :應用在web專案中,Spring建立這個類以後,將這個類存入到request範圍中。
  • session          :應用在web專案中,Spring建立這個類以後,將這個類存入到session範圍中。
  • globalsession :應用在web專案中,必須在porlet環境下使用。但是如果沒有這種環境,相對於session。

1.4 示例

1.4.1 bean的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<bean id="userDao" class="com.itykd.dao.impl.UserDaoImpl" scope="prototype" init-method="init" destroy-method="destory"/>
</beans>

1.4.2 示例Demo 

package com.itykd.spring;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.itykd.dao.UserDao;

public class SpringDemo {	
    public void configurationDemo() {
		//建立Spring的工廠
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
		UserDao userDao2 = (UserDao) applicationContext.getBean("userDao");
		userDao1.save();
		userDao2.save();
		System.out.println(userDao1==userDao2);
		applicationContext.close();	
	}
}

因為配置的多例的形式,因此會初始化兩次,userDao1和userDao2是兩個物件,System.out.println(userDao1==userDao2)輸出為false

2 Spring的bean管理

2.1 Spring的bean的例項化方式

2.1.1 無參構造方法的方式(預設)

  • 構造方法編寫
package com.itykd.bean;

public class Bean {

	public Bean() {
		super();
		System.out.println("Bean1的無參構造方法執行了......");
	}

}
  • bean的配置
<bean id="bean" class="com.itykd.bean.Bean" />
  • 利用spring工廠建立bean
	public void beanInstanceByConstruction() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1=(Bean1)applicationContext.getBean("bean");
	}

2.1.2 靜態工廠例項化方式

  • 靜態工廠
package com.itykd.bean;

public class BeanStaticFatory {
	public static Bean createBean() {
		System.out.println("BeanStaticFatory的createBean方法執行了.....");
		return new Bean();
	}
}
  • bean的配置
	<bean id="beanStaticFactory" class="com.itykd.bean.BeanStaticFatory" factory-method="createBean"/>
  • 建立bean
	public void beanInstanceByStaticFactory() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean bean1=(Bean)applicationContext.getBean("beanStaticFactory");
	}

2.1.3 例項工廠例項化方式

  • 例項工廠
package com.itykd.bean;

public class BeanFatory {
	public  Bean createBean() {
		System.out.println("BeanFatory的createBean方法執行了.....");
		return new Bean();
	}
}
  • bean配置
	<bean id="beanFactory" class="com.itykd.bean.BeanFatory"></bean>
	<bean id="bean2" factory-bean="beanFactory" factory-method="createBean"></bean>
  • 建立bean
	public void beanInstanceByFactory() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean bean1=(Bean)applicationContext.getBean("beanFactory");
	}

2.2 Spring的屬性注入

2.2.1 構造方法屬性注入

  • 帶屬性的構造方法
package com.itykd.bean;

public class User {
    private String name;
    private String password;
	public User(String name, String password) {
		super();
		this.name = name;
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", password=" + password + "]";
	}
 
}
  • bean配置
	<!-- 構造方法屬性注入 -->
	<bean id ="user" class="com.itykd.bean.User">
	    <constructor-arg name="name" value="Kobe"/>
	    <constructor-arg name="password" value="123"/>	
	</bean>
  • 建立bean
    public void beanAttributeByConstuctor() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user=(User)applicationContext.getBean("user");
		System.out.println(user);
	}

2.2.2 set方法屬性注入

  • set方法

       提供了set方法之後,不要寫帶屬性的構造方法

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

	public void setPassword(String password) {
		this.password = password;
	}
  • bean配置
	<!-- set方法屬性注入 -->
	<bean id ="user1" class="com.itykd.bean.User">
	    <property name="name" value="ykd"/>
	    <property name="password" value="456"/>	
	</bean>
  • set方法設定物件型別的屬性

         ref用來設定物件型別的屬性,ref引用的是其他bean的id或者name

2.2.3 p名稱空間屬性注入(Spring2.5以後)

  • 寫法
  1.   物件屬性  p:屬性名-ref=”值”
  2.   普通屬性  p:屬性名=”值”
  • p名稱空間的引入

在xml檔案上引入  xmlns:p="http://www.springframework.org/schema/p"

  • set方法

       p名稱空間的注入需要提供屬性的set方法

package com.itykd.bean;

public class Company {
	private String name;
    private String location;
    private String level;

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

	public void setLocation(String location) {
		this.location = location;
	}

	public void setLevel(String level) {
		this.level = level;
	}

	@Override
	public String toString() {
		return "Company [name=" + name + ", location=" + location + ", level=" + level + "]";
	}    
     
}
  • bean的配置
<bean id="company" class="com.itykd.bean.Company" p:name="阿里巴巴" p:location="杭州" p:level="BAT"/>

2.2.4 spEL屬性注入(Spring3.0以後)

spEL:Spring Expression Language,spring的表示式語言,也要提供set方法才能注入屬性

寫法:#{spEL}

	<bean id="car" class="com.itykd.bean.Car">
	    <property name="name" value="#{'寶馬'}"/>
	    <property name="price" value="#{car.calculatePrice()}"/>
	</bean>
	<bean id="employee" class="com.itykd.bean.Employee">
	    <property name="name" value="#{'James'}"/>
	    <property name="car" value="#{car}"/>
	</bean>

2.2.5 集合型別的屬性注入

  • 如果集合類中的屬性是物件型別的話,對於list,陣列和set來說,則就不用<value>標籤,只用<ref>標籤
  • 對於map來說的話,用key-ref或者value-ref
  • 也要提供set方法
package com.itykd.bean;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class CollectionBean {
	private String[] arrs;
	private List<String> list;
	private Set<String> set;
	private Map<String, String> map;
	public void setArrs(String[] arrs) {
		this.arrs = arrs;
	}
	public void setList(List<String> list) {
		this.list = list;
	}
	public void setSet(Set<String> set) {
		this.set = set;
	}
	public void setMap(Map<String, String> map) {
		this.map = map;
	}
	@Override
	public String toString() {
		return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + ", map=" + map
				+ "]";
	}	
}
  • 配置bean 
	<bean id="collectionBean" class="com.itykd.bean.CollectionBean">
	<!-- 陣列型別 -->
	<property name="arrs">
	    <list>
	        <value>Kobe</value>
	        <value>James</value>
	        <value>Wade</value>    
	    </list>
	</property>
	<!-- 注入list集合 -->
	<property name="list">
		<list>
	        <value>Lakers</value>
	        <value>Clippers</value>
	        <value>Spurs</value>    
	    </list>	
	</property>
	<!-- 注入set集合 -->
		<property name="set">
		<list>
	        <value>IG</value>
	        <value>RNG</value>
	        <value>WE</value>    
	    </list>	
	</property>
	<!-- 注入map集合 -->
	<property name="map">
	    <map>
	        <entry key="aaa" value="111"/>
	        <entry key="bbb" value="222"/>
	        <entry key="ccc" value="333"/>	    
	    </map>	
	</property>
	</bean>