참조 콩을 유형별로 목록에 자동 연결
오브젝트 리스트가 있는 클래스가 1개 있습니다.Daemon
유형.
class Xyz {
List<Daemon> daemons;
}
제 스프링 구성은 이렇습니다.
<bean id="xyz" class="package1.Xyz">
<property name="daemons" ref="daemonsList">
</bean>
<bean id="daemon1" class="package1.DaemonImpl1"/>
<bean id="daemon2" class="package1.DaemonImpl2"/>
<bean id="daemonsList" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="daemon1" />
<ref bean="daemon2" />
</list>
</constructor-arg>
</bean>
리스트내의 각 데몬의 실장을 명시적으로 배선하는 대신에, 타입의 모든 콩을 자동 배선할 수 있습니다.Daemon
자동으로 목록에 표시됩니다.내가 해결하려고 하는 문제는 만약 누군가가 새로운 구현의 빈을 만든다면Daemon
수업 중에 리스트에 전보하는 것을 잊었어요.
스택 오버플로우에서 이 질문을 본 적이 있지만 다시 찾을 수 없습니다.죄송합니다.
다음과 같이 동작합니다(XML에서 ArrayList bean 삭제).
public Class Xyz {
private List<Daemon> daemons;
@Autowired
public void setDaemons(List<Daemon> daemons){
this.daemons = daemons;
}
}
XML에서는 이 방법을 사용할 수 없다고 생각합니다.
또한 ApplicationContext에서 특정 유형의 모든 콩을 제공할 수 있습니다.이 경우 해당 유형의 배열을 예상하는 필드 또는 메서드에 주석을 추가할 수 있습니다.
public class MovieRecommender {
@Autowired
private MovieCatalog[] movieCatalogs;
// ...
}
유형화된 컬렉션에도 동일하게 적용됩니다.
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
// or if you don't want a setter, annotate the field
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
BTW(스프링 4.x)에서는 이 메커니즘을 사용하여 이들 목록을 자동으로 주문할 수 있습니다.
스프링 매뉴얼에 기재된 바와 같이 이 작업은 두 가지 방법으로 수행할 수 있습니다.
다음은 문서에서 발췌한 내용입니다.
byType 또는 생성자 자동 배선 모드를 사용하면 배열 및 유형 컬렉션을 배선할 수 있습니다.
1. autowire="타입별"
xml에 정의된 빈 유형이 목록 유형과 일치하는 경우 "byType"을 사용하여 자동 연결할 수 있습니다.
예:
Motor.java
package com.chiranth;
public interface Motor
{
public void start();
}
Electric Motor 1.java
package com.chiranth;
public class ElectricMotor1 implements Motor
{
public void start()
{
System.out.println("Motor 1 Started.");
}
}
Electric Motor 2.java
package com.chiranth;
public class ElectricMotor2 implements Motor
{
public void start()
{
System.out.println("Motor 2 Started.");
}
}
TeslaModelX.java
package com.chiranth;
import java.util.List;
public class TeslaModelX
{
private List<Motor> motor;
public List<Motor> getMotor()
{
return motor;
}
public void setMotor(List<Motor> motor)
{
this.motor = motor;
}
public void goForward()
{
for(Motor m :motor)
m.start();
System.out.println("Going Forward.");
}
}
Spring.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="electricMotor1" class="com.chiranth.ElectricMotor1"/>
<bean id="electricMotor2" class="com.chiranth.ElectricMotor2"/>
<bean id="modelX" class="com.chiranth.TeslaModelX" autowire="byType"/>
</beans>
Test.java
package com.chiranth;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test
{
public static void main(String[] args)
{
ApplicationContext context= new ClassPathXmlApplicationContext("Spring.xml");
TeslaModelX modelx=(TeslaModelX)context.getBean("modelX");
modelx.goForward();
}
}
출력:
Motor 1 Started.
Motor 2 Started.
Going Forward.
2. autowire = "오토와이어"
xml에 정의된 빈 유형이 생성자의 인수 유형과 일치하는 경우 "컨스트럭터"를 사용하여 자동 배선을 수행할 수 있습니다.
예:
상기 Motor.java, ElectricMotor1.java 및 ElectricMotor2.java를 고려합니다.
TeslaModelX.java
package com.chiranth;
import java.util.List;
public class TeslaModelX
{
private List<Motor> motor;
public TeslaModelX(List<Motor> motor)
{
this.motor=motor;
}
public void goForward()
{
for(Motor m:motor)
m.start();
System.out.println("Going Forward.");
}
}
Spring.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="electricMotor1" class="com.chiranth.ElectricMotor1"/>
<bean id="electricMotor2" class="com.chiranth.ElectricMotor2"/>
<bean id="modelX" class="com.chiranth.TeslaModelX" autowire="constructor"/>
</beans>
Test.java
package com.chiranth;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test
{
public static void main(String[] args)
{
ApplicationContext context= new ClassPathXmlApplicationContext("Spring.xml");
TeslaModelX modelX=(TeslaModelX)context.getBean("modelX");
modelX.goForward();
}
}
출력:
Motor 1 Started.
Motor 2 Started.
Going Forward.
언급URL : https://stackoverflow.com/questions/7446301/autowire-reference-beans-into-list-by-type
'bestsource' 카테고리의 다른 글
파일 또는 어셈블리 "시스템"을 로드할 수 없습니다.Net.Http, 버전=4.0.0, 문화=중립, 공개키토큰=b03f5f7f11d50a3a" (0) | 2023.04.04 |
---|---|
에러, 「put(K, V)」를 raw 타입의 「java.util」의 멤버로서 오프 콜.해시맵' (0) | 2023.04.04 |
앱 렌더링 html 엔티티(예: 앰퍼샌드)를 이스케이프로 응답 (0) | 2023.03.25 |
TypeScript에서 "keyof 확장"과 "keyof 입력"은 무엇을 의미합니까? (0) | 2023.03.25 |
스프링 부트에서의 HTTP OPTIONS 요청 처리 방법 (0) | 2023.03.25 |