programing

Spring @Autowired 사용법에 대해서

sourcetip 2022. 10. 8. 16:45
반응형

Spring @Autowired 사용법에 대해서

스프링 자동 배선 주석을 이해하기 위해 스프링 3.0.x 참조 문서를 읽고 있습니다.

3.9.2 @Autowired 및 @Inject

아래의 예를 이해할 수 없습니다.XML을 동작시키기 위해서 필요한 것이 있습니까?

예 1

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

예 2

public class MovieRecommender {

    private MovieCatalog movieCatalog;

    private CustomerPreferenceDao customerPreferenceDao;

    @Autowired
    public void prepare(MovieCatalog movieCatalog,
                    CustomerPreferenceDao customerPreferenceDao) {
        this.movieCatalog = movieCatalog;
        this.customerPreferenceDao = customerPreferenceDao;
    }

    // ...
}

같은 인터페이스를 구현하여 같은 클래스를 사용하여2개의 클래스를 자동 배선하려면 어떻게 해야 합니까?

예제:

class Red implements Color
class Blue implements Color

class myMainClass{
    @Autowired 
    private Color color;

    draw(){
        color.design(); 
    } 
}

어떤 설계 방식이 호출됩니까?블루가 아닌 레드 클래스의 디자인 방식을 호출하려면 어떻게 해야 하나요?

TL;DR

@Autowired주석을 사용하면 XML 파일(또는 다른 방법)에서 직접 배선을 수행할 필요가 없어져 어디에 삽입해야 하는지, 어디에 삽입해야 하는지 찾을 수 있습니다.

상세설명

@Autowired주석을 사용하면 주입할 내용을 다른 곳에서 건너뛸 수 있습니다.은 패음음음음고고고고고고고고고 assuming assuming assuming assuming assuming assuming assuming assuming 라고 가정합니다.com.mycompany.moviesXML(어플리케이션콘텍스트 파일)에 다음 태그를 붙여야 합니다.

<context:component-scan base-package="com.mycompany.movies" />

이 태그는 자동 스캔을 수행합니다.각에 올바른 이 붙어 요.@Component콩의 ) (단순 콩의 경우)@Controller제어의 ) (서블릿 제어의 경우)@Repository)DAO 및 클래스 아래에 ).com.mycompany.movies봄은 이 모든 것을 찾아서 각각의 콩을 만들 것이다.이것은 2개의 클래스 스캔으로 이루어집니다.첫 번째 스캔에서는 콩이 될 필요가 있는 클래스를 검색하고 필요한 주입을 맵합니다.두 번째 스캔에서는 콩을 주입합니다.물론 기존 XML 파일이나 클래스(또는 이 세 가지 조합)를 사용하여 콩을 정의할 수 있습니다.

@Autowired주석은 주입이 필요한 스프링을 나타냅니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.setMovieFinder로) set + + @Autowired(주석) 콩을 주입해야 합니다.두 번째 스캔에서는 스프링이 빈 타입을 검색합니다.MovieFinder그런 콩을 발견하면 이 방법으로 주입합니다.만약 그런 콩 두 개를 발견하면, 당신은 그것을 얻을 것이다.Exception 을회 the the the 를 위해Exception 을할 수 .@Qualifier주석을 붙이고 다음 방법으로 두 콩 중 어느 콩을 주입할지 지시합니다.

@Qualifier("redBean")
class Red implements Color {
   // Class code here
}

@Qualifier("blueBean")
class Blue implements Color {
   // Class code here
}

또는 XML 내의 빈을 선언하는 경우는, 다음과 같이 됩니다.

<bean id="redBean" class="com.mycompany.movies.Red"/>

<bean id="blueBean" class="com.mycompany.movies.Blue"/>

서서 @Autowired(declaration)도 합니다.@Qualifier의 콩 중 주사해야 합니다.

@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
  this.color = color;
}

개의(「주석」).@Autowired ★★★★★★★★★★★★★★★★★」@Qualifier을 사용하면 .@Resource하다

@Resource(name="redBean")
public void setColor(Color color) {
  this.color = color;
}

@Resource(이 답변의 첫 번째 설명에서 일부 추가 데이터를 읽을 수 있습니다.) 주석을 두 개 사용할 필요가 없으며 대신 주석 하나만 사용할 수 있습니다.

코멘트를 2개 더 추가하겠습니다.

  1. 것이 방법이 될 것 같아요.@Inject@Autowired스프링에 특화되어 있지 않고 표준의 일부이기 때문입니다.
  2. 하나의 은 '하다'를 입니다.@Inject@Autowired이치노하면 주입된 할 수 있으며 응용 하려고 할 때 하여 늘을 할 수 .NullPointerException★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

업데이트: 그림을 완성하기 위해 다음 항목에 대한 새로운 질문을 작성했습니다.@Configuration를 누릅니다

이 예에서는, 「같은 인터페이스를 실장하고 있는 클래스」라고 하는 것은 없습니다. MovieCatalog으로, 「」입니다.CustomerPreferenceDao른른른타타타다다을 사용하다

봄 2.x에서는 콩의 배선이 대부분 콩 ID 또는 이름을 통해 이루어졌습니다.이 기능은 Spring 3.x에서도 지원되지만 특정 유형의 콩 인스턴스가 1개 있는 경우가 많습니다.대부분의 서비스는 싱글톤입니다.그것들의 이름을 만드는 것은 지루하다.그래서 스프링은 "타입별 자동 배선"을 지원하기 시작했다.

예를 들어 필드, 메서드 및 컨스트럭터에 콩을 주입하기 위해 사용할 수 있는 다양한 방법이 있습니다.

XML에는 이미 Spring에 필요한 모든 정보가 포함되어 있습니다.이는 각 콩에 완전 수식 클래스 이름을 지정해야 하기 때문입니다.다만, 인터페이스에는 조금 주의할 필요가 있습니다.

이 자동 배선은 실패합니다.

 @Autowired
 public void prepare( Interface1 bean1, Interface1 bean2 ) { ... }

Java는 바이트 코드에 파라미터 이름을 유지하지 않기 때문에 Spring은 더 이상 두 콩을 구분할 수 없습니다.은 '이렇게 하다'를 사용하는 입니다.@Qualifier:

 @Autowired
 public void prepare( @Qualifier("bean1") Interface1 bean1,
     @Qualifier("bean2")  Interface1 bean2 ) { ... }

네, Spring servlet context xml 파일을 설정하여 콩(클래스)을 정의하고 자동 주입을 수행할 수 있습니다.단, 스프링을 가동하려면 다른 구성을 수행해야 하며, 이를 위한 가장 좋은 방법은 튜토리얼을 그라운드 업하는 것입니다.

Spring을 설정하면 위의 예 1의 Spring servlet 컨텍스트xml 파일에서 다음 작업을 수행할 수 있습니다(com.movies 패키지 이름을 실제 패키지 이름으로 대체하고 이것이 서드파티 클래스인 경우 적절한 jar 파일이 클래스 경로에 있는지 확인하십시오).

<beans:bean id="movieFinder" class="com.movies.MovieFinder" />

아니면 MovieFinder 클래스에 원시적인 가치를 가진 컨스트럭터가 있다면 이렇게 할 수 있습니다.

<beans:bean id="movieFinder" class="com.movies.MovieFinder" >
    <beans:constructor-arg value="100" />
</beans:bean>

MovieFinder 클래스에 컨스트럭터가 다른 클래스를 기다리고 있다면 이런 작업을 할 수 있습니다.

<beans:bean id="movieFinder" class="com.movies.MovieFinder" >
    <beans:constructor-arg ref="otherBeanRef" />
</beans:bean>

... 여기서 'otherBeanRef'는 예상 클래스에 대한 참조가 있는 다른 빈입니다.

언급URL : https://stackoverflow.com/questions/19414734/understanding-spring-autowired-usage

반응형