IT story

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

hot-time 2020. 5. 10. 10:23
반응형

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


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


로부터 봄 참조 , 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합니다.

ida와 a 의 유일한 차이점은 a namename쉼표, 세미콜론 또는 공백으로 구분 된 여러 별칭을 포함 할 수 id있지만, 단일 값이어야합니다.

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있습니다. 속성은 정의하는 데 도움 이 주어진 빈에 대해 여러 식별자를 지정 수 있기 때문에, 여러분의 빈에 대한 말이지.
namealias


<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 returns Foo object for, Foo f = (Foo) context.getBean("foo"); . Replace id="foo" with name="foo" in the above spring1.xml, You will still see the same result.

Define your xml configuration like,

<?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>

You will get BeanDefinitionParsingException. It will say, Bean name 'fooIdentifier' is already used in this element. By the way, This is the same exception you will see if you have below config
<bean name="fooIdentifier" class="com.intertech.Foo"></bean>
<bean name="fooIdentifier" class="com.intertech.Foo"></bean>


If you keep both id and name to the bean tag, the bean is said to have 2 identifiers. you can get the same bean with any identifier. take config as

<?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>

the following code prints 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

Is there difference in defining Id & name in ApplicationContext xml ? No As of 3.1(spring), id is also defined as an xsd:string type. It means whatever characters allowed in defining name are also allowed in Id. This was not possible prior to Spring 3.1.

Why to use name when it is same as Id ? It is useful for some situations, such as allowing each component in an application to refer to a common dependency by using a bean name that is specific to that component itself.

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

참고URL : https://stackoverflow.com/questions/874505/difference-between-using-bean-id-and-name-in-spring-configuration-file

반응형