programing

정적 방법으로 스프링 빈에 액세스

muds 2023. 8. 19. 10:57
반응형

정적 방법으로 스프링 빈에 액세스

정적 메소드가 있는 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>

내 접근 방식은 사용자가 액세스하여 구현하기를 원하는 빈에 대한 것입니다.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 구성이 필요하지 않으며, 빈을 생성자 인수로 전달할 필요가 없으며, 호출자는 빈이 스프링을 사용하여 연결되었는지 알거나 신경 쓸 필요가 없습니다(즉, 지저분할 필요가 없음).ApplicationContext변수)를 선택합니다.

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

다른 콩을 호출해야 하는 경우에는 독립 실행형 콩의 멤버 방식을 사용해야 합니다.

다른 답변은 효과적인 해결책을 제공하지만, 실행할 수 있다는 사실이 실행되어야 한다는 것을 의미하지는 않습니다.

다음과 같은 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) {
    TestUtils.ac = ac;
  }

}

이것은 저에게 효과가 있었습니다.

xml 구성(이전 학교)을 사용하여 빈 정의:

<bean id="someBean1" 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> 

또는 xml 대신 java로 정의합니다( 학교).

@Bean(name = "someBean2")
public MySpringComponent loadSomeSpringComponent() {
  
  MySpringComponent bean = new MySpringComponent();
  bean.setSomeProperty("1.0.2");
  return bean;
}

정적 방법으로 스프링 빈에 액세스

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

public class TestUtils {

  public static void getBeansFromSpringContext() {
    WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
    //for spring boot apps
    //ApplicationContext context = SpringApplication.run(Application.class, args)
    DataSource datasource  = (DataSource)context.getBean("someBean1");
    MySpringComponent springBean  = (MySpringComponent)context.getBean("someBean2");
  }
}   

자동 배선 없이 스프링 빈에 액세스

질문과 관련이 없지만 추천 없이 특정 콩에 액세스해야 하는 경우@Autowired다음을 사용할 수 있습니다.

@Autowired
private ApplicationContext appContext;


LdapConnector ldapConnector = (LdapConnector) appContext.getBean("myFooBean");

그리고 입구에서

  @Bean(name = "myFooBean")
  public LdapConnector myFooBeanInit() throws Exception {
    LdapConnector ldapFooConnector = new LdapConnectorImpl();
    ldapAcademicConnector.enableVerboseLog();
    ldapAcademicConnector.addCertToTrueStore();
    ldapAcademicConnector.disableSanMatch();

@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;
    }
}

이것이 제가 스프링에서 정전기장을 위해 주입한 방법입니다.

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

아마 이것도 당신에게 도움이 될 것입니다.

요약한 접근 방식은 유틸리티 클래스에 스프링 빈을 주입하는 데 사용되는 것을 보았습니다.

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

자세한 내용은 여기와 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/12537851/accessing-spring-beans-in-static-method

반응형