spring实例化对象的几种方式(使用XML配置文件)

前言

Spring框架作为一个轻量级的控制反转(IoC)容器,为开发者提供了多种对象实例化的策略。通过这些策略,开发者可以更加灵活地控制对象的生命周期和依赖关系。无论是通过XML配置、注解配置还是Java配置,Spring都能轻松地实现对象的实例化。本文将介绍Spring实例化对象的几种常见方式。

前面的例子都是无参构造实例化,所以这里就不再赘述。

有参构造实例化

先提供一个有参的构造方法:

复制代码
    public UserService(String str){
        System.out.println("有参构造实例化对象"+str);
    }

然后在配置的xml文件使用constructor-arg 添加参数,value为参数的值

复制代码
    <bean id="text" class="com.cc.service.UserService" >
        <constructor-arg name="str" value="hhhhhh"/>
    </bean>

注意name的值要与形参相同:

运行结果如图:


在有多个参数的情况下,还需要使用index属性来配置参数的值(如果name属性都配置了也可以不用index):

复制代码
    public UserService(String str,int string){
        System.out.println("有参构造实例化对象"+str+","+string);
    }

    <bean id="text" class="com.cc.service.UserService" >
        <constructor-arg name="str" index="0" value=""/>
        <constructor-arg name="string" index="1" value="188"/>
    </bean>

工厂方式实例化对象

静态工厂方式实例化对象

静态工厂方式实例化对象是通过属性factory-method来指定一个静态方法,在该静态方法中达到创建对象的目标并返回交给spring容器管理。

复制代码
<bean id="user" class="com.cc.entity.User" factory-method="createObj"></bean>

public class User {

    public static Person createObj() {
        return new Person();
    }
}

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml");
        Person user = (Person) a.getBean("user");
        System.out.println(user);
    }
}

采用静态工厂的方式去实例化对象,只需要在bean标签中指定一个静态方法 即可,用factory-method属性来指定,方面名自已取,反正由idea自动帮我们创建好。然后我们只需要在创建好的静态方法中返回一个对象就搞定了。

实例工厂方式实例化对象

实例工厂方式与静态工厂方式略有不同:

静态工厂方式是一个静态方法,它直接通过类名调用,并返回一个新的bean实例;

在xml配置文件中,使用标签定义bean实例,用factory-method属性指定静态工厂方法名称
实例工厂方式是一个非静态方法,它需要在已经创建了工厂对象的基础上,通过工厂对象来调用。

factory-bean 指定已经创建好的工厂bean的id,再使用factory-method属性指定工厂方法的名称

复制代码
    <bean id="user" class="com.cc.entity.User" ></bean>
    <bean id="person" class="com.cc.entity.Person" factory-bean="user" factory-method="createObj"></bean>

public class User {
    public User createObj() {
        return new User();
    }
}

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml");
        Object bean = a.getBean("person");
        System.out.println(bean);
    }
}

实现FactoryBean方式

通过这种方式创建对象,需要实现FactoryBean接口,并且实现它的方法,一般只需实现以下两个方法:

T getObject() : 返回创建的对象的实例;

Class<> getObjectType() : 返回创建的对象实例的类;

然后在Spring的配置文件中,将 FactoryBean实现类注册为一个Bean

复制代码
public class User implements FactoryBean<Person> {
    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }
}


<bean class="com.cc.entity.User" id="user"></bean>
相关推荐
野犬寒鸦3 分钟前
从零起步学习并发编程 || 第四章:synchronized底层源码级讲解及项目实战应用案例
java·服务器·开发语言·jvm·后端·学习·面试
!停4 分钟前
数据结构二叉树——堆
java·数据结构·算法
virus59458 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
NE_STOP9 小时前
spring6-注解式开发
spring
没差c9 小时前
springboot集成flyway
java·spring boot·后端
时艰.9 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
编程彩机10 小时前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
笨蛋不要掉眼泪10 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
Yvonne爱编码10 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
像少年啦飞驰点、11 小时前
零基础入门 Spring Boot:从“Hello World”到可上线微服务的完整学习指南
java·spring boot·微服务·编程入门·后端开发