希望我的问题是相当不言自明的 - 我将用一些示例代码来说明它。
@Component
@PropertySource("classpath:/my-properties.properties")
public class SomeProperties {
@Autowired
Environment env;
// private methods
public boolean isEnabled(Foo foo) {
// call private methods, call env.getProperty, return value
}
}
@Component // it makes no difference whether it's there or not
public class MyCondition implements Condition {
@Autowired // doesn't make a difference
private SomeProperties someProperties;
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
// ...
boolean b = someProperties.isEnabled(foo); // get NPE on this line
// ...return
}
}
@Component
@Conditional(MyCondition.class)
public class Bar {
// stuff
}
(这里我使用Spring Boot来配置Spring。虽然我怀疑它有什么不同 - 因为@Component
bean在引导后绝对是可访问的,所以它似乎不是一个问题的方式Spring已配置。)
问题是我在指定的行上收到了NullPointerException
,因为someProperties
是null
。这可能是因为在运行条件时,Spring bootstrap的自动装配/实例化阶段还没有发生。
有没有办法以这种方式访问Spring Properties - 比如强制Spring在正常情况下加载bean?或者是使用标准Java / Apache Commons属性代码而不是Spring的唯一方法?