Spring IOC容器Bean对象实例化的三种方式

构造器实例化

通过默认构造器创建 空构造⽅法必须存在 否则创建失败

第一步:设置配置⽂件 spring02.xml

配置文件名字自己取,但是后缀一定是xml

<bean id="唯一标识" class="类路径">
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--
        构造器实例化
        对应Bean对象需要提供空构造
    -->
    <bean id="typeDao" class="com.svt.dao.TypeDao"></bean>
</beans>

第二步:编写构造器

完善在配置文件内写的class="com.svt.dao.TypeDao"
在com.svt下新建一个dao包,在包内新建一个TypeDao类,在类中写一个测试方法

public void test(){
        System.out.println("TypeDao test...");
    }

注意:在这个类中写了一个测试方法默认调用无参构造,如果使用了带参构造器,就一定要显示化地写无参构造,不写会出现无法初始化的错误

Failed to instantiate [com.svt.dao.TypeDao]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.svt.dao.TypeDao.<init>()

在这里插入图片描述

第三步:获取实例化对象

在主方法内编写

//加载配置文件
        //ApplicationContext extends ListableBeanFactory extends BeanFactory 所以可以直接写以下加载配置文件的语句
        BeanFactory factory=new ClassPathXmlApplicationContext("spring02.xml");

        //1. 构造器实例化
        TypeDao typeDao= (TypeDao) factory.getBean("typeDao");
        typeDao.test();

结果

在这里插入图片描述

静态工厂实例化 (了解)

1.定义工厂类StaticFactory及对应的静态方法createService
2.配置bean对象对应的工厂类及静态方法(找工厂中写的方法)

    id:需要被实例化的bean对象的id
    class:静态工厂类的路径
    factory-method:静态工厂类中实例化bean对象的静态方法

第一步:定义工厂类StaticFactory

在com.svt下新建一个factory包,在包内新建一个StaticFactory 类,定义对应的静态⽅法,返回实例化对象

package com.svt.factory;

import com.svt.service.TypeService;

/**
 * 定义静态工厂类
 */
public class StaticFactory {
    public static TypeService createService(){
        return new TypeService();
    }
}

第二步:设置配置⽂件 spring02.xml

<bean id="唯一标识" class="静态工厂类的类路径" factory-method="静态工厂类中的静态方法">
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--
        静态工厂实例化
        1.定义工厂类StaticFactory及对应的静态方法createService
        2.配置bean对象对应的工厂类及静态方法(找工厂中写的方法)

        id:需要被实例化的bean对象的id
        class:静态工厂类的路径
        factory-method:静态工厂类中实例化bean对象的静态方法

    -->
    <bean id="typeService" class="com.svt.factory.StaticFactory" factory-method="createService"></bean>
</beans>

第三步:创建service

在com.svt下新建一个service包,在包内新建一个TypeService类,在类中写一个测试方法

package com.svt.service;

public class TypeService {
    public void test(){
        System.out.println("TypeService test...");
    }
}

第四步:获取实例化对象

//ApplicationContext extends ListableBeanFactory extends BeanFactory 所以可以直接写以下加载配置文件的语句
        BeanFactory factory=new ClassPathXmlApplicationContext("spring02.xml");


        //2.静态工厂实例化 (了解)
        TypeService typeService= (TypeService) factory.getBean("typeService");
        typeService.test();

当我们指定Spring使⽤静态⼯⼚⽅法来创建Bean实例时,Spring将先解析配置⽂件,并根据配置
⽂件指定的信息,通过反射调⽤静态⼯⼚类的静态⼯⼚⽅法,并将该静态⼯⼚⽅法的返回值作为
Bean实例,在这个过程中,Spring不再负责创建Bean实例,Bean实例是由⽤户提供的静态⼯⼚⽅
法提供的。

实例工厂实例化(了解)

1.定义工厂类InstanceFactory及对应的非静态方法createTypeController
2.配置工厂对象instanceFactory
3.配置bean对象对应的工厂对象instanceFactory及工厂方法createTypeController

    factory-bean:工厂对象对应的id属性值

第一步:定义工厂类InstanceFactory

package com.svt.factory;

import com.svt.controller.TypeController;

/**
 * 定义实例化工厂
 */
public class InstanceFactory {
    /**
     * 定义方法,返回实例化对象
     * @return
     */
    public TypeController createTypeController(){
        return new TypeController();
    }
}

第二步:设置配置⽂件 spring02.xml

<bean id="工厂类的唯一标识" class="工厂类的类路径"></bean>
<bean id="Bean对象的唯一标识" factory-bean="工厂类的唯一标识" factory-method="工厂类中的方法"></bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--
        实例化工厂实例化
        1.定义工厂类InstanceFactory及对应的非静态方法createTypeController
        2.配置工厂对象instanceFactory
        3.配置bean对象对应的工厂对象instanceFactory及工厂方法createTypeController

        factory-bean:工厂对象对应的id属性值
    -->
<!-- 工厂对象-->
    <bean id="instanceFactory" class="com.svt.factory.InstanceFactory"></bean>
<!-- bean对象-->
    <bean id="typeController" factory-bean="instanceFactory" factory-method="createTypeController"></bean>
</beans>

第三步:完善bean对象

在com.svt下新建一个controller包,在包内新建一个TypeController 类,在类中写一个测试方法

package com.svt.controller;

public class TypeController {
    public void test(){
        System.out.println("TypeController test...");
    }
}

第四步:获取实例化对象

//3.实例化工厂实例化 (了解)
        TypeController typeController= (TypeController) factory.getBean("typeController");
        typeController.test();

Spring三种实例化Bean的⽅式⽐较

  • ⽅式⼀:通过bean的缺省构造函数创建,当各个bean的业务逻辑相互⽐较独⽴的时候或者和外界
    关联较少的时候可以使⽤。
  • ⽅式⼆:利⽤静态factory⽅法创建,可以统⼀管理各个bean的创建,如各个bean在创建之前需要
    相同的初始化处理,则可⽤这个factory⽅法险进⾏统⼀的处理等等。
  • ⽅式三:利⽤实例化factory⽅法创建,即将factory⽅法也作为了业务bean来控制,1可⽤于集成其
    他框架的bean创建管理⽅法,2能够使bean和factory的⻆⾊互换。

开发中项⽬⼀般使⽤⼀种⽅式实例化bean,项⽬开发基本采⽤第⼀种⽅式,交给Spring托管,使⽤时直接拿来使⽤即可。另外两种了解

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今年不养猪只除草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值