当前位置: 首页 > 面试题库 >

Spring 3.1 Environment不适用于用户属性文件

沈永贞
2023-03-14
问题内容

我正在做..

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
xmlReader
        .loadBeanDefinitions(new ClassPathResource("SpringConfig.xml"));
PropertySourcesPlaceholderConfigurer propertyHolder = new PropertySourcesPlaceholderConfigurer();
propertyHolder.setLocation(new ClassPathResource(
        "SpringConfig.properties"));
context.addBeanFactoryPostProcessor(propertyHolder);

    ......

context.refresh();

现在在我的@Configuration文件中,如果执行此操作,则不会获取SpringConfig.properties中存在的属性…

@Autowired
private Environment env
.....
env.getProperty("my.property")

但是如果我使用该财产

@Value("${my.property}")
private String myProperty;

我什至尝试添加更多这样的行,但是没有用。

ConfigurableEnvironment env = new StandardEnvironment();
propertyHolder.setEnvironment(env);

有人知道为什么我的属性未加载到环境中吗?谢谢。


问题答案:

PropertySourcesPlaceholderConfigurer直接读取属性文件(就像在Spring
3.0中PropertyPlaceholderConfigurer所做的那样),它只是一个后处理器,不会改变在Spring上下文中使用属性的方式-
在这种情况下,属性仅可用作bean定义占位符。

使用Environment的是PropertySourcesPlaceholderConfigurer,反之亦然。

属性源框架在应用程序上下文级别上工作,而属性占位符配置器仅提供在Bean定义中处理占位符的功能。要使用属性源抽象,您应该使用@PropertySource注释,即用类似的东西装饰您的配置类
@PropertySource("classpath:SpringConfig.properties")

我相信您可以通过编程方式执行相同的操作,即可以在刷新上下文之前获取容器的ConfigurableEnvironment,通过修改其MutablePropertySources(首先需要AbstractApplicationContext
environment通过来获取属性context.getEnvironment()
),getPropertySources().addFirst(new ResourcePropertySource(new ClassPathResource( "SpringConfig.properties")));但这不太可能您想做的事情-
如果您已经拥有一个带@Configuration注释的类,用它装饰起来@PropertySource("classpath:SpringConfig.properties")要简单得多。

至于PropertySourcesPlaceholderConfigurer实例-
它会自动从其应用程序上下文中获取属性源(因为它实现EnvironmentAware),因此您只需要注册它的默认实例即可。

有关自定义属性源实现的示例,请参见http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-
property-
management/



 类似资料:
  • 问题内容: 每当我将其悬停在其父元素上时,我一直试图使用css来显示Hidden Div淡入。 到目前为止,我所能做的就是让隐藏的div显示出来,但是到目前为止,还没有轻松的过渡。 这是我的代码: HTML: CSS: 关于我在做什么错的任何线索吗?当我将鼠标悬停在按钮上时,只是试图为隐藏的内容提供平滑的效果。提前致谢! 问题答案: 从页面中删除一个块,就好像它从来没有出现过一样。块不能部分显示;

  • 如果我将图像源设置为CSS属性,它就可以正常工作,但是如果我通过HTML设置图像源,它就会完全中断。为什么? 为了让这些图像正确显示,不管宽度/高度组合如何,我是否必须从CSS声明它们的来源? 编辑:不确定反对票的问题是什么...我只是想知道是否有可能让图像自动裁剪,这样即使你独立地改变它们的高度和宽度,它们也能保持原始的方面比例。当使用背景图像时,这是完美的,但显然不是内容。不管怎样,我现在得到

  • 问题内容: 我的表单中有一个文件上传控件。我正在使用Angular JS。当我放置必填属性以验证是否已选择文件时,它不起作用。 您能否提出建议,为什么不起作用? 问题答案: 正是ngModelController根据像这样的属性在Angular中进行验证。但是,当前不支持ng-model服务。要使其正常工作,您可以创建如下指令: 标记示例: 看看我的工作plnkr示例。

  • 问题内容: 我有一个要在用户点击时显示/隐藏的组件。 就像这样: 和 在简单地设置属性为true或false适当。我正在使用。 问题是我的按钮的属性值。它明确列出了和。 只要始终存在(仅更改其标签),则仅在属性为true 时才存在。否则它说: malformedXML:更新期间:找不到说明 我怎么解决这个问题? 我不想回到隐藏源代码中的元素的位置,所以我不想使用任何jQuery toggle(-)

  • 我试图初始化log4j记录器使用SpringIOC和使用财产onfigurator.configure配置记录器,但财产onfigurator.configure不工作。 我的问题是如何将配置(log4j.properties)传递给Logger类? 波姆。xml 混淆班 log4j。性质

  • 我编写了自己的用户控件,其中包含一个列表视图,并且其 ItemsSource 是设置运行时。我想从用户控件 xaml 设置我自己的 ListViewItem 样式,但我无法让它工作,无论如何,从 App.xaml 设置它完美无缺,所以我想知道为什么? 用户控件 xaml 如下所示: 我想应用的样式是这样的: 我知道当从用户控件本身执行样式时,不会应用该样式,因为在输出窗口中,我看到添加的每个Lis