복붙노트

[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. ==============================

    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. ==============================

    2.정적 메소드의 결과는 메소드에 전달 된 매개 변수에만 의존해야하므로 빈을 호출 할 필요가 없습니다.

    정적 메소드의 결과는 메소드에 전달 된 매개 변수에만 의존해야하므로 빈을 호출 할 필요가 없습니다.

    다른 bean을 호출 할 필요가 있다면 당신의 메소드는 독립 bean의 멤버 메소드가되어야한다.

    다른 대답은 당신에게 실제 해결책을 제시하지만, 그것이 끝날 수 있다는 사실은 그것을해야한다는 것을 의미하지는 않습니다.

  3. ==============================

    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. ==============================

    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. ==============================

    5.이것은 내가 정적 인 필드에서 봄부터 주입 한 방법입니다.

    이것은 내가 정적 인 필드에서 봄부터 주입 한 방법입니다.

    <bean id="..." class="...">
     <property name="fieldToBeInjected">
                <util:constant static-field="CONSTANT_FIELD" />
            </property>
    </bean>
    

    아마도 이것은 당신을 도울 것입니다.

  6. ==============================

    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. ==============================

    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();
      }
    }
    

    자세한 내용은 여기와 여기에 있습니다.

  8. from https://stackoverflow.com/questions/12537851/accessing-spring-beans-in-static-method by cc-by-sa and MIT license