spring boot 中注入 factorybean 时,默认行为是获取其创建的实例而非工厂本身。若需直接注入工厂对象,需在 bean 名称前添加 &; 符号。例如,定义了一个名为 myfactory 的 factorybean,使用 @autowired 注入时,变量类型应为该工厂创建的对象类型,而注入的名称默认为 myfactory;若要注入工厂实例,则需指定 @qualifier("&myfactory") 或直接在字段名上使用 &myfactory(不推荐,易混淆)。

FactoryBean 默认注入的是实例还是工厂?
默认情况下,Spring 容器会将 FactoryBean 视为一个特殊的 Bean 工厂,通过调用其 getObject() 方法返回实际的业务对象。因此,当你使用 @Autowired 注入一个类型为 FactoryBean 所创建对象的 Bean 时,你得到的是业务对象。这是 Spring 的核心设计,旨在让工厂模式对用户透明。

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component
public class MyFactory implements FactoryBean<String> {
@Override
public String getObject() {
return "Created Instance";
}
@Override
public Class<?> getObjectType() {
return String.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
// 这里注入的是 MyFactory.getObject() 返回的 String 实例
@Autowired
private String myFactory;
}
如何显式注入 FactoryBean 本身?
如果确实需要操作工厂本身,例如在运行时动态获取多个实例或检查工厂状态,必须使用 &; 前缀来引用工厂 Bean。在 XML 配置中,这通常表现为 &beanName;在注解驱动的配置中,可以通过 @Qualifier 指定带前缀的名称,或者在字段命名时直接使用带前缀的名称(但后者不符合常规命名规范,建议用 @Qualifier)。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class AnotherService {
// 明确指定注入名为 &myFactory 的 Bean,即工厂本身
@Autowired
@Qualifier("&myFactory")
private FactoryBean<String> myFactoryBean;
}
当 FactoryBean 抛出异常时会发生什么?
如果在 getObject() 方法中抛出异常,依赖注入过程将失败,导致应用启动报错。这是因为 Spring 在初始化阶段会尝试解析所有依赖,包括 FactoryBean 生成的对象。若工厂无法提供有效实例,容器将无法完成装配。此时,应确保 getObject() 中的逻辑具备足够的健壮性,或在必要时通过 isSingleton() 和缓存机制优化性能。


















