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-bean和factory-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的资料请关注脚本之家其它相关文章!
相关文章
有关ServletConfig与ServletContext的访问
下面小编就为大家带来一篇有关ServletConfig与ServletContext的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-01-01
使用Java获取html中Select,radio多选的值方法
以下是对使用Java获取html中Select,radio多选值的方法进行了详细的分析介绍,需要的朋友可以过来参考下2013-08-08
MAC上IntelliJ IDEA的svn无法保存密码解决方案
今天小编就为大家分享一篇关于MAC上IntelliJ IDEA的svn无法保存密码解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-10-10
SpringBoot+WebSocket搭建简单的多人聊天系统
WebSocket是一种在单个TCP连接上进行全双工通信的协议。这是一种比较官方的说法,简单点来说就是,在一次TCP连接中,通信的双方可以相互通信。这篇文章主要介绍了SpringBoot+WebSocket搭建简单的多人聊天系统,需要的朋友可以参考下2019-10-10


最新评论