- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有什么方法可以在不直接使用 Spring Context 的情况下加载标有 @ConfigurationProperties
的类?基本上我想重用 Spring 所做的所有智能逻辑,但对于我在 Spring 生命周期之外手动实例化的 bean。
我有一个在 Spring (Boot) 中愉快加载的 bean,我可以将它注入(inject)到我的其他服务 bean 中:
@ConfigurationProperties(prefix="my")
public class MySettings {
String property1;
File property2;
}
有关更多信息,请参阅 spring docco http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-command-line-args
但现在我需要从在 Spring 之外(由 Hibernate)创建的类访问这个 bean。该类在应用程序启动过程中创建得如此之早,以至于 Spring Boot 尚未通过经典的查找帮助器方法或 roll-my-own 静态引用使应用程序上下文可用。
所以我反而想做这样的事情:
MySettings mySettings = new MySettings();
SpringPropertyLoadingMagicClass loader = new SpringPropertyLoadingMagicClass();
loader.populatePropertyValues(mySettings);
并且让 MySettings 最终从命令行、系统属性、app.properties 等加载所有值。Spring 中是否有某个类执行类似的操作,或者它是否与应用程序上下文交织在一起?
显然我可以自己加载 Properties 文件,但我真的想保留 Spring Boot 围绕使用命令行变量(例如 --my.property1=xxx)、系统变量、application.properties 甚至 yaml 的逻辑文件,以及它围绕宽松绑定(bind)和类型转换的逻辑(例如 property2 是一个文件),因此它的工作方式与在 Spring 上下文中使用时完全相同。
可能还是白日梦?
感谢您的帮助!
最佳答案
我有同样的“问题”。这是我在 SpringBoot 版本 1.3.xxx 和 1.4.1 中解决它的方法。
假设我们有以下 yaml 配置文件:
foo:
apis:
-
name: Happy Api
path: /happyApi.json?v=bar
-
name: Grumpy Api
path: /grumpyApi.json?v=grrr
我们有以下ConfigurationProperties
:
@ConfigurationProperties(prefix = "foo")
public class ApisProperties {
private List<ApiPath> apis = Lists.newArrayList();
public ApisProperties() {
}
public List<ApiPath> getApis() {
return apis;
}
public static class ApiPath {
private String name;
private String path;
public String getName() {
return name;
}
public void setName(final String aName) {
name = aName;
}
public String getPath() {
return path;
}
public void setPath(final String aPath) {
path = aPath;
}
}
}
然后,要以编程方式 执行 Spring Boot 的“神奇”操作(例如,在静态方法中加载一些属性),您可以执行以下操作:
private static ApisProperties apiProperties() {
try {
ClassPathResource resource;
resource = new ClassPathResource("/config/application.yml");
YamlPropertiesFactoryBean factoryBean;
factoryBean = new YamlPropertiesFactoryBean();
factoryBean.setSingleton(true); // optional depends on your use-case
factoryBean.setResources(resource);
Properties properties;
properties = factoryBean.getObject();
MutablePropertySources propertySources;
propertySources = new MutablePropertySources();
propertySources.addLast(new PropertiesPropertySource("apis", properties));
ApisProperties apisProperties;
apisProperties = new ApisProperties();
PropertiesConfigurationFactory<ApisProperties> configurationFactory;
configurationFactory = new PropertiesConfigurationFactory<>(apisProperties);
configurationFactory.setPropertySources(propertySources);
configurationFactory.setTargetName("foo"); // it's the same prefix as the one defined in the @ConfigurationProperties
configurationFactory.bindPropertiesToTarget();
return apisProperties; // apiProperties are fed with the values defined in the application.yaml
} catch (BindException e) {
throw new IllegalArgumentException(e);
}
}
关于java - 我可以在没有 Spring AppContext 的情况下手动加载 @ConfigurationProperties 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940583/
AppContext 似乎只有一个名为 BaseDirectory 的属性。但是 Environment 类似乎有更多的属性和方法。 那么 AppContext 现在是否被 Environment 类
我在一个 github project 中找到了类: public class AppContext { private static Context sContext; privat
根据官方指南,我目前正在努力研究 android 平台的架构组件: 在我的应用程序中,我目前需要存储一个字符串列表(名称)并在多个位置( Activity 和服务)访问它。我想到了 2 种可能的方法:
是否可以使用对 getApplicationContext() 的引用从后台线程引发 AlertDialog? 我正在尝试使用该代码,但它不起作用 new Thread(){
我附上了我的 JDK 附带的 src.zip,但它似乎缺少一些文件。 就好像我没有任何 sun.*; 包一样。如果它们可能因 java.awt.AppContext 而改变,我会理解,但这不会退出。
我有一个grails应用程序,该应用程序使用appContext.xml定义bean。当我运行该应用程序时,一切都正常。但是,当我尝试使用@ContextConfiguration运行单元测试时,所有
我有两个同名、同类的 bean。我想模拟其中一个(模拟不是通过@Mock注释完成的,而是由于某种原因在Spring文件中完成的),而另一个则保持正常(用于集成测试)。 我能想到的一种方法是更改 @
在 Play 1.x 应用程序中,我想创建一个名为 AppContext 的类,它将作为应用程序中服务之间的粘合层。它可以作为一个简单的依赖注入(inject)器,但我也希望它能够控制事件的工作流,从
我在 Eclipse 中创建了一个小 bean 类。它在 NetBeans 中工作,但在 Eclipse 中它说 Resource leak: 'appContext' is never closed
我的团队正在分析我们的 Swing 应用程序,以确保在不再使用时对所有内容进行垃圾回收。我们遇到了一个奇怪的问题。 我们只是打开一个新窗口 (JFrame) 然后关闭它。此框架包含一个 EmptyPa
我正在开发 ASP.NET Core 3.1 Web API并拥有我的 swagger设置。我已将 swagger 文档添加到我的项目中。 右键单击 API Project -> Build -> O
我有一个 Spring ApplicationContext,我在其中声明 Jetty 服务器 bean 并启动它。在 Jetty 内部,我有一个 DispatcherServlet 和几个 Cont
我正在尝试使用 Spring 创建 REST Web 服务。 我有一个 Controller ,一个 appContext。 Controller : @Controller public class
有什么方法可以在不直接使用 Spring Context 的情况下加载标有 @ConfigurationProperties 的类?基本上我想重用 Spring 所做的所有智能逻辑,但对于我在 Spr
我的 WebAppContext 中有列表和 map 。 大多数情况下,这些只能由多个线程读取,但有时需要更新或添加一些数据。 我想知道在不引起 ConcurrentModificationExcep
我在使用最简单的 maven-spring 应用程序时遇到了一些困难。实际上,BeanFactory 找不到 appContext.xml 文件,尽管它位于资源目录中并正确复制到目标目录中。这是我
我将旧的打印机 API 代码迁移到 Java 8,并出现以下警告: Access restriction: The method 'AppContext.getAppContext()' is not
我有 2 个基于 spring 的 jar 文件——parent.jar 和 child.jar。 parent.jar 有一个parent_applicationContext.xml 和一个属性文
如何在 Spring MVC applicationContext.xml 中配置 mongo 集群详细信息(它使用两个服务器)? 数据库.属性 mongo.db.host=server1 mong
当我在嵌入式 Tomcat 上启动 Spring Boot 应用程序并且在启动过程中出现某些问题时(例如没有连接到 DB 或 Liquibase 更新失败或发现循环依赖等),Tomcat 继续监听 8
我是一名优秀的程序员,十分优秀!