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

server/2024/12/20 18:40:16/

前言    

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

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

有参构造实例化 

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

java">    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):

java">    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>
java">public class User {public static Person createObj() {return new Person();}
}
java">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>标签定义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>
java">public class User {public User createObj() {return new User();}
}
java">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

java">public class User implements FactoryBean<Person> {@Overridepublic Person getObject() throws Exception {return new Person();}@Overridepublic Class<?> getObjectType() {return Person.class;}
}
<bean class="com.cc.entity.User" id="user"></bean>


http://www.ppmy.cn/server/151757.html

相关文章

Swagger自动文档工具以及gin-swagger的使用

什么是 Swagger&#xff1f; Swagger 是一个开源的 API 设计和文档工具&#xff0c;旨在帮助开发者更高效地设计、构建、记录和测试 RESTful API。它基于 OpenAPI 规范&#xff08;前身为 Swagger 规范&#xff09;&#xff0c;通过自动化的方式生成交互式 API 文档、客户端 S…

docker入门实践---虚拟机环境配置

文章目录 1.检查内核版本2.确定centos7可以上网3.关闭防火墙4.关闭防火墙5.更换阿里云6.安装gcc7.设置镜像仓库&#xff08;阿里云&#xff09;8更新软件包9.安装docket-ce10.启动docker11.普通用户权限设置 1.检查内核版本 2.确定centos7可以上网 3.关闭防火墙 下面的这个表示…

汽车故障码B100016解析及消除方法

汽车故障码B100016解析 1. 故障码含义 汽车故障码B100016通常与汽车电池系统或发动机相关的问题有关。具体而言,该故障码指示了电池电压过低、电池电流异常或发动机火花塞出现问题。 2. 可能原因 电池电压过低:电池老化或电池充电不足,导致电压低于正常范围。电池电流异常…

js的?. 和??和||有什么区别

let a 0; let b null; let c Hello;console.log(a ?? default); // 0 console.log(b ?? default); // "default" console.log(c ?? default); // "Hello"console.log(a || default); // "default" (因为 0 是假值) console.log(b |…

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址&#xff1a;https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64&#xff0c;一直下一步&#xff0c;选择安装的路径位置&#xff0c;一直下一步就安装完成了。打开Anaconda PowerShell Promp…

省略内容在句子中间

一、使用二分查找法 每次查找时&#xff0c;将查找范围分成两半&#xff0c;并判断目标值位于哪一半&#xff0c;从而逐步缩小查找范围。 循环查找 计算中间位置 mid Math.floor((low high) / 2)。比较目标值 target 和中间位置的元素 arr[mid]&#xff1a; 如果 target ar…

将OBJ或GLB文件转换为3DTiles

格式简介 GLB文件&#xff08;.GLB&#xff09;代表“GL传输格式二进制文件”&#xff0c;是用于共享3D数据的标准化文件格式。确切地说&#xff0c;它可以包含有关三维模型、场景、模型、光源、材质、节点层次和动画的信息。 OBJ文件是一种文本文件格式&#xff0c;这就意味…

C语言学习day24:DLL函数导出详情

简言 上一章我们知道了DLL函数的结构&#xff0c;但是要做到应用软件直接用我们的DLL&#xff0c;那就需要做到一件事情&#xff1a;导出 导出 比如说我们写一个这样的代码&#xff1a; #include "pch.h" void test() {}; BOOL APIENTRY DllMain( HMODULE hModul…