Spring中实例化Bean的三种方式

通过构造器实例化

可以直接使用默认的构造器实例化Bean

先创建Bean04类,为了等一下能够区分是哪种方式实例化的Bean,所以可以在该类中添加一个方法输出一条语句。

public class Bean04 {
    // 构造器实例化
    public void msg() {
        System.out.println("构造器实例化Bean");
    }
}

再编写配置文件bean04.xml,再该配置文件中写入如下内容。

<bean id="bean04" class="top.lukeewin.dao.Bean04"></bean>

最后编写测试类。

	// 测试构造器实例化
    @Test
    public void test01() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean04.xml");
        Bean04 bean04 = (Bean04) ctx.getBean("bean04");
        bean04.msg();
    }

通过静态工厂实例化

创建两个类,一个类作为Bean类,另一个作为静态工厂类,并且静态工厂类中必须有一个静态方法。静态方法返回一个Bean实例。

定义一个Bean类

public class Bean05 {
    // 静态工厂实例化
    public void msg() {
        System.out.println("静态工厂实例化Bean");
    }
}

定义一个静态工厂类

public class StaticBeanFactory {
    // 静态工厂实例化
    public static Bean05 getInstance() {
        return new Bean05();
    }
}

然后需要配置xml配置文件。

需要注意的是:配置文件中一定要记得加上factory-method属性,并且该属性的值是静态工厂中的静态方法,即返回实例的方法。同时还需要注意class路径写的是静态工厂的类路径,而不是实例的类路径。

<bean id="bean05" class="top.lukeewin.dao.StaticBeanFactory" factory-method="getInstance"></bean>

最后编写测试代码

	// 测试静态工厂实例化
    @Test
    public void test02() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean04.xml");
        Bean05 bean05 = (Bean05) ctx.getBean("bean05");
        bean05.msg();
    }

通过实例工厂实例化

创建两个类,一个作为Bean类,另一个作为实例工厂类,**这里不需要定义为静态方法。**只需要设置一下配置文件即可。

定义一个Bean类

public class Bean06 {
    // 实例工厂实例化
    public void msg() {
        System.out.println("实例工厂实例化Bean");
    }
}

定义一个实例工厂类

public class BeanFactory01 {
    // 实例工厂实例化
    private Bean06 getInstance() {
        return new Bean06();
    }
}

然后编写配置文件。

配置文件中需要注意:分别定义两个bean标签,其中实例工厂类中的bean标签和其它普通bean标签一样,但是实例类中的bean标签必须要有factory-bean属性,并且属性的值是实例工厂的id值。还需要有factory-method属性,该属性的值指明了由实例工厂中的哪个方法产生实例。

<bean id="bean06_instance" class="top.lukeewin.dao.BeanFactory01"></bean>
<bean id="bean06" factory-bean="bean06_instance" factory-method="getInstance"></bean>

编写测试代码。

	// 测试实例工厂实例化
    @Test
    public void test03() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean04.xml");
        Bean06 bean06 = (Bean06) ctx.getBean("bean06");
        bean06.msg();
    }

最后三种方式的运行结果如图所示。

image-20210901121728940

视频教程在我的B站中

Q.E.D.


热爱生活,热爱程序