Spring中bean的配置和管理
阿新 • • 發佈:2018-12-24
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以後)
- 寫法
- 物件屬性 p:屬性名-ref=”值”
- 普通屬性 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>