복붙노트

[SPRING] 같은 bean에서 bean을 autowire하는 법

SPRING

같은 bean에서 bean을 autowire하는 법

나는 bean A의 인스턴스를 A의 같은 인스턴스에 autowire하고 싶다. XML을 사용하지 않고 annotation을 사용하여 이것을 어떻게 달성 할 수 있는가?

예:

@Service
public class A {

    @Autowire
    A a;

}

나도 노력했다.

@Service
public class A {

    A a;

    @Autowired
    public void setA(final A a) {
        this.a = a;
    }

}

하지만 그것도 작동하지 않습니다 : - /

XML을 사용하여 구성

<bean id="a" class="A">
    <property name="a" ref="a" />
</bean>

잘 작동합니다. 또한 사용이 가능합니다.

@Service
public class A implements InitializingBean {

    A a;

    @Autowired
    ApplicationContext ctx;

    @Override
    public void afterPropertiesSet() throws Exception {
        a = ctx.getBean(A.class);
    }

}

그러나 이것은 성가시다. 이상하게도, XML 설정을 사용할 때 Spring이 처리 할 수 ​​있지만 주석 기반 UI를 사용할 때는 처리 할 수 ​​없다는 것입니다.

해결법

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

    1.@Autowired는 autowire 후보를 찾을 때 주석이 달린 빈을 건너 뛰고 @Resource를 대신 사용합니다.

    @Autowired는 autowire 후보를 찾을 때 주석이 달린 빈을 건너 뛰고 @Resource를 대신 사용합니다.

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

    2.나는 그것을 올바르게 이해하고 동일한 클래스의 비 트랜잭션 방식에서 트랜잭션 방식을 호출하기 때문에 거래 조언이 적용되지 않는다는 근본 문제입니까? 트랜잭션 코드를 다른 클래스로 추출 할 수 없습니까? 이게 정말 이상한 구조보다 더 읽기 쉽지 않니?

    나는 그것을 올바르게 이해하고 동일한 클래스의 비 트랜잭션 방식에서 트랜잭션 방식을 호출하기 때문에 거래 조언이 적용되지 않는다는 근본 문제입니까? 트랜잭션 코드를 다른 클래스로 추출 할 수 없습니까? 이게 정말 이상한 구조보다 더 읽기 쉽지 않니?

    예 :

    @Service
    public class A {
    
      @Autowired B b;
    
      void doSomething() {
         b.m();  
      }
    }
    
    public class B {
    
       @Transactional
       void m() { .. }
    }
    
  3. ==============================

    3.Aspectj 컴파일러를 사용하여 컴파일 타임 짜기를 사용할 수 있기 때문에 aspect가 프록시를 작동시킬 필요가 없다. 단지 이것을 pom.xml 설정에 추가하십시오 :

    Aspectj 컴파일러를 사용하여 컴파일 타임 짜기를 사용할 수 있기 때문에 aspect가 프록시를 작동시킬 필요가 없다. 단지 이것을 pom.xml 설정에 추가하십시오 :

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
    </dependency>
    
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <configuration>
            <aspectLibraries>
                <aspectLibrary>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aspects</artifactId>
                </aspectLibrary>
            </aspectLibraries>
        </configuration>
    </plugin>
    
  4. from https://stackoverflow.com/questions/17279228/how-to-autowire-bean-in-same-bean by cc-by-sa and MIT license