정적 필드와 함께 @Autowired를 사용할 수 있습니까?
사용할 수 있는 방법이 있나요?@Autowired
static 필드를 사용합니다.그렇지 않은 경우 다른 방법이 있습니까?
간단히 말해서, 아니다.스프링에는 정적 필드를 자동 배선하거나 수동으로 배선할 수 없습니다.이걸 하려면 당신만의 논리를 써야 할 거예요.
@Component("NewClass")
public class NewClass{
private static SomeThing someThing;
@Autowired
public void setSomeThing(SomeThing someThing){
NewClass.someThing = someThing;
}
}
@Autowired
는 세터와 함께 사용할 수 있으므로 세터가 정적 필드를 수정할 수 있습니다.
마지막 한 가지 제안입니다하지 않다
@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();
}
}
스태틱 변수를 부작용으로 초기화하는 자동 배선 가능한 빈을 만듭니다.
자동 배선 정적 필드(또는 상수)는 무시되지만 오류가 발생하지 않는다는 답변을 추가하려고 했습니다.
@Autowired
private static String staticField = "staticValue";
XML 표기법 및MethodInvokingFactoryBean
예를 들어 여기를 참조하십시오.
private static StaticBean staticBean;
public void setStaticBean(StaticBean staticBean) {
StaticBean.staticBean = staticBean;
}
가능한 한 스프링 주입을 사용하는 것을 목표로 하는 것이 좋습니다.이것은 권장되는 접근법입니다만, 스프링 컨테이너로부터 모든 것을 꺼낼 수 있는 것은 아니거나 레거시 시스템을 취급하는 것은 아니기 때문에, 항상 가능한 것은 아닙니다.
이 방법에서는 노트 테스트도 더 어려워질 수 있습니다.
Application Context Aware를 사용할 수 있습니다.
@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);
면책사항 이것은 결코 표준이 아니며 이를 위한 더 나은 봄 방법이 있을 수 있습니다.위의 답변 중 어느 것도 퍼블릭스태틱필드의 배선 문제에 대응하고 있지 않습니다.
나는 세 가지를 성취하고 싶었다.
- 스프링을 사용하여 "자동 배선"(@Value 사용)
- 공용 정적 값 노출
- 수정 방지
내 물체는 이렇게 생겼다.
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로 시작하는 모든 메서드가 랩되고 호출되면 오류가 발생합니다.
나는 이것이 특별히 유용하다고 생각하지 않지만, 만약 당신이 강박적이고 완두콩과 당근을 분리하는 것을 좋아한다면, 이것은 그것을 안전하게 하는 한 가지 방법이다.
중요한 봄은 함수를 호출할 때 자신의 측면을 호출하지 않습니다.이걸 더 쉽게 만들었지, 안좋게도, 그걸 알기 전에 논리를 알아냈지.
일반적으로 개체 인스턴스별로 정적 필드를 설정하는 것은 잘못된 방법입니다.
추가할 수 있는 옵션 문제를 피하기 위해synchronized
private static Logger의 경우에만 정의하고 설정합니다.
@Autowired
public synchronized void setLogger(Logger logger)
{
if (MyClass.logger == null)
{
MyClass.logger = logger;
}
}
:
private static UserService userService = ApplicationContextHolder.getContext().getBean(UserService.class);
1: 컨스트럭터 1: 컨스트럭터 사용방법@Autowired
@Component
public class MyClass {
private static MyService service;
@Autowired
public MyClass(MyService service) {
TestClass.service= service;
}
}
2: 사용방법 2:@PostConstruct
[ Static ]으로 을 [Static Field로
@Component
public class MyClass {
private static MyService service;
@Autowired
private MyService srv;
@PostConstruct
public void init() {
this.service= srv;
}
}
언급URL : https://stackoverflow.com/questions/1018797/can-you-use-autowired-with-static-fields
'programing' 카테고리의 다른 글
찾을 수 없는 키에 대한 기본값을 반환하려면 HashMap을 선택하십시오. (0) | 2022.08.28 |
---|---|
C의 보이드 포인터에 대한 포인터 산술 (0) | 2022.08.28 |
0.1을 여러 번 더하는 것은 왜 무손실인 채로 남습니까? (0) | 2022.08.28 |
오른쪽 정렬 버튼 그룹 Vuetify (0) | 2022.08.28 |
Vue 어레이에서 테이블로의 문제 (0) | 2022.08.28 |