小村村长

导航

SpringIOC创建bean对象的三种方式

通常有3种方式,第一种用于我们自定义的类,后面两种是为了应用第三方jar包中的类,根据jar中的创建对象的方式进行选择

创建bean的类型

<!--
        scope: 设置bean对象的作用范围
            singleton: 单实例对象 默认
            prototype: 多实例对象
    -->

<bean scope="prototype" id="AccountService4" class="com.village.service.impl.AccountServiceImpl"></bean>
 测试类
public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        for (int i = 0; i < 10; i++) {
            AccountService service = ac.getBean("AccountService4", AccountService.class);
            System.out.println(service);
        }
    }

 

第一种:通过默认构造函数创建

此种方式通常用于我们自己写的类,在spring中配置。
<!--
IOC容器创建Bean对象的多种方式
方式1: 无参构造创建Bean对象
bean标签: 声明需要创建类对象
id: 唯一标识,获取此类对象时,需要根据id获取
class: 被创建的类的全限定名
-->

<bean id="AccountService" class="com.village.service.impl.AccountServiceImpl"></bean>

 

第二种:通过工厂对象的方法来创建(静态)

class属性: 指定的是工厂的全限定类名
factory-method属性:指定的是工厂中用于创建对象的静态方法

<!--
方式2: 使用工厂的静态方法创建类对象
//1.创建工厂对象
//2.在工厂对象中提供一个创建对象的静态方法
//3.在配置文件中配置
id: 存放到IOC容器的唯一标识
class: 静态工厂的全限定名
factory-method: 调用指定工厂中的静态方法来创建对象 new UserServiceImpl()
当解析这行配置时,Spring会调用工厂的静态方法,将返回值对象存放到IOC容器
-->

<bean id="AccountService2" class="com.village.factory.StaticFactory" factory-method="createBean"></bean>

此种方法通常用于不是我们自己写的类,而是存在于jar包中已经写好的类。(它都是.class文件),比如Mybatis中的sqlsessionFactory创建对像,不允许直接new对象

 

第三种:通过工厂对象的方法来创建(非静态)

factory-bean属性:指定的是工厂bean的id.
factory-method属性:指定的是工厂中用于创建对象的非静态方法
<!--
方式3: 使用工厂的非静态方法创建类对象
//1.创建工厂对象
//2.在工厂对象中提供一个创建对象的非静态方法
//3.在配置文件中配置
先创建工厂对象,并将工厂对象存放到IOC容器中
再调用工厂对象中的非静态方法创建类对象,并将类对象存放到IOC容器中
-->
<!--先创建工厂对象,并将工厂对象存放到IOC容器中-->
<bean id="InstanceFactory" class="com.village.factory.InstanceFactory"></bean>
<!--调用工厂对象中的非静态方法创建类对象,并将类对象存放到IOC容器中-->
<bean id="AccountService3" factory-bean="InstanceFactory" factory-method="createBean"></bean>

此种方式通常用于不是我们自己写的类。

 完整测试类

package com.village.web;

import com.itheima.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class CreateBeanClient {
    public static void main(String[] args) {

        // 方式1: 调用类的无参构造创建对象
        //demo1();
        // 方式2: 调用工厂的静态方法创建bean对象
        //demo2();
        // 方式3: 调用工厂的非静态方法创建bean对象
        demo3();
    }

    private static void demo3() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        AccountService service = ac.getBean("AccountService3", AccountService.class);
        service.save();
    }

    private static void demo2() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        AccountService service = ac.getBean("AccountService2", AccountService.class);
        service.save();
    }

    private static void demo1() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        AccountService service = ac.getBean("AccountService", AccountService.class);
        service.save();
    }
}

 

package com.village.factory;

import com.itheima.service.impl.AccountServiceImpl;

public class StaticFactory {
    /**
     * 将此方法配置到Spring的配置文件中
     * Spring框架会调用此方法,将返回的对象存放到IOC容器中
     * @return
     */
    public static Object createBean(){
        return new AccountServiceImpl();
    }
}
package com.village.factory;

import com.itheima.service.impl.AccountServiceImpl;

public class InstanceFactory {
    /**
     * 将此方法配置到Spring的配置文件中
     * Spring调用此方法,将方法的返回值存放到IOC容器中
     * @return
     */
    public Object createBean(){
        return new AccountServiceImpl();
    }
}

 

posted on 2022-01-25 23:00  小村村长  阅读(269)  评论(0编辑  收藏  举报