[SPRING] 정적 메소드에서 스프링 빈 액세스
SPRING정적 메소드에서 스프링 빈 액세스
정적 메서드가있는 Util 클래스가 있습니다. 내 Util 클래스에서는 스프링 콩을 사용하여 util 클래스에 포함했습니다. 아는 한, 스프링 빈을 정적 필드로 사용하는 것은 좋지 않습니다. 하지만 정적 메서드에서 스프링 빈에 액세스 할 수있는 방법이 있습니까?
내 예 :
public class TestUtils {
private static TestBean testBean;
public void setTestBean(TestBean testBean) {
TestUtils.testBean = testBean;
}
public static String getBeanDetails() {
return beanName = testBean.getDetails();
}
}
많은 포럼에서 이것이 최선의 방법이 아니라는 것을 알았습니다. 누군가가이 유형의 시나리오를 어떻게 처리 할 수 있는지 보여 줄 수 있습니까?
내 구성 파일 :
<bean id="testUtils" class="com.test.TestUtils">
<property name="testBean" ref="testBean" />
</bean>
해결법
-
==============================
1.나의 접근 방식은 bean이 InitializingBean을 구현하거나 @PostConstruct를 사용하고 자체에 대한 정적 참조를 포함하기 위해 액세스하고자하는 것이다.
나의 접근 방식은 bean이 InitializingBean을 구현하거나 @PostConstruct를 사용하고 자체에 대한 정적 참조를 포함하기 위해 액세스하고자하는 것이다.
예 :
@Service public class MyBean implements InitializingBean { private static MyBean instance; @Override public void afterPropertiesSet() throws Exception { instance = this; } public static MyBean get() { return instance; } }
따라서 정적 클래스에서의 사용은 다음과 같습니다.
MyBean myBean = MyBean.get();
이렇게하면 XML 설정이 필요 없기 때문에 빈을 생성자 인자로 전달할 필요가 없으며 호출자는 빈이 Spring을 사용하여 연결되어 있다는 사실을 알거나 신경 쓸 필요가 없습니다 (즉, 지저분해질 필요가 없습니다 ApplicationContext 변수).
-
==============================
2.정적 메소드의 결과는 메소드에 전달 된 매개 변수에만 의존해야하므로 빈을 호출 할 필요가 없습니다.
정적 메소드의 결과는 메소드에 전달 된 매개 변수에만 의존해야하므로 빈을 호출 할 필요가 없습니다.
다른 bean을 호출 할 필요가 있다면 당신의 메소드는 독립 bean의 멤버 메소드가되어야한다.
다른 대답은 당신에게 실제 해결책을 제시하지만, 그것이 끝날 수 있다는 사실은 그것을해야한다는 것을 의미하지는 않습니다.
-
==============================
3.다음과 같이 ApplicationContextAware 인터페이스를 구현할 수도 있습니다.
다음과 같이 ApplicationContextAware 인터페이스를 구현할 수도 있습니다.
@Component public class TestUtils implements ApplicationContextAware { private static ApplicationContext ac; public static String getBeanDetails() { return beanName = ((TestBean) ac.getBean("testBean")).getDetails(); } @Override public void setApplicationContext(ApplicationContext ac) { this.ac = ac; } }
-
==============================
4.@ nullPainter의 응답과 유사하지만 다음을 수행했습니다. 사후 구조 논리가 필요하지 않습니다. @Autowired 메서드에서) 주입하는 동안 정적 멤버를 직접 설정하기 만하면됩니다.
@ nullPainter의 응답과 유사하지만 다음을 수행했습니다. 사후 구조 논리가 필요하지 않습니다. @Autowired 메서드에서) 주입하는 동안 정적 멤버를 직접 설정하기 만하면됩니다.
@Service public class MyUtil { private static MyManager myManager; @Autowired(required = true) public void setMyManager(MyManager manager) { myManager = manager; } public static MyManager getMyManager() { return myManager; } }
-
==============================
5.이것은 내가 정적 인 필드에서 봄부터 주입 한 방법입니다.
이것은 내가 정적 인 필드에서 봄부터 주입 한 방법입니다.
<bean id="..." class="..."> <property name="fieldToBeInjected"> <util:constant static-field="CONSTANT_FIELD" /> </property> </bean>
아마도 이것은 당신을 도울 것입니다.
-
==============================
6.이것은 나를 위해 작동합니다. 어떤 수업에서는 :
이것은 나를 위해 작동합니다. 어떤 수업에서는 :
import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebApplicationContext; WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); DataSource datasource = (DataSource)context.getBean("dataSourceDB_01");
그리고 내 XML 구성에서 :
<bean id="dataSourceDB_01" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"><value>${db.driver}</value></property> <property name="url"><value>${db.url}</value></property> <property name="username"><value>${db.username_seg}</value></property> <property name="password"><value>${db.password_seg}</value></property> </bean>
HTH
-
==============================
7.앞서 설명한 접근법은 Spring 클래스를 유틸리티 클래스에 삽입하는 데 사용되는 것으로 나타났습니다.
앞서 설명한 접근법은 Spring 클래스를 유틸리티 클래스에 삽입하는 데 사용되는 것으로 나타났습니다.
<bean id="testUtils" class="com.test.TestUtils"> <property name="testBean" ref="testBean" /> </bean>
또 다른 옵션은 다음과 같습니다.
<bean name="methodInvokingFactoryBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="TestUtils.setInstance"/> <property name="arguments"> <list> <ref bean="testBean"/> </list> </property> </bean>
와:
public class TestUtils { private static testBean; public static void setInstance(TestBean anInstance) { testBean = anInstance; } public static String getBeanDetails() { return testBean.getDetails(); } }
자세한 내용은 여기와 여기에 있습니다.
from https://stackoverflow.com/questions/12537851/accessing-spring-beans-in-static-method by cc-by-sa and MIT license