복붙노트

[SPRING] JPA @Entity 내부의 빈 주입

SPRING

JPA @Entity 내부의 빈 주입

Spring의 의존성 주입을 사용하여 JPA @Entity에 bean을 주입 할 수 있습니까?

@Autowire ServletContext를 시도했지만 서버가 성공적으로 시작된 동안 Bean 속성에 액세스하려고 할 때 NullPointerException을 수신했습니다.

@Autowired
@Transient
ServletContext servletContext;

해결법

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

    1.@Configurable을 사용하여 Spring 컨테이너가 관리하지 않는 객체에 종속성을 주입 할 수 있습니다. http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop - 구성 할 수 있습니다.

    @Configurable을 사용하여 Spring 컨테이너가 관리하지 않는 객체에 종속성을 주입 할 수 있습니다. http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop - 구성 할 수 있습니다.

    @Configurable하고 적절한 AspectJ 짜기 설정을 사용하지 않는다면 Spring은 new 연산자를 사용하여 생성 된 객체에 의존성을 삽입하지 않는다. 실제로 ApplicationContext에서 객체를 가져 오지 않는 한 객체에 의존성을 주입하지 않습니다. 왜냐하면 단순히 객체의 존재에 대해 알지 못하는 단순한 이유 때문입니다. 엔티티에 @Component 주석을 달더라도 해당 엔티티의 인스턴스화는 사용자 또는 Hibernate와 같은 프레임 워크에 의해 새 작업에 의해 수행됩니다. 주석은 단지 메타 데이터 일 뿐이라는 것을 기억하십시오. 아무도 해당 메타 데이터를 해석하지 않으면 아무런 동작을 추가하지 않거나 실행중인 프로그램에 영향을 미치지 않습니다.

    모든 말을 듣고, 엔티티에 ServletContext를 주입하는 것을 강력하게 권고합니다. 엔티티는 도메인 모델의 일부이며 서블릿 기반 웹 전달 레이어와 같은 전달 메커니즘과 분리되어야합니다. 명령 행 클라이언트 나 ServletContext를 포함하지 않는 다른 방법으로 엔티티를 액세스 할 때 어떻게 사용합니까? 해당 ServletContext에서 필요한 데이터를 추출하여 기존 메서드 인수를 통해 엔터티에 전달해야합니다. 이 접근 방식을 통해 훨씬 더 나은 디자인을 얻을 수 있습니다.

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

    2.물론 가능합니다. 또한 엔티티가 태그 (some spring-context.xml)를 사용하여 선언적으로나 아래에 표시된 주석을 통해 Spring 관리 Bean으로 등록되었는지 확인해야합니다.

    물론 가능합니다. 또한 엔티티가 태그 (some spring-context.xml)를 사용하여 선언적으로나 아래에 표시된 주석을 통해 Spring 관리 Bean으로 등록되었는지 확인해야합니다.

    주석을 사용하여 엔티티를 @Component (또는 DAO에 대한 자동 예외 변환을 가능하게하고 JPA를 간섭 할 수도 있고 그렇지 않을 수도있는 더 구체적인 스테레오 타입 @Repository)로 표시 할 수 있습니다.

    @Entity
    @Component
    public class MyJAPEntity {
    
      @Autowired
      @Transient
      ServletContext servletContext;
      ...
    }
    

    엔티티에 대한 작업을 완료하면 엔티티가 bean으로 선택되고 그 종속성이 자동 유선이되도록 Spring에서 스캔하도록 패키지 (또는 일부 조상 패키지)를 구성해야합니다.

    <beans ... xmlns:context="..." >
      ...
      <context:component-scan base-package="pkg.of.your.jpa.entities" />
    <beans>
    

    편집 : (마침내 효과와 왜)

    JPA는 Spring 관리 빈을 사용하지 않고 별도의 엔티티 인스턴스를 생성하기 때문에 컨텍스트를 공유하는 데 필요합니다.

    이것은 Entity가 인스턴스화되고 내부의 ServletContext를 참조하여 init ()를 시작합니다. 이미 삽입되지 않은 경우 정적 속성에 강제로 주입합니다.

    왜 우리가 이러한 속임수를 사용해야합니까?

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

    3.오랜 시간이 지나면 나는이 우아한 해결책을 생각하게 만들었습니다.

    오랜 시간이 지나면 나는이 우아한 해결책을 생각하게 만들었습니다.

    그러면 엔티티는 @Component can으로 autowired 필드에 액세스 할 수 있습니다.

  4. from https://stackoverflow.com/questions/16471636/bean-injection-inside-a-jpa-entity by cc-by-sa and MIT license