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>

猜你喜欢

转载自blog.csdn.net/W2612888/article/details/85221853