2011-05-04 5 views
14

필자가 알고있는 한, 의존성 주입을 사용할 때 모든 빈은 시작시 초기화된다.스프링 표준 빈 삽입 대 자동 와이어

<bean id="userPreferences" class="com.foo.UserPreferences"> 
    </bean> 
    <!-- a singleton-scoped bean injected to the above bean --> 
    <bean id="userService" class="com.foo.SimpleUserService"> 

     <!-- a reference to the userPreferences bean --> 
     <property name="userPreferences" ref="userPreferences"/> 
    </bean> 

위의 구성은 응용 프로그램이 시작될 때 userService 및 userPreferences가 만들어 졌음을 의미합니다. 맞습니까? Autowiring은을 사용하고 <context:component-scan>

public class SimpleUserService{ 

@Autowired 
UserPreferences userPreferences; 

//omitted 
} 

1을 사용하는 경우

) 응용 프로그램 초기화에 userPreference 생성되어 있습니까?

2) autowire가 주입하는 bean의 기본 범위는 무엇이며 어떻게 변경할 수 있습니까?

3) 빈 작성 및 빈 주입에 어떤 영향을 줍니까?

희망 나는 나 자신을 분명히했다.

답변

11

우선 SimpleUserService 클래스에 @Service 또는 @Component을 추가해야합니다.

  • 1 예, UserPreferences의 하나 개의 인스턴스가 응용 프로그램 초기화 데이터에서 생성됩니다
  • 2 기본 범위는 싱글은, 당신은 @Scope 주석을 변경할 수 있습니다 (@see Spring Reference: 3.11.4.4 Specifying bean scope)
  • 3 구성 요소 검사 및 XML입니다 같은 방법으로 (라이프 사이클)의 구성 작업

은 어쩌면 당신은 봄의 라이프 사이클을 이해하는 시간을 보낼 것이다. 당신은 봄이 방법으로 (정확한 100 %)을 약간 작동하는지 이해해야합니다

  • 먼저 다음은 콩에 속성을 주입
  • 콩의 풀을 생성

그러나 이 방법으로는 작동하지 않습니다. 클래스를 가져 와서이 참조를 만드는 데 필요한 참조 (재귀 적)가 무엇인지 살펴본 다음 클래스를 만듭니다.

이것을 이해한다면 Bean의 @Scope가 Bean 선언/클래스에서는 정의되지만 참조에서는 정의되지 않는다는 것을 이해하게 될 것입니다.

4

1) userPreference가 에 생성 되었습니까? 응용 프로그램 초기화?

두 경우 모두, 스프링 컨텍스트가로드 될 때 userPreferences가 초기화됩니다. 빈 구성에 lazy-init="true"을 추가하여이 동작을 변경할 수 있습니다.

2) 콩 에 대한 기본 범위가 자동으로 묶어 의해 주입 우리가 어떻게 변경 수 있습니다 무엇입니까?

삽입되는 범위는 Spring에로드 된 모든 bean입니다. 다른 프로젝트에서 XML 구성을 가져 오면 XML 구성도 포함됩니다. 범위를 제한 할 수 있는지 확실하지 않습니다.

3) 빈 생성 및 빈 주입에 어떤 영향이 있습니까?

autowired가 아니거나 XML을 통해 구성 되든간에 동작은 동일해야합니다. 필자는 자동 주석보다 종속성을 명시 적으로 정의하는 편을 선호합니다. 그렇다면 다시 강하게 타자를 치는 언어를 좋아합니다.

3

위의 구성은 응용 프로그램이 시작될 때 만들어지는 userService 및 userPreferences를 의미합니다. 맞습니까?

는 응용 프로그램 초기화에 userPreference 생성되어 있습니까?

콩의 기본 범위는 자동으로 묶어 의해 주입 무엇

우리는 그것을 어떻게 변경할 수 있습니까?

기본 범위는 항상 "싱글 톤"입니다.이는 @Scope@Bean으로 변경하거나 scope XML 속성을 <bean>으로 변경하여 변경할 수 있습니다.

빈 작성 및 빈 주입에 어떤 영향이 있습니까?

이것은 분명히 묻지 않습니다. 빈 범위를 변경하면, 생성 시점 (응용 프로그램 시작, 각 요청마다, 각 세션에서 등)을 변경합니다. 배선 구성은 동일하게 유지되며 수명주기 만 변경됩니다.

1

@autowired 표기법은 @inject를 사용하는 구식의 방법입니다. 후자는 6

stackoverflow.com/questions/7142622/what-is-the-difference-between-inject-and-autowired-in-spring-framework-which JavaEE 어플의 기능입니다