在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的资料请关注代码网其它相关文章!
发表评论