복붙노트

[SPRING] @ static 클래스에서의 autowired

SPRING

@ static 클래스에서의 autowired

이것은 Hibernate를 가진 Spring MVC 프로젝트이다. 나는 데이터베이스에 로그를 입력하는 Logger 클래스를 만들고자한다. 다른 클래스는 일부 속성을 가진 적절한 메소드를 호출하기 때문에이 클래스는 모든 마법을 수행해야합니다. 본질적으로 정적 메소드를 가진 클래스 여야하지만, 이는 autowiering DAO 객체에 문제를 일으 킵니다.

public class StatisticLogger {
    @Autowired
    static Dao dao;
    public static void AddLoginEvent(LogStatisticBean user){
        //TODO code it god damn it
    }
    public static void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
        //TODO code it god damn it
    }
    public static void addErrorLog(Exception e, String page,  HashMap<String, Object> parameters){
        ExceptionLogBean elb=new ExceptionLogBean();
        elb.setStuntDescription(e);
        elb.setSourcePage(page);
        elb.setParameters(parameters);
        if(dao!=null){ //BUT DAO IS NULL
            dao.saveOrUpdateEntity(elb);
    }
}

그것을 올바르게 만드는 방법? DAO 객체를 null로 설정하지 않으려면 어떻게해야합니까? 메서드 매개 변수로 전달할 수 있지만 그다지 좋지 않습니다. autowiering 메커니즘이 아직 생성되지 않은 초기에 만들어 졌기 때문에 autowired가 정적 객체에서 작동하지 않는다고 추측하고 있습니다.

해결법

  1. ==============================

    1.@Autowired 정적 필드 수 없습니다. 그러나 이것에 대처하는 까다로운 기술이 있습니다 :

    @Autowired 정적 필드 수 없습니다. 그러나 이것에 대처하는 까다로운 기술이 있습니다 :

    @Component
    public class StatisticLogger {
    
      private static Dao dao;
    
      @Autowired
      private Dao dao0;
    
      @PostConstruct     
      private void initStaticDao () {
         dao = this.dao0;
      }
    
    }
    

    한 단어로 @Autowired 인스턴스 필드를 만들고 개체가 생성 될 때 static 필드에 값을 할당합니다. 또한, StatisticLogger 객체는 Spring에서도 관리해야합니다.

  2. ==============================

    2.정적 인 클래스는 Bean이 아니기 때문에 스프링에 의해 관리 될 수 없기 때문에 고전적인 autowiring은 아마 작동하지 않을 것이다. 예를 들어 팩토리 메소드 aproach를 XML로 사용하거나 정적 이니셜 라이저 블록의 Spring 컨텍스트에서 Bean을로드하는 방법과 같은 방법이 있지만 디자인을 변경하는 것이 좋습니다.

    정적 인 클래스는 Bean이 아니기 때문에 스프링에 의해 관리 될 수 없기 때문에 고전적인 autowiring은 아마 작동하지 않을 것이다. 예를 들어 팩토리 메소드 aproach를 XML로 사용하거나 정적 이니셜 라이저 블록의 Spring 컨텍스트에서 Bean을로드하는 방법과 같은 방법이 있지만 디자인을 변경하는 것이 좋습니다.

    정적 메소드를 사용하지 말고 필요한 곳으로 주입하는 서비스를 사용하십시오. Spring을 사용한다면 올바르게 사용할 수 있습니다. Dependency Injection은 객체 지향 기술이며 실제로 OOP를 채택하는 경우에만 의미가 있습니다.

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

    3.나는 이것이 낡은 질문이지만 단지 내가 한 일을 나누고 싶다는 것을 알고있다. @Weibo Li의 해결책은 괜찮지 만 문제가 발생합니다. 비 정적 변수를 정적 변수에 할당하는 방법에 대한 소니 크리티컬 경고

    나는 이것이 낡은 질문이지만 단지 내가 한 일을 나누고 싶다는 것을 알고있다. @Weibo Li의 해결책은 괜찮지 만 문제가 발생합니다. 비 정적 변수를 정적 변수에 할당하는 방법에 대한 소니 크리티컬 경고

    소나 알림없이 해결 한 방법은 다음과 같습니다.

  4. from https://stackoverflow.com/questions/11392692/autowired-in-static-classes by cc-by-sa and MIT license