Answers:
简而言之,没有。您不能在Spring中自动连线或手动连线静态字段。为此,您必须编写自己的逻辑。
@AutoWired
@Component("NewClass")
public class NewClass{
private static SomeThing someThing;
@Autowired
public void setSomeThing(SomeThing someThing){
NewClass.someThing = someThing;
}
}
someThing
如果静态访问,则无法保证已初始化:NewClass.staticMethodWhichUsesSomething();
如果在应用初始化之前使用,则可能会抛出NPE
Instance methods should not write to "static" fields (squid:S2696)
吗?
@Autowired
可以与设置器一起使用,因此可以让设置器修改静态字段。
最后一个建议... 不要
@Component public class SpringAppEnv{ public static Environment _env; @Autowired public void setEnv(Environment env) {_env = env;} }
在@PostConstruct方法中初始化自动装配的组件
@Component
public class TestClass {
private static AutowiredTypeComponent component;
@Autowired
private AutowiredTypeComponent autowiredComponent;
@PostConstruct
private void init() {
component = this.autowiredComponent;
}
public static void testMethod() {
component.callTestMethod();
}
}
Instance methods should not write to "static" fields (squid:S2696)
吗?
您可以使用ApplicationContextAware
@Component
public class AppContext implements ApplicationContextAware{
public static ApplicationContext applicationContext;
public AppBeans(){
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
然后
static ABean bean = AppContext.applicationContext.getBean("aBean",ABean.class);
免责声明这绝不是标准,并且这样做的方式可能会更好。上述答案均未解决连接公共静态场的问题。
我想完成三件事。
我的物件看起来像这样
private static String BRANCH = "testBranch";
@Value("${content.client.branch}")
public void finalSetBranch(String branch) {
BRANCH = branch;
}
public static String BRANCH() {
return BRANCH;
}
现在我们已经检查了1和2,因为我们无法隐藏它,所以我们如何防止呼叫设置器。
@Component
@Aspect
public class FinalAutowiredHelper {
@Before("finalMethods()")
public void beforeFinal(JoinPoint joinPoint) {
throw new FinalAutowiredHelper().new ModifySudoFinalError("");
}
@Pointcut("execution(* com.free.content.client..*.finalSetBranch(..))")
public void finalMethods() {}
public class ModifySudoFinalError extends Error {
private String msg;
public ModifySudoFinalError(String msg) {
this.msg = msg;
}
@Override
public String getMessage() {
return "Attempted modification of a final property: " + msg;
}
}
这方面将包装所有以final开头的方法,如果调用它们将引发错误。
我认为这不是特别有用,但是如果您是ocd,并且喜欢将豌豆和胡萝卜分开,则这是安全进行此操作的一种方法。
重要提示 Spring在调用函数时不会调用您的方面。使这变得更容易,更糟糕的是,我在弄清楚之前先弄清楚了逻辑。
private static UserService userService = ApplicationContextHolder.getContext().getBean(UserService.class);