我们都知道Spring主要特点就是将不再使用传统的创建对象,而是将创建对象的步骤都放入xml配置文件当中。那么我们总结一下通过xml配置实例的三种方法:普通构造方法创建(无参数构造方法)、静态工厂方法创建、实例工厂方法创建
普通构造方法创建(无参数构造方法)
这种方法是利用一个类中的无参构造方法创建的,例如我们有Hello这个类:
public class Hello {
private String name;
public Hello(){
//该方法为无参构造方法,如果不写系统会默认自己创建,
//但是当如果编写了有参构造方法,那么该方法就不会被系统自己默认创建
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("Hello"+name);
}
}
然后我们再xml文件中配置一个对应的bean节点,就获取到了该类的实例,如下:
创建的对象名为id的值,property标签的作用是将Hello类中的成员变量赋值,
这里是将name属性的值赋值为xyx_spring
<bean id="hello" class="com.xyx.pojo.Hello">
<property name="name" value="xyx_spring"/>
</bean>
然后我们编写测试文件:
//获取Spring的上下文对象!通俗的讲就是将xml配置文件放到对象context中
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//在context中(实际上是在beans.xml中)寻找id为hello的bean标签,赋给Hello类型的变量
Hello hello = (Hello) context.getBean("hello");
//调用hello中的show方法
hello.show();
输出结果:
静态工厂方法创建
除了普通的构造方法创建之外,我们还可以使用静态工厂方法创建一个bean,如下这个类:
public class Hello2 {
public void show(){
System.out.println("Hello_使用静态工厂方法+spring创建对象");
}
}
我们为上一个类创建一个工厂:
public class Hello_2Factory {
public static Hello2 getBean() {//静态工厂方法---静态表示方法被static修饰,工厂表示返回值为对象
System.out.println("通过工厂创建Hello2的对象");
return new Hello2();
}
}
在工厂方法中返回值是Hello的实例,那么我们只需要调用这个类中的工厂方法(getBean方法)就可以实现静态工厂方法创建bean,所以我们再xml配置文件中写如下:
<bean id="hello2" class="com.xyx.pojo.Hello_2Factory" factory-method="getBean"/>
这里我们可以看出创建的对象是工厂类的对象,但是后面加了一个factory-method属性,而这个属性是声明之后的值为工厂方法,也就是会调用该工厂方法。
测试类如下:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//这里需要注意的是我们不需要刻意的去写调用构造方法,
//在创建对象时,会自动调用factory-method所声明的方法,并且返回另一个类的对象。
Hello2 hello2 = (Hello2) context.getBean("hello2");
hello2.show();
运行结果:
实例工厂方法
代码如下:
实体类:
public class Hello3 {
public void show(){
System.out.println("Hello_使用普通普通普通工厂方法+spring创建对象");
}
}
工厂类:
public class Hello_3Factory {
//实例工厂方法中的方法是没有static修饰的
public Hello3 getBean3() {
System.out.println("通过普通普通普通普通工厂创建Hello3的对象");
return new Hello3();
}
}
当工厂方法不是静态的时候我们的xml文件应该是怎么样的呢:
<!--第一个bean创建的是工厂方法对象,-->
<bean id="hello_3Factory3" class="com.xyx.pojo.Hello_3Factory"/>
<!--第二个bean创建的对象id为hello3,
factory-method表示引用了factory-bean对象中的getBean3方法,通过getBean3方法来创建获取hello3的实例
-->
<bean id="hello3" factory-bean="hello_3Factory3" factory-method="getBean3"/>
测试代码:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Hello3 hello3 = (Hello3) context.getBean("hello3");
hello3.show();
运行结果:
总结:
第三种实例工厂方法与第二种静态工厂方法主要有两个点不同
1、首先工厂方法是静态的,而实例工厂方法是动态的
2、配置文件中静态工厂只需要一个bean标签实现,在这个bean标签中写出要调用的静态方法,该方法的返回值为实体类的对象。而实例工厂在配置文件中需要两个bean标签搭配使用,第二个标签中的facory-bean要引用第一个bean的id,而factory-method则是方法名,该方法的返回值也必须是实例类的对象。