能否为FactoryBean添加带@Value注入参数的非空构造方法?
回答:完全可以这么实现!
当然可以给FactoryBean添加带@Value注入参数的非空构造方法,你的示例代码思路是完全正确的,Spring完全支持这种写法。
原理说明
因为你给DateTimeFormatterFactory标注了@Service(属于Spring的@Component衍生注解),Spring会在组件扫描时识别这个类,并尝试创建它的实例。构造方法上的@Value可以直接从配置文件中读取属性值,配合@Autowired(或者Spring 4.3+的自动单构造方法注入)完成参数注入,进而初始化内部的DateTimeFormatter实例。
代码优化建议
其实在Spring 4.3及以上版本中,如果类只有一个构造方法,@Autowired注解是可以省略的,Spring会自动使用这个构造方法进行依赖注入。另外别忘了补全getObjectType()方法(你的示例代码里没写完),这是FactoryBean的必填方法之一。优化后的代码如下:
@Service public class DateTimeFormatterFactory implements FactoryBean<DateTimeFormatter> { private final DateTimeFormatter formatter; // 省略@Autowired,Spring 4.3+自动识别单构造方法 public DateTimeFormatterFactory(@Value("${custom.format}") String format) { this.formatter = DateTimeFormatter.ofPattern(format); } @Override public DateTimeFormatter getObject() { return formatter; } @Override public Class<?> getObjectType() { return DateTimeFormatter.class; } // 可选:默认就是true,显式声明更清晰,DateTimeFormatter线程安全适合单例 @Override public boolean isSingleton() { return true; } }
注意事项
- 确保配置文件(比如
application.properties)中存在custom.format属性,如果想避免属性缺失导致启动失败,可以给@Value设置默认值:@Value("${custom.format:yyyy-MM-dd HH:mm:ss}") getObjectType()必须返回正确的Bean类型,这样Spring才能在依赖注入时正确匹配类型DateTimeFormatter是线程安全的,所以这里用单例模式完全没问题,不需要修改isSingleton()的返回值(默认就是true)
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

