Spring Bean基本管理
一、使用setter方式完成依赖注入
下面是Bean和beans-config.xml文件。
public
class HelloBean {
private String helloWord;
//...省略getter、setter方法
}
private String helloWord;
//...省略getter、setter方法
}
xml
version
="1.0"
encoding
="UTF-8"
?>
"http://www.springframework.org/dtd/spring-beans.dtd">
< beans >
< bean id ="helloBean"
class ="onlyfun.caterpillar.HelloBean" >
< property name ="helloWord" >
< value >Hello!Justin! value >
property >
bean >
beans >
"http://www.springframework.org/dtd/spring-beans.dtd">
< beans >
< bean id ="helloBean"
class ="onlyfun.caterpillar.HelloBean" >
< property name ="helloWord" >
< value >Hello!Justin! value >
property >
bean >
beans >
public
class SpringDemo {
public static void main(String[] args) {
Resource rs = new FileSystemResource( "beans-config.xml");
BeanFactory factory = new XmlBeanFactory(rs);
HelloBean hello = (HelloBean) factory.getBean( "helloBean");
System.out.println(hello.getHelloWord());
}
}
public static void main(String[] args) {
Resource rs = new FileSystemResource( "beans-config.xml");
BeanFactory factory = new XmlBeanFactory(rs);
HelloBean hello = (HelloBean) factory.getBean( "helloBean");
System.out.println(hello.getHelloWord());
}
}
二、使用constructor方式完成注入
public
class HelloBean {
private String name;
private String helloWord;
// 建议有要无参数建构方法
public HelloBean() {
}
public HelloBean(String name, String helloWord) {
this.name = name;
this.helloWord = helloWord;
}
//...省略getter、setter方法
}
private String name;
private String helloWord;
// 建议有要无参数建构方法
public HelloBean() {
}
public HelloBean(String name, String helloWord) {
this.name = name;
this.helloWord = helloWord;
}
//...省略getter、setter方法
}
xml
version
="1.0"
encoding
="UTF-8"
?>
"http://www.springframework.org/dtd/spring-beans.dtd">
< beans >
< bean id ="helloBean"
class ="onlyfun.caterpillar.HelloBean" >
< constructor-arg index ="0" >
< value >Justin value >
constructor-arg >
< constructor-arg index ="1" >
< value >Hello value >
constructor-arg >
bean >
beans >
"http://www.springframework.org/dtd/spring-beans.dtd">
< beans >
< bean id ="helloBean"
class ="onlyfun.caterpillar.HelloBean" >
< constructor-arg index ="0" >
< value >Justin value >
constructor-arg >
< constructor-arg index ="1" >
< value >Hello value >
constructor-arg >
bean >
beans >
public
class SpringDemo {
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext( "beans-config.xml");
HelloBean hello = (HelloBean) context.getBean( "helloBean");
System.out.print( "Name: ");
System.out.println(hello.getName());
System.out.print( "Word: ");
System.out.println(hello.getHelloWord());
}
}
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext( "beans-config.xml");
HelloBean hello = (HelloBean) context.getBean( "helloBean");
System.out.print( "Name: ");
System.out.println(hello.getName());
System.out.print( "Word: ");
System.out.println(hello.getHelloWord());
}
}
三、属性参考
public
class HelloBean {
private String helloWord;
private Date date;
//...省略getter、setter方法
}
private String helloWord;
private Date date;
//...省略getter、setter方法
}
<
beans
>
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" >
< property name ="helloWord" >
< value >Hello! value >
property >
< property name ="date" >
< ref bean ="dateBean" />
property >
bean >
beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" >
< property name ="helloWord" >
< value >Hello! value >
property >
< property name ="date" >
< ref bean ="dateBean" />
property >
bean >
beans >
public
class SpringDemo {
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext( "beans-config.xml");
HelloBean hello = (HelloBean) context.getBean( "helloBean");
System.out.print(hello.getHelloWord());
System.out.print( " It's ");
System.out.print(hello.getDate());
System.out.println( ".");
}
}
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext( "beans-config.xml");
HelloBean hello = (HelloBean) context.getBean( "helloBean");
System.out.print(hello.getHelloWord());
System.out.print( " It's ");
System.out.print(hello.getDate());
System.out.println( ".");
}
}
四、“byType”自动绑定
将“三”中的配置文件改为下面,即可完成bean属性的按类型自动绑定。
<
beans
>
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="byType" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="byType" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
五、“byName”自动绑定
将“三”中的配置文件改为下面,即可完成bean属性的按名称自动绑定。
<
beans
>
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="byName" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="byName" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
六、“constructor”自动绑定
将“三”中的配置文件改为下面,即可完成bean属性的按构造方法自动绑定。在建立依赖关系时,Srping容器会试图比对容器中的Bean实例类型,及相关的构造方法上的参数类型,看看在类型上是否符合,如果有的话,则选用该构造方法来建立Bean实例。如果无法绑定,则抛出org.springframework.beans.factory.UnsatisfiedDependencyException异常。
<
beans
>
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="constructor" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="constructor" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
六、“autodetect”自动绑定
将“三”中的配置文件改为下面,即可完成bean属性的自动绑定,这个自动绑定是Spring会尝试用入constructor来处理依赖关系的建立,如果不行,则再尝试用byType类建立依赖关系。
<
beans
>
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="autodetect" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="autodetect" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
七、依赖检查方式
在自动绑定中,由于没办法从定义文件中,清楚地看到是否每个属性都完成设定,为了确定某些依赖关系确实建立,您可以假如依赖检查,在标签使用时设定"dependency-check",可以有四种依赖检查方式:simple、objects、all、none。
simple:只检查简单的类型(像原生数据类型或字符串对象)属性是否完成依赖关系,。
objects:检查对象类型的属性是否完成依赖关系。
all:则检查全部的属性是否完成依赖关系。
none:设定是默认值,表示不检查依赖性。
<
beans
>
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="autodetect" dependeny-check ="all" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="autodetect" dependeny-check ="all" >
< property name ="helloWord" >
< value >Hello! value >
property >
bean >
beans >
八、集合对象注入
对于像数组、List、Set、Map等集合对象,在注入前必须填充一些对象至集合中,然后再将集合对象注入至所需的Bean时,也可以交由Spring的IoC容器来自动维护或生成集合对象,并完成依赖注入。
public
class SomeBean {
private String[] someStrArray;
private Some[] someObjArray;
private List someList;
private Map someMap;
public String[] getSomeStrArray() {
return someStrArray;
}
public void setSomeStrArray(String[] someStrArray) {
this.someStrArray = someStrArray;
}
public Some[] getSomeObjArray() {
return someObjArray;
}
public void setSomeObjArray(Some[] someObjArray) {
this.someObjArray = someObjArray;
}
public List getSomeList() {
return someList;
}
public void setSomeList(List someList) {
this.someList = someList;
}
public Map getSomeMap() {
return someMap;
}
public void setSomeMap(Map someMap) {
this.someMap = someMap;
}
}
private String[] someStrArray;
private Some[] someObjArray;
private List someList;
private Map someMap;
public String[] getSomeStrArray() {
return someStrArray;
}
public void setSomeStrArray(String[] someStrArray) {
this.someStrArray = someStrArray;
}
public Some[] getSomeObjArray() {
return someObjArray;
}
public void setSomeObjArray(Some[] someObjArray) {
this.someObjArray = someObjArray;
}
public List getSomeList() {
return someList;
}
public void setSomeList(List someList) {
this.someList = someList;
}
public Map getSomeMap() {
return someMap;
}
public void setSomeMap(Map someMap) {
this.someMap = someMap;
}
}
public
class Some {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
xml
version
="1.0"
encoding
="UTF-8"
?>
"http://www.springframework.org/dtd/spring-beans.dtd">
< beans >
< bean id ="some1" class ="onlyfun.caterpillar.Some" >
< property name ="name" >
< value >Justin value >
property >
bean >
< bean id ="some2" class ="onlyfun.caterpillar.Some" >
< property name ="name" >
< value >momor value >
property >
bean >
< bean id ="someBean" class ="onlyfun.caterpillar.SomeBean" >
< property name ="someStrArray" >
< list >
< value >Hello value >
< value >Welcome value >
list >
property >
< property name ="someObjArray" >
< list >
< ref bean ="some1" />
< ref bean ="some2" />
list >
property >
< property name ="someList" >
< list >
< value >ListTest value >
< ref bean ="some1" />
< ref bean ="some2" />
list >
property >
< property name ="someMap" >
< map >
< entry key ="MapTest" >
< value >Hello!Justin! value >
entry >
< entry key ="someKey1" >
< ref bean ="some1" />
entry >
map >
property >
bean >
beans >
"http://www.springframework.org/dtd/spring-beans.dtd">
< beans >
< bean id ="some1" class ="onlyfun.caterpillar.Some" >
< property name ="name" >
< value >Justin value >
property >
bean >
< bean id ="some2" class ="onlyfun.caterpillar.Some" >
< property name ="name" >
< value >momor value >
property >
bean >
< bean id ="someBean" class ="onlyfun.caterpillar.SomeBean" >
< property name ="someStrArray" >
< list >
< value >Hello value >
< value >Welcome value >
list >
property >
< property name ="someObjArray" >
< list >
< ref bean ="some1" />
< ref bean ="some2" />
list >
property >
< property name ="someList" >
< list >
< value >ListTest value >
< ref bean ="some1" />
< ref bean ="some2" />
list >
property >
< property name ="someMap" >
< map >
< entry key ="MapTest" >
< value >Hello!Justin! value >
entry >
< entry key ="someKey1" >
< ref bean ="some1" />
entry >
map >
property >
bean >
beans >
public
class SpringDemo {
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext(
"beans-config.xml");
SomeBean someBean =
(SomeBean) context.getBean( "someBean");
// 取得数组型态依赖注入对象
String[] strs =
(String[]) someBean.getSomeStrArray();
Some[] somes =
(Some[]) someBean.getSomeObjArray();
for( int i = 0; i < strs.length; i++) {
System.out.println(strs[i] + ","
+ somes[i].getName());
}
// 取得List型态依赖注入对象
System.out.println();
List someList = (List) someBean.getSomeList();
for( int i = 0; i < someList.size(); i++) {
System.out.println(someList.get(i));
}
// 取得Map型态依赖注入对象
System.out.println();
Map someMap = (Map) someBean.getSomeMap();
System.out.println(someMap.get( "MapTest"));
System.out.println(someMap.get( "someKey1"));
}
}
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext(
"beans-config.xml");
SomeBean someBean =
(SomeBean) context.getBean( "someBean");
// 取得数组型态依赖注入对象
String[] strs =
(String[]) someBean.getSomeStrArray();
Some[] somes =
(Some[]) someBean.getSomeObjArray();
for( int i = 0; i < strs.length; i++) {
System.out.println(strs[i] + ","
+ somes[i].getName());
}
// 取得List型态依赖注入对象
System.out.println();
List someList = (List) someBean.getSomeList();
for( int i = 0; i < someList.size(); i++) {
System.out.println(someList.get(i));
}
// 取得Map型态依赖注入对象
System.out.println();
Map someMap = (Map) someBean.getSomeMap();
System.out.println(someMap.get( "MapTest"));
System.out.println(someMap.get( "someKey1"));
}
}
参考资料:
《Spring开发指南》