构造方法实例化
通过类的构造方法直接创建Bean实例,这是Spring容器默认的实例化方式。需要在XML配置中指定类名,容器会调用无参构造方法创建对象。此方式适用于简单对象创建,无需复杂初始化逻辑。
<bean id="exampleBean" class="com.example.ExampleBean"/>
静态工厂方法实例化
通过指定工厂类的静态方法创建Bean实例。适用于需要统一管理对象创建逻辑的场景(如单例模式)。静态工厂类无需实例化,直接通过类名调用方法。
<bean id="clientService" class="com.example.ClientService" factory-method="createInstance"/>
对应的工厂类需包含静态方法:
public class ClientService { private static ClientService instance = new ClientService(); public static ClientService createInstance() { return instance; } }
FactoryBean接口实例化
通过实现
FactoryBean
接口自定义复杂对象的创建逻辑。FactoryBean本身是一个Bean,但其getObject()
方法返回的目标对象才是实际注入的Bean。适用于创建第三方库对象或具有复杂依赖的实例。<bean id="toolFactory" class="com.example.ToolFactoryBean"/>
实现
FactoryBean
的示例:public class ToolFactoryBean implements FactoryBean<Tool> { @Override public Tool getObject() throws Exception { return new SpecialTool(); // 返回实际需要的对象 } @Override public Class<?> getObjectType() { return Tool.class; } }
getObject()
方法定义了实际返回的 bean 实例。在这个例子中,每次调用都会创建一个新的 SpecialTool 实例。
getObjectType()
方法返回工厂创建的对象的类型。这里返回的是 Tool.class,表示这个工厂创建的是 Tool 类型的对象。核心区别
- 构造方法:直接调用目标类构造器,适合简单无参对象。
- 静态工厂:解耦对象创建逻辑,隐藏实现细节,支持单例等模式。
- FactoryBean:提供更灵活的实例化流程,可封装复杂初始化(如数据库连接池)。
静态工厂与FactoryBean的关键差异在于,前者通过类方法返回实例,后者通过接口实现,且FactoryBean本身可被Spring容器管理。
静态工厂的构造方式一般为了兼容老款的项目
factorybean方法: