답변:
로부터 봄 참조 , 3.2.3.1 명명 콩 :
모든 빈에는 하나 이상의 ID (식별자 또는 이름이라고도 함)가 있습니다. 이 ID는 Bean이 호스팅되는 컨테이너 내에서 고유해야합니다. Bean은 거의 항상 하나의 ID 만 갖지만 Bean에 둘 이상의 ID가 있으면 추가 ID는 기본적으로 별명으로 간주 될 수 있습니다.
XML 기반 구성 메타 데이터를 사용하는 경우 'id'또는 'name'속성을 사용하여 Bean ID를 지정하십시오. 'id'속성을 사용하면 정확히 하나의 ID를 지정할 수 있으며, 실제 XML 요소 ID 속성이므로 XML 파서는 다른 요소가 ID를 참조 할 때 추가 유효성 검사를 수행 할 수 있습니다. 따라서 Bean ID를 지정하는 선호되는 방법입니다. 그러나 XML 스펙은 XML ID에서 유효한 문자를 제한합니다. 이것은 일반적으로 제약 조건은 아니지만 이러한 특수 XML 문자 중 하나를 사용해야하거나 다른 별명을 Bean에 도입하려는 경우 하나 이상의 Bean ID를 쉼표 (, ), 세미콜론 (;) 또는 'name'속성의 공백.
따라서 기본적으로 id
속성은 XML id 속성 표준을 따르지만 name
좀 더 융통성이 있습니다. 일반적으로, 나는 name
거의 독점적으로 사용합니다. 더 많은 "봄 -y"인 것 같습니다.
Spring 3.1부터 id
속성은 속성이며 속성 xsd:string
과 동일한 범위의 문자를 허용 name
합니다.
id
a와 a 의 유일한 차이점은 a name
는 name
쉼표, 세미콜론 또는 공백으로 구분 된 여러 개의 별칭을 포함 할 수 id
있지만 a는 단일 값이어야한다는 것입니다.
Spring 3.2 문서에서 :
XML 기반 구성 메타 데이터에서 id 및 / 또는 name 속성을 사용하여 Bean ID를 지정하십시오. id 속성을 사용하면 정확히 하나의 ID를 지정할 수 있습니다. 일반적으로 이러한 이름은 영숫자 ( 'myBean', 'fooService'등)이지만 특수 문자 일 수도 있습니다. Bean에 다른 별명을 도입하려면 이름 속성에 쉼표 (,), 세미콜론 (;) 또는 공백으로 구분하여 별명을 지정할 수도 있습니다. 역사적으로 Spring 3.1 이전 버전에서는 id 속성이 xsd : ID로 입력되어 가능한 문자를 제한했습니다. 3.1부터는 xsd : string입니다. Bean id 고유성은 컨테이너에 의해 여전히 적용되지만 XML 구문 분석기에는 더 이상 적용되지 않습니다.
어느 쪽이든 작동합니다. 필요에 따라 다릅니다.
Bean ID에 특수 문자가 포함 된 경우 ( /viewSummary.html
) id
유효한 XML ID가 아니기 때문에 Bean으로 사용할 수 없습니다. 이러한 경우 Bean 정의를 건너 뛰고 대신 Bean id
을 제공 할 수 name
있습니다. 속성은 정의하는 데 도움 이 주어진 빈에 대해 여러 식별자를 지정 수 있기 때문에, 여러분의 빈에 대한 말이지.name
alias
<bean> 태그에서 id 속성과 name 속성을 사용하는 것 사이에 차이점이 있습니까?
id를 사용하면 제대로 처리되지 않으면 예외가 발생합니다.
아래 질문에 답하겠습니다
<bean> 태그에서 id 속성 사용과 name 속성 사용에 차이가 있습니까?
다른 점이 없다. <bean> 태그에 id 또는 name이 사용될 때 동일한 효과가 발생합니다.
어떻게?
id와 name 속성은 모두 식별자 값을 빈에 제공하는 수단을 제공합니다 (이 시점에서 id는 id가 아닌 id를 의미한다고 생각하십시오). 두 경우 모두에 전화하면 동일한 결과가 표시됩니다 applicationContext.getBean("bean-identifier");
.
<bean> 태그와 동일한 Java @@ Bean을 사용하면 id 속성을 찾을 수 없습니다. name 속성을 통해서만 식별자 값을 @Bean에 제공 할 수 있습니다.
예제를 통해 설명하겠습니다 :
이 구성 파일을 spring1.xml이라고합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="foo" class="com.intertech.Foo"></bean>
<bean id="bar" class="com.intertech.Bar"></bean>
</beans>
Spring은에 대한 Foo 객체를 반환합니다 Foo f = (Foo) context.getBean("foo");
. 교체 id="foo"
로 name="foo"
위의 spring1.xml에, 당신은 여전히 같은 결과를 볼 수 있습니다.
다음과 같이 XML 구성을 정의하십시오.
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="fooIdentifier" class="com.intertech.Foo"></bean>
<bean name="fooIdentifier" class="com.intertech.Foo"></bean>
</beans>
BeanDefinitionParsingException이 발생합니다. Bean 이름 'fooIdentifier'가이 요소에 이미 사용되어 있습니다. 그건 그렇고, 당신이 config
<bean name = "fooIdentifier"class = "com.intertech.Foo"> </ bean>
<bean name = "fooIdentifier"class = "com 아래에있는 경우와 동일한 예외 입니다. intertech.Foo "> </ bean>
ID와 이름을 모두 Bean 태그에 유지하면 Bean에 두 개의 식별자가 있다고합니다. 식별자가있는 동일한 Bean을 얻을 수 있습니다. 구성을 다음과 같이 사용하십시오.
<?xml version="1.0" encoding="UTF-8"?><br>
<beans ...>
<bean id="fooById" name="fooByName" class="com.intertech.Foo"></bean>
<bean id="bar" class="com.intertech.Bar"></bean>
</beans>
다음 코드는 true를 인쇄합니다
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(...);
Foo fooById = (Foo) context.getBean("fooById")// returns Foo object;
Foo fooByName = (Foo) context.getBean("fooByName")// returns Foo object;
System.out.println(fooById == fooByName) //true
ApplicationContext xml에서 ID 및 이름을 정의하는 데 차이점이 있습니까? 아니오 3.1 (spring)부터 id는 xsd : string 타입으로 정의됩니다. 이름을 정의 할 때 허용되는 모든 문자가 ID에서도 허용됨을 의미합니다. Spring 3.1 이전에는 불가능했습니다.
ID와 동일한 이름을 사용해야하는 이유는 무엇입니까? 응용 프로그램의 각 구성 요소가 해당 구성 요소 자체에 고유 한 Bean 이름을 사용하여 공통 종속성을 참조하도록 허용하는 등의 일부 상황에 유용합니다.
For example, the configuration metadata for subsystem A may refer to a DataSource via the name subsystemA-dataSource. The configuration metadata for subsystem B may refer to a DataSource via the name subsystemB-dataSource. When composing the main application that uses both these subsystems the main application refers to the DataSource via the name myApp-dataSource. To have all three names refer to the same object you add to the MyApp configuration metadata the following
<bean id="myApp-dataSource" name="subsystemA-dataSource,subsystemB-dataSource" ..../>
Alternatively, You can have separate xml configuration files for each sub-system and then you can make use of
alias to define your own names.
<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />