【发布时间】:2020-02-03 23:52:26
【问题描述】:
我正在尝试在 Singleton 类中自动装配一个 bean,我知道避免手动自动装配总是一个最好的主意,但是这个类在很多地方都被使用,所以我不想改变这个的调用者类。
Runner.java
@Component
public class RunnerClass {
@Autowired
public ConfigService configService;
}
ConfigService.java
@Service
public class ConfigService {
private ConfigServiceDAO = ConfigServiceDAO.getInstance();
}
ConfigServiceDAO.java
public class ConfigServiceDAO {
//Bean I want to autowire here....
@Autowired
ConfigServiceDAOBuilder DAOBuilder
public static ConfigServiceDAO getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
public static final ConfigServiceDAO INSTANCE = new ConfigServiceDAO();
private SingletonHolder() {}
}
}
ConfigServiceDAO 中的DAOBuilder 始终为null,这是有道理的,因为我的理解是当手动实例化类时,不会发生spring 注入。 如果我想将 ConfigServiceDAO 保留为非弹簧组件,这里的解决方案是什么?
====编辑==== 我知道可以将 ConfigServiceDAO 作为一个弹簧组件并自动装配所有依赖项。 但是来自不同包的很多类已经调用 ConfigServiceDAO.getInstance().someMethod() 所以我想正确的问题是,将弹簧组件自动装配到手动实例化的类的最佳方法是什么。
【问题讨论】:
-
如果由于手动构造而无法正常工作,那么显而易见的答案可能是不依赖自动布线。
-
我知道.. 只是 ConfigServiceDaoBuilder 是一个具有自动装配 bean 的组件
-
1.如果 ConfigServiceDAO.java 是您在此处删除的整个类,则它不是单例。我可以轻松调用新的 ConfigServiceDAO()。 2. 你正在把它变成一个组件/bean,因为 Spring 不管理实例,所以使用 @Autowired 没有意义。 3.关联是——Runner有一个ConfigService,ConfigService有一个ConfigServiceDAO。您不想让 Spring 管理 bean 却创建它的单例实例,为什么不利用 Spring 特性呢? (除非您有多个容器并且 ConfigDAO 是跨上下文共享的单例)
标签: java spring spring-boot dependency-injection autowired