首先讲一下bean的声明周期
1. 注册bean到bean工厂(BeanDefinition -> id class ref)
2. 根据注册信息创建bean
3. 装配并注入bean
4. 调用bean( getBean() )
5. 销毁bean
实例话bean的方式主要有三种:构造函数 静态工厂 bean实例的工厂方法
1 Person类
package com.yc.vo;
public class Person {
private int age;
private String pname;
public void setAge(int age) {
this.age = age;
}
public void setPname(String pname) {
this.pname = pname;
}
@Override
public String toString() {
return "Person [age=" + age + ", pname=" + pname + "]";
}
}
2 测试类
package com.yc.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yc.vo.Person;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Person person=(Person)ac.getBean("person");
System.out.println(person.toString());
}
}
3 spring的xml
<bean id="person" class="com.yc.vo.Person">
<property name="age" value="22"></property>
<property name="pname" value="sunslie"></property>
</bean>
(一)构造函数的方法
<bean id="person" class="com.yc.vo.Person">
<property name="age" value="123"></property>
<property name="pname" value="sunslie"></property>
</bean>
打印结果:Person [age=123, pname=sunslie]
在这里它默认的调用了无参的构造函数(如果你Person类中没有构造函数,系统会默认的加一个无参的构造函数。如果你有一个有参的构造函数,那么编译一定会报错)说道这里,那么调用有参的构造函数怎么调用呢?答案是constructor-arg
看案例:现在在Person类中加入一个有参的构造函数
Person(String name,int age){
this.age=age;
pname=name;
}
那么你在xml中写的代码是
<bean id="person" class="com.yc.vo.Person">
<constructor-arg value="sunslie" ></constructor-arg>
<constructor-arg value="123" ></constructor-arg>
</bean>
注意:有几个参数写几个constructor-arg,并且顺序严格按照构造函数里面参数类型来,否则会报错。
(二)静态工厂的方法
我们先来创建一个工厂类PersonFactory
package com.yc.vo;
public class PersonFactory {
public static Person createPerson(){
return new Person();
}
}
注意:里面的createPerson方法一定要是静态的
再来看看xml中spring的配置
<bean id="person" class="com.yc.vo.PersonFactory" factory-method="createPerson">
<property name="age" value="123"></property>
<property name="pname" value="sunslie"></property>
</bean>
打印结果:Person [age=123, pname=sunslie]
(三)通过bean的实例工厂(动态的工厂)
<bean id="personFactory" class="com.yc.vo.PersonFactory">
</bean>
<bean id="person" factory-bean="personFactory" factory-method="createPerson">
<property name="age" value="123"></property>
<property name="pname" value="sunslie"></property>
</bean>
注意:personFactory类中的createPerson方法不是静态的了,如果是静态的则会报错
打印结果:Person [age=123, pname=sunslie]
最后总结下:(摘抄的,觉得挺好的)
方式一:通过bean的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。
方式二:利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。
方式三:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,觉得1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。