Spring中的三种创建对象的方法

2022-08-28 11:19:40

我们都知道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则是方法名,该方法的返回值也必须是实例类的对象。

  • 作者:x瓜皮
  • 原文链接:https://blog.csdn.net/qq_59801860/article/details/120361214
    更新时间:2022-08-28 11:19:40