Spring容器的简单Bean配置详解

1.导包

       Spring核心容器要导四个包,分别是core,beans,context和spel,还有两个日志包logging和log4j(老版本适用)。

2.编写配置文件

       Spring的配置文件对命名和位置没有要求,但是我们通常把配置文件命名为applicationContext.xml,放到src文件夹下。开始编写配置文件,首先要导入Spring配置的文件的约束条件,然后开始配置beans。

       Spring的一个特点就是它是一个容器性质的框架,它可以把我们serivce层和dao层的功能类做成bean对象放到容器中进行管理,所以配置Spring的容器基本上就是把我们在处理请求是需要用到的类写到配置文件中,而且Spring在创建的时候就会把配置文件里的所有的bean都新建一个实例,因此在代码中直接通过Spring获取类对象而不用去自己新建一个对象,这也是Spring的ioc思想(反转控制)。

       user类

public class User {
	
	
	public User() {
			System.out.println("User对象空参构造方法");
	}
	private String name;
	private Integer age;
	private Car car;
	
	
	
	public User(String name, Car car) {
		System.out.println("User(String name, Car car)!!");
		this.name = name;
		this.car = car;
	}
	
	public User(Car car,String name) {
		System.out.println("User(Car car,String name)!!");
		this.name = name;
		this.car = car;
	}
	
	public User(Integer name, Car car) {
		System.out.println("User(Integer name, Car car)!!");
		this.name = name+"";
		this.car = car;
	}
	
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	public void init(){
		System.out.println("初始化方法!");
	}
	public void destory(){
		System.out.println("销毁方法!");
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
	}
	
}
public class Car {
	private String  name;
	private String color;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	@Override
	public String toString() {
		return "Car [name=" + name + ", color=" + color + "]";
	}
	
	
}

把user类添加到Spring配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
	
	<!-- 将User对象交给spring容器管理 -->
	<bean  name="user" class="test.bean.User" ></bean>
	
</beans>

class属性:被管理对象的完整类名.

name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象.  
                         可以重复.可以使用特殊字符.

id属性: 与name属性一模一样. 
                    名称不可重复.不能使用特殊字符.(结论: 尽量使用name属性)

Scope属性:singeton:默认值,单例对象,即每次从Spring中获取的对象都是同一个,在Spring创建的时候对象也会创建。 

                     prototype:多例对象,每次从Spring中获取的都是新的对象,在获取时才会创建,而且Spring把这个对象抛出后不                                          再进行生命周期管理。

                     session:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中,生命周期同session。

                     request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中,生命周期同request。

                     globalSession:WEB 项目中,应用在 Porlet 环境.如果没有 Porlet 环境那么 globalSession 相当于 session。

这样我们就可以通过Spring对象的getBean方法获取到这个类的对象,而不是在使用的时候去创建他,通过这个配置信息,Spring会采用空参构造方法去创建这个bean的对象。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">

	<!-- 创建方式1:空参构造创建  -->
	<bean  name="user" class="test.bean.User"
		 init-method="init" destroy-method="destory" ></bean>

	<!-- 创建方式2:静态工厂创建 -->
	<bean  name="user2" 
		class="test.b_create.UserFactory" 
		factory-method="createUser" ></bean>
	
        <!-- 创建方式3:实例工厂创建 -->
	<bean  name="user3" 
		factory-bean="userFactory"
		factory-method="createUser2" ></bean>
		
	<bean  name="userFactory" 
		class="test.b_create.UserFactory"   ></bean>
</beans>

当然创建的方式不止一种,上面的代码提供了三种创建对象的方法,空参构造创建,静态工厂创建和实例工厂创建。创建方式1的空参构造创建可以定义两个参数init-mothod和destroy-mothod,顾名思义就是init-mothod是指定一个函数在这个对象创建完毕后执行,destroy-mothod是指定一个函数在这个对象销毁前执行。创建方式2静态工厂创建则是调用一个静态方法创建名为user2的对象放入容器。创建方式3的实例工厂创建方式则是通过一个实例对象的方法去创建一个名为user3的对象放入容器,factory-bean指定这个对象的名称,factory-method指定能创建出user3对象的这个实例对象的方法。

属性注入

在把需要用到的类写到配置文件后,还有一个问题就是如何在程序调用这些bean之前就给他们把相应的属性赋值完毕,Spring的DI可以解决这一问题。DI :Dependency Injection 依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中将类的依赖的属性设置进去。

<!-- set方式注入: -->
	<bean  name="user" class="test.bean.User" >
		<!--值类型注入: 为User对象中名为name的属性注入tom作为值 -->
		<property name="name" value="tom" ></property>
		<property name="age"  value="18" ></property>
                <property name="car"  ref="car" ></property>
	</bean>

set方式注入是使用最多的注入方式,Spring会通过对象的set方法设置指定的值。我们在<property>标签中指定对象中属性的值,name指定属性的名称,value指定属性的值,ref是引用类型注入,为car属性注入名称为的car的对象(前提是你的配置文件中有一个名为car的对象)。

<!-- 构造函数注入 -->
<bean name="user2" class="test.bean.User" >
	<constructor-arg name="name" index="0" type="java.lang.String" value="999"  >                          
    </constructor-arg>
    <constructor-arg name="car" ref="car" index="1" ></constructor-arg>
</bean>

构造函数注入是使用我们在类中写好的构造函数去创建对象,其中:

name属性: 构造函数的参数名
index属性: 构造函数的参数索引
type属性: 构造函数的参数类型   

图中的信息表明Spring应该调用user对象的public User(String name, Car car) 构造方法去注入属性。

<!-- p名称空间注入, 走set方法-->
	<bean  name="user3" class="test.bean.User" p:name="jack" p:age="20" p:car-ref="car"  >
	</bean>

P名称空间属性注入,导入P名称空间  xmlns:p="http://www.springframework.org/schema/p",使用p:属性完成注入 

p:属性名="值"        p:属性名-ref="bean名称"     

(注):P名称空间走set注入方法。

spel注入: spring Expression Language sping表达式语言-->
<bean  name="user4" class="test.bean.User" >
		<property name="name" value="#{user.name}" ></property>
		<property name="age" value="#{user3.age}" ></property>
		<property name="car" ref="car" ></property>
</bean>

SPEL注入,这种方法是通过在#{ }中填写其他配置好的对象的信息,然后引用其他对象属性的值作为自己属性的值。

<!-- 复杂类型注入 -->
<bean name="cb" class="test.bean.CollectionBean" >
	<!-- 数组类型注入 -->
	<property name="arr">
		<array>
			<value>tom</value>
			<value>jerry</value>
			<ref bean="user4" />
		</array>
	</property>
	<!-- list类型注入-->
	<property name="list"  >
		<list>
			<value>jack</value>
			<value>rose</value>
			<ref bean="user3" />
		</list>
	</property>
	<!-- map类型注入 -->
	<property name="map"  >
		<map>
			<entry key="url" value="jdbc:mysql:///crm" ></entry>
			<entry key="user" value-ref="user4"  ></entry>
			<entry key-ref="user3" value-ref="user2"  ></entry>
		</map> 
	</property>
	<!-- prperties 类型注入 -->
	<property name="prop"  >
		<props>
			<prop key="driverClass">com.jdbc.mysql.Driver</prop>
			<prop key="userName">root</prop>
			<prop key="password">1234</prop>
		</props>
	</property>
</bean>

复杂类型的注入,如果数组或list中只准备注入一个值(对象),直接使用value|ref即可 ,多值可用<list>标签配置,map类型用<entry>标签配置,properties类型用<prop>标签配置。

配置文件包含

Spring的配置文件中提供了<import>标签去引入其他的配置文件,可实现多配置文件。

<import resource="applicationContext2.xml"></import>

猜你喜欢

转载自blog.csdn.net/yan245294305/article/details/81273454