Ответы:
Короче нет. Вы не можете автоматически связывать или вручную связывать статические поля в 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)
?
Вы можете достичь этого, используя нотацию XML и MethodInvokingFactoryBean
. Для примера посмотрите здесь .
private static StaticBean staticBean;
public void setStaticBean(StaticBean staticBean) {
StaticBean.staticBean = staticBean;
}
Вы должны стремиться использовать пружинный впрыск, где это возможно, так как это рекомендуемый подход, но это не всегда возможно, так как я уверен, что вы можете себе представить, что не все можно извлечь из контейнера с пружиной или вы, возможно, имеете дело с устаревшими системами.
Тестирование заметок также может быть более сложным при таком подходе.
Хотел добавить к ответам, что автоматическое связывание статического поля (или константы) будет игнорироваться, но также не создаст никакой ошибки:
@Autowired
private static String staticField = "staticValue";
Вы можете использовать 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, и выдаст ошибку, если они вызваны.
Я не думаю, что это особенно полезно, но если вы любите держать горох и морковь отдельно, это один из способов сделать это безопасно.
Важно Spring не вызывает ваши аспекты, когда вызывает функцию. Сделал это проще, к сожалению, я разработал логику, прежде чем понять это.
private static UserService userService = ApplicationContextHolder.getContext().getBean(UserService.class);