@Component
public class RunnerClass {
@Autowired
public ConfigService configService;
}
@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保留为非spring组件,那么这里的解决方案是什么?
====Edit=====我知道可以将ConfigServiceDAO作为一个spring组件,并autowire所有依赖项。但是来自不同包的许多类已经调用configServiceDao.getInstance().SomeMethod(),所以我想正确的问题是,将spring组件自动转换为手动实例化的类的最佳方式是什么。
我不知道您的用例,但是您不能在Spring bean之外使用@autowired
注释。但是,如果您真的需要从非Spring代码段访问Spring bean,您可以像下面这样做。然而,这是一种设计依赖关系的非常非Spring的方式。
import org.springframework.context.ApplicationContext;
public enum ApplicationContextHolder {
INSTANCE;
private ApplicationContext applicationContext;
public ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
}
然后您就有了一个配置类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
@Configuration
public class SomeConfig {
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void init() {
ApplicationContextHolder.INSTANCE.setApplicationContext(applicationContext);
}
}
然后,在DAO类中,您将获得对您感兴趣的构建器bean的引用。类似于这样:
public class ConfigServiceDAO {
public static ConfigServiceDAO getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
public static final ConfigServiceDAO INSTANCE =
ApplicationContextHolder.INSTANCE.getApplicationContext().getBean(ConfigServiceDAOBuilder.class).buildConfigServiceDAO()
private SingletonHolder() {}
}
}
我有一个类,它调用两个单例类FirstClass和SecondClass,如下所示。有没有一种方法可以在第二类中访问第一类中计算的数据。在这种情况下,我不想在第二类中进行外部服务调用,因为第一类已经调用了它。相反,只需在第二个数据函数中使用数据(存储在第一类函数中)。有什么方法可以做到。
本文向大家介绍编写一个单例(Singleton)类。相关面试题,主要包含被问及编写一个单例(Singleton)类。时的应答技巧和注意事项,需要的朋友参考一下 把构造函数设置为private,设置一个public、static的对象实例 扩展:搜“C# Singleton”,有线程安全的更牛B的实现
当应用程序启动EncryptionBootstrapConfiguration无法自动装配我的自定义TextEncryptor-https://github.com/spring-cloud/spring-cloud-commons/blob/cde7c7f3118382490c28776f66e0a56f248141fd/spring-cloud-context/src/main/java/or
我试过用@Component注释内部类,使其成为公共类,使其成为公共静态类,等等,但似乎我试过的每一种组合都以抛出这样或那样的错误结束。 作为一个私有的内部类,Spring抱怨它缺少一个构造函数,即使我定义了一个。 作为一个带注释的公共静态类,Spring抱怨它发现了两个bean-TestClass@TestClassInner和TestClass.TestClassInner。如果我使用,它会抱
本文向大家介绍创建一个类Person的简单实例,包括了创建一个类Person的简单实例的使用技巧和注意事项,需要的朋友参考一下 创建一个类Person,包含以下属性:姓名(name)、年龄(age)、朋友(friends数组)、问候(sayhi方法,输出问候语,例如:“你好!”)、交朋友(addFriend方法,向friends里添加一个值),然后创建两个此类的实例:“小张“,22,[“小李”,”
问题内容: 我想创建一个类的单个实例。如何在Java中创建类的单个实例? 问题答案: 要创建类的真正单个实例(在JVM级别上隐含一个单例),应将类设为Java 。 单例模式使用静态,因此在单元测试时通常会造成严重破坏。 这在Joshua Bloch的Effective Java中的条款3中进行了说明。