source

생성자가 @Autowired 작업을 어떻게 호출합니까?

nicesource 2023. 7. 3. 22:56
반응형

생성자가 @Autowired 작업을 어떻게 호출합니까?

Boot Spring Boot이 어떻게 .@Autowired주석 작업나는 스프링 부츠에서 우리가 맥락을 가지고 있다는 것을 알고 있고, 그 맥락 안에는 콩이 있고, 그것은 서로 연결될 수 있습니다.@Autowired주석과 그것은 스프링 부트에서 의존성 주입이 있기 때문입니다. 하지만 생성자를 어떻게 부릅니까?

다음과 같은 서비스가 있습니다.

@Service
public class MyService {

    public MyService() {
        // do something
    }

}

그리고 수업시간에 저는 다음과 같이 합니다.

public class MyClass {

    @Autowired
    MyService service;

}

질문은 다음과 같습니다.

생자는다같다니습과음성의 입니다.MyService호출을 받고 "무엇을 하다"가 실행되거나 빈 생성자를 불러 "무엇을 하다"가 실행된다는 사실에 의존할 수 없습니까?

TL;DR

콩을 만들 때 Spring은 대상 콩 클래스에 포함된 생성자를 호출해야 합니다.

  1. 생성자가 정의되지 않은 경우 - Spring은 컴파일러에 의해 생성된 암묵적인 기본 생성자를 호출합니다.
  2. 명시적으로 정의된 인수가 없는 생성자가 있는 경우 다른 생성자가 정의되지 않았기 때문에 스프링이 이 생성자를 호출합니다.
  3. 종속성이 은 이 에 대한 (4.3 이 .)@Autowired).
  4. 여러 개의 Arg 생성자가 정의된 경우 Spring은 어떤 것을 선택해야 할지 모르기 때문에 모호성을 해결해야 합니다.(그런 다음 이들 중 하나를 다음과 같이 표시할 수 있습니다.@Autowired또는 구성 클래스를 사용하여 빈을 정의합니다.

사이드 노트

스프링 IOC 컨테이너(응용 상황)는 콩을 보관하고 요청이 있을 때마다 콩을 반환하는 역할을 합니다.컨텍스트를 만들려면 봄에 빈 정의를 찾을 위치를 알려줘야 합니다. xml 파일, Java 구성을 제공하거나 지정된 패키지에서 구성 요소의 자동 검색을 활성화할 수 있습니다.봄의 맥락이 만들어지면 콩을 만들어내야 합니다.그것은 생성자를 호출하고 그것들을 필요로 하는 콩에 대한 의존성을 제공하려고 할 것입니다.

예를 들어 다음과 같은 경우MyClass컨스트대생성, 기생를호출니다합자를 합니다.MyClass클래스를 지정한 다음 반성을 통해 종속성을 설정합니다.

그러나 필드 주입은 일반적으로 이러한 구성 요소를 테스트하는 데 문제가 있을 수 있으므로 좋지 않은 방법입니다.생성자 또는 세터 주입이 더 나은 선택입니다.

변경한 경우MyClass대상:

public class MyClass {

    private MyService service;

    @Autowired
    public MyClass(MyService service) {
        this.service = service;
    }

}

여기서 사용자는 자신의 생성자를 제공합니다. 이 경우에는 기본 생성자가 생성되지 않습니다.따라서 Spring은 당신이 제공한 생성자를 호출하고 그에 대한 의존성을 충족시켜야 합니다.주입할 수 있는 종속성이 없는 경우 예외가 발생합니다.

Spring 없이도 수업을 사용할 수 있습니다.

MyService myService = new MyService();
MyClass myclass = new MyClass(myService);

Spring 을 표시하고 Spring을 으로써.@Autowired컨텍스트 생성 및 종속성 주입에 대한 스프링 지원만 활성화하면 됩니다(자동 패키지 검색의 경우).

MyService에는 @Service 주석이 있으므로 Spring이 자동으로 인스턴스화합니다(즉, Bean으로 등록).

클래스를 생성하는 동안 클래스의 생성자를 검색하고 no-args 생성자가 정의되어 있는지 확인합니다. 이 생성자는 유일한 생성자이므로 이 생성자를 사용합니다.

발견한 no-args 생성자를 호출하여 서비스를 생성하므로 "//do something" 위치에 있는 코드가 실행됩니다.

반대로 이 생성자를 추가하지 않았다면 MyService 클래스에는 빈 비인수 생성자가 암묵적으로 정의되어 있으므로 Spring이 빈 생성자를 사용합니다.그러나 사용자의 경우 명시적 생성자를 정의했으므로 스프링은 이 생성자를 사용 가능한 유일한 생성자로 보고 모호성은 없습니다.

긴 이야기 짧은 -> 생성자가 하나 정의되어 있는 경우 Spring은 항상 자동으로 이 생성자를 사용하여 빈을 만듭니다.

추신: @Autowired 주석을 사용하는 경우 매개 변수가 있는 생성자를 가질 수도 있습니다.이 경우 Spring은 이 생성자를 호출하여 생성자에게 자동 배선될 수 있는 이러한 생성자가 선언된 경우 필요한 매개 변수를 전달합니다.

장황한 이야기

Spring은 기본 생성자(인수 없음 생성자)를 사용하여 구성요소를 생성합니다.예를 들어,

@Service
public class MyService {

public MyService() {
   // do something
}
}

되고 생자가호것이며출될성,며것이▁be▁theor▁and,// do something호출됩니다.

그러나 클래스에 기본값이 아닌 생성자(인수가 있는 생성자)를 추가하면 컴파일러가 사용자를 위한 기본 생성자를 생성하지 않으며 이 경우 스프링은 사용자를 인스턴스화하지 못합니다.MyService

예를들면

  @Service
    public class MyService {

    public MyService(String var) {
       // do something
    }
    }

생성자 매개 변수 0의 예외를 에 던집니다.com.example.MyService유형이 '인 콩이 필요함java.lang.String찾을 수 없습니다.

언급URL : https://stackoverflow.com/questions/56088861/how-do-constructor-calls-with-autowired-work

반응형