Spring 설정 파일에서 bean id와 name 사용의 차이점


205

Spring 구성 파일 의 요소에서 id속성과 name속성을 사용하는 것 사이에 차이점이 <bean>있습니까?


8
이 간단한 질문에 답하기가 어렵고 그렇게 간단하고 포괄적 인 답변을 제공합니다. 큰. 감사!
Peter Perháč

답변:


129

로부터 봄 참조 , 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"인 것 같습니다.


46
인용 한 Spring 참조가 "id"속성을 사용하도록 권장하더라도 "name"속성을 사용하는 것을 선호합니까? 당신이 "이름"으로 스틱을 선호하더라도, 당신은 봄 참조 그렇지 않으면 건의 경우 더 "봄-Y"를 호출 할 수 없습니다 :)이 nitpicky, 내가 아는)
theadam

77

Spring 3.1부터 id속성은 속성이며 속성 xsd:string과 동일한 범위의 문자를 허용 name합니다.

ida와 a 의 유일한 차이점은 a namename쉼표, 세미콜론 또는 공백으로 구분 된 여러 개의 별칭을 포함 할 수 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 구문 분석기에는 더 이상 적용되지 않습니다.


48

어느 쪽이든 작동합니다. 필요에 따라 다릅니다.
Bean ID에 특수 문자가 포함 된 경우 ( /viewSummary.html) id유효한 XML ID가 아니기 때문에 Bean으로 사용할 수 없습니다. 이러한 경우 Bean 정의를 건너 뛰고 대신 Bean id을 제공 할 수 name있습니다. 속성은 정의하는 데 도움 이 주어진 빈에 대해 여러 식별자를 지정 수 있기 때문에, 여러분의 빈에 대한 말이지.
namealias


4
또한 자신의 말로 말하고 특수 문자가 필요한 이유를 보여주는 하나입니다.
Michael Piefel

감사합니다. 감사합니다.
pugmarx

3

<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

1

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" />

0

Spring IOC 컨테이너 / ApplicationContecxt의 Bean 식별자 id와 둘 다 name입니다. id속성은 정확히 하나 개의 ID 만 사용하여 지정할 수 있습니다 name당신이 그 빈에 별명을 줄 수있는 속성을.

스프링 문서를 여기서 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.