Spring Bean 作用域
默认提供5中作用域
- singleton(默认)
Spring的ApplicationContext容器在启动时候,自动实例化所有的singleton的bean并缓存于容器当中。 - prototype
每次从容器调用bean时候,都会返回一个新的实例,每次调用getBean()时相当于执行new Bean()的操作。
当用户使用Spring的 WebApplicationContext时,还可以使用另外3中Bean的作用域,即
request
,session
和globalSession
。
Spring Schema配置格式
Spring1.0采用DTD格式
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
dtd 声明,表示该XML里元素和属性等符合spring-beans-2.0.dtd这个文档类型定义标准。
由于DTD有些局限性,比如不支持命名空间。
XML Schema
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
</beans>
XML Schema命名空间作用:
- 避免命名空间冲突,类似Java中的package
- 将不同标签分类。比如aop是针对aop的标签
代码解释 :
-
xmlns="http://www.springframework.org/schema/beans"
声明xml文件默认命名空间,表示未使用其他命名空间的所有标签的默认命名空间 -
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
声明XML Schema实例,声明后就可以使用schemaLocation属性了。 -
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
指定Schema的位置这个属性必须结合命名空间使用。这个属性有两个值.第一个表示需要使用的命名空间。第二个表示供命名空间使用的XML Schema的位置。
xsi:schemaLocation
的含义是如果需要找http://www.springframework.org/schema/beans
命名空间定义,使用版本http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
Bean 基本配置
- 属性注入
- 基本值注入
<bean id="xmlbean" class="com.wuyue.XmlBean">
<property name="name" value="mamba"></property>
</bean>
public class XmlBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这里定义private String name
是非必须的, Bean 容器会找到setName
进行注入。
- 对象类型注入
<property name="node">
<ref bean="node"></ref>
</property>
<bean id="node" class="com.wuyue.Node">
<property name="name" value="heimanba"></property>
</bean>
- 使用p命名空间注入
// 使用p命名空间之前
<bean id="xmlbean" class="com.wuyue.XmlBean">
<property name="name">
<value>dankun</value>
</property>
</bean>
// 使用p之后
<bean id="xmlbean" class="com.wuyue.XmlBean" p:name="dankun2">
</bean>
- 构造方法注入
- 基本使用
<bean id="xmlbean" class="com.wuyue.XmlBean">
<constructor-arg value="dankun"></constructor-arg>
</bean>
public class XmlBean {
private String name;
public XmlBean(String name) {
this.name = name;
}
}
- 按照类型匹配入参
<constructor-arg value="dankun" type="java.lang.String"></constructor-arg>
- 按照索引匹配入参
<bean id="xmlbean" class="com.wuyue.XmlBean">
<constructor-arg index="0" value="dankun" type="java.lang.String">
</constructor-arg>
<constructor-arg index="1" value="age" type="java.lang.String">
</constructor-arg>
</bean>
- 工厂方法注入
工厂方法注入,适用于将非Spring的代码或者第三方类库注入Spring容器进行管理。
public class CarFactory {
public Car createBM() {
Car car = new Car("宝马");
return car;
}
}
<beans>
<bean id="carFactory" class="com.wuyue.CarFactory"></bean>
<bean id="car" factory-bean="carFactory" factory-method="createBM"></bean>
</beans>
当然最好的方式是静态工厂方法注入
public class CarFactory {
public static Car createBM() {
Car car = new Car("宝马");
return car;
}
}
<beans>
<bean id="car" class="com.wuyue.CarFactory" factory-method="createBM"></bean>
</beans>