我想创建在对谷歌吉斯的DI框架中继一个java web应用程序的适当性管理策略。谷歌吉斯物业管理
我想有一个机构回答下列三个条件:
- 我想能够注入使用吉斯(@Named)属性
- 我想能够访问属性以静态方式
- 机制应该支持性的优先级,这意味着一个属性可以被包裹在某一个值,部署战争,但它也可以在目标系统级或本地文件系统(目标机的冗余我部署),在这种情况下,战争中的价值将被价值th覆盖在目标机器中存在。
我相信这是一个标准的要求。现在,使用guice标准活页夹,我可以很容易地得到第一个要求,但不是其他两个。为了让其他两个我创建了自己的类,执行以下操作:
- 包裹和暴露吉斯的结合方法(那些结合性质)例如:
public static void bindString(AnnotatedBindingBuilder<String> binder, String property, String defaultValue) { binder.annotatedWith(Names.named(property)).toInstance(getProperty(property, defaultValue)); }
在哪里getProperty方法知道如何处理我的属性(从战争或系统级别获取值)以及静态公开属性。
所以基本上只要我使用我为属性绑定创建的这个实用工具,我很好,它涵盖了我所有的需求,但是一旦我使用标准的guice绑定,我就失去了第二个和第三个需求。
有没有办法覆盖吉斯绑定,并得到所有3个要求?
有一次,我在弹簧基于应用程序相同的challange,是很容易的。我实现ApplicationContextInitializer以下方法:
@Override public void initialize(ConfigurableWebApplicationContext ctx) { PropertySource<Map<String, Object>> localProps = null; try { localProps = new ResourcePropertySource(new ClassPathResource(LOCAL_PROPERTIES_FILE_NAME)); } catch (IOException e) { LOG.fatal("Could not load local properties from classpath " + LOCAL_PROPERTIES_FILE_NAME); return; } LOG.info("Loaded configuration from classpath local file " + LOCAL_PROPERTIES_FILE_NAME); ctx.getEnvironment().getPropertySources().addFirst(localProps); }
所以这给了我一个方式具有最高优先级添加本地属性,以我的环境。在与战争财产重叠的情况下,当地优先权较高。另外,我静静地公开了我的环境,因此我可以静态访问我的属性(对于不受容器管理的服务,主要是遗留的)。
如何我吉斯实现这一目标?
你什么意思,你想在一个静态的方式来访问属性?这是否意味着您有用于访问特定属性的用例,但直到运行时才知道要访问哪个属性? –
我希望能够使用像SomeClass.getProperty(“my.property”);这对于那些不受guice管理的类(通常是遗留的)并且仍然需要访问我的属性很有帮助 – forhas