Spring实例化Bean的三种方式详解

 更新时间:2025年08月17日 11:06:16   作者:别来无恙149  
在Spring中,构建应用程序主干并且由Spring IoC容器管理的对象被称为beans,bean是一个由Spring容器实例化,组装和管理的对象,本文给大家介绍了Spring实例化Bean的三种方式,并有详细的代码示例供大家参考,需要的朋友可以参考下

在Spring框架中,Bean实例化是IoC容器的核心功能。本文将结合具体代码示例,详细讲解三种实例化方式及其实现方法。

<!--spring.xml-->
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id="Bean1" class="com.qcby.bean.Bean1"></bean> <!-- 普通方法-->
 
    <bean id="bean2" class="com.qcby.bean.MyfactoryBean2" factory-method="creatbean2"></bean><!--静态工厂-->
 
    <!--创建myfactoryBean3的Bean-->
    <bean id="myfactoryBean3" class="com.qcby.bean.MyfactoryBean3"/>
    <bean id="bean3" factory-bean="myfactoryBean3" factory-method="creatBean3"/>
 
</beans>

方式1:默认构造器实例化(最常用)

原理:Spring直接调用类的无参构造器创建实例
适用场景:大多数常规Bean的初始化

代码实现

// Bean1.java
package com.qcby.bean;
public class Bean1 {} // 只需无参构造器
<!-- spring.xml 配置 -->
<bean id="Bean1" class="com.qcby.bean.Bean1"/>
// instancebean1.java
package com.qcby;
public class instancebean1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        Bean1 bean1 = context.getBean(Bean1.class); // 直接通过类型获取
        System.out.println(bean1);
    }
}

特点

  • 配置最简单(只需class属性)
  • Bean类不需要任何特殊方法
  • 通过getBean(Class)可直接获取实例

方式2:静态工厂方法

原理:通过工厂类的静态方法创建实例
适用场景:封装对象创建逻辑

代码实现

// Bean2.java
package com.qcby.bean;
public class Bean2 {}
 
// MyfactoryBean2.java
package com.qcby.bean;
public class MyfactoryBean2 {
    public static Bean2 creatbean2() {
        return new Bean2(); // 静态工厂方法
    }
}
<!-- spring.xml 配置 -->
<bean id="bean2" class="com.qcby.bean.MyfactoryBean2" 
      factory-method="creatbean2"/>
// instancebean2.java
package com.qcby;
public class instancebean2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        Bean2 bean2 = (Bean2) context.getBean("bean2"); // 通过bean id获取
        System.out.println(bean2);
    }
}

特点

  • 工厂类不需要实例化
  • 使用factory-method指定静态方法
  • 适合整合第三方库或复杂初始化逻辑

方式3:实例工厂方法

原理:先创建工厂Bean,再调用其实例方法

适用场景:工厂需要维护状态或多例Bean创建

代码实现

// Bean3.java
package com.qcby.bean;
public class Bean3 {}
 
// MyfactoryBean3.java
package com.qcby.bean;
public class MyfactoryBean3 {
    public Bean3 creatBean3() {
        return new Bean3(); // 实例工厂方法
    }
}
<!-- spring.xml 配置 -->
<bean id="myfactoryBean3" class="com.qcby.bean.MyfactoryBean3"/>
<bean id="bean3" factory-bean="myfactoryBean3" 
      factory-method="creatBean3"/>
// instancebean3.java
package com.qcby;
public class instancebean3 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        Bean3 bean3 = (Bean3) context.getBean("bean3");
        System.out.println(bean3);
    }
}

特点

  • 需要两个Bean配置(工厂+目标)
  • 工厂Bean本身可被注入依赖
  • 使用factory-beanfactory-method关联

三种方式对比表

特性默认构造器静态工厂方法实例工厂方法
配置复杂度⭐ (最简单)⭐⭐⭐⭐⭐ (最复杂)
创建逻辑直接调用构造器静态方法封装实例方法封装
工厂状态不支持无状态可维护状态
适用场景90%常规对象复杂初始化逻辑工厂需依赖其他Bean
获取方式getBean(Class)getBean("id")getBean("id")
src
├── main
│   ├── java
│   │   ├── com.qcby
│   │   │   ├── instancebean1.java
│   │   │   ├── instancebean2.java
│   │   │   └── instancebean3.java
│   │   └── com.qcby.bean
│   │       ├── Bean1.java
│   │       ├── Bean2.java
│   │       ├── Bean3.java
│   │       ├── MyfactoryBean2.java
│   │       └── MyfactoryBean3.java
│   └── resources
│       └── spring.xml

最佳实践建议

1.优先选择默认构造器

<!-- 99%场景适用 -->
<bean id="service" class="com.example.Service"/>

2.静态工厂适用场景

// 当需要复杂初始化时
public class ConnectionFactory {
    public static Connection create() {
        // 复杂初始化代码
        return DriverManager.getConnection(...);
    }
}

3.实例工厂适用场景

// 当工厂需要依赖其他Bean时
public class PaymentFactory {
    @Autowired
    private Config config;
    
    public Payment create() {
        return new Payment(config);
    }
}

4.避免的常见错误

掌握这三种实例化方式,能够灵活应对不同场景的对象创建需求,是深入理解Spring IoC容器的关键基础。

以上就是Spring实例化Bean的三种方式详解的详细内容,更多关于Spring实例化Bean的资料请关注脚本之家其它相关文章!

相关文章

  • Java中常用的6种排序算法详细分解

    Java中常用的6种排序算法详细分解

    这篇文章主要介绍了Java中常用的6种排序算法详细分解,着重说明每个算法的计算过程分解,是探究实现原理级的文章,对于深入理解这些算法有很大帮助,需要的朋友可以参考下
    2014-07-07
  • SpringBoot如何通过Map实现策略模式

    SpringBoot如何通过Map实现策略模式

    策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这篇文章主要介绍了SpringBoot如何通过Map实现策略模式,需要的朋友可以参考下
    2025-03-03
  • 关于Mybatis实体别名支持通配符扫描问题小结

    关于Mybatis实体别名支持通配符扫描问题小结

    MyBatis可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录,这篇文章主要介绍了Mybatis实体别名支持通配符扫描的问题,需要的朋友可以参考下
    2022-01-01
  • 有关ServletConfig与ServletContext的访问

    有关ServletConfig与ServletContext的访问

    下面小编就为大家带来一篇有关ServletConfig与ServletContext的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • java基础的详细了解第八天

    java基础的详细了解第八天

    这篇文章对Java编程语言的基础知识作了一个较为全面的汇总,在这里给大家分享一下。需要的朋友可以参考,希望能给你带来帮助
    2021-08-08
  • java抓取网页或文件中的邮箱号码

    java抓取网页或文件中的邮箱号码

    这篇文章主要为大家详细介绍了java如何抓取网页或文件中的邮箱号码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 使用Java获取html中Select,radio多选的值方法

    使用Java获取html中Select,radio多选的值方法

    以下是对使用Java获取html中Select,radio多选值的方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • java实现五子棋大战

    java实现五子棋大战

    这篇文章主要为大家详细介绍了java实现五子棋大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • MAC上IntelliJ IDEA的svn无法保存密码解决方案

    MAC上IntelliJ IDEA的svn无法保存密码解决方案

    今天小编就为大家分享一篇关于MAC上IntelliJ IDEA的svn无法保存密码解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • SpringBoot+WebSocket搭建简单的多人聊天系统

    SpringBoot+WebSocket搭建简单的多人聊天系统

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。这是一种比较官方的说法,简单点来说就是,在一次TCP连接中,通信的双方可以相互通信。这篇文章主要介绍了SpringBoot+WebSocket搭建简单的多人聊天系统,需要的朋友可以参考下
    2019-10-10

最新评论