참조 bean을 유형별로 목록에 자동 연결
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>
이제 list에서 각 데몬 구현을 명시 적으로 연결하는 대신 list에서 Daemon자동으로 유형의 모든 bean을 자동 연결 하는 것이 가능 합니다. 내가 해결하려는 문제는 누군가 Daemon클래스 의 새로운 구현 빈을 생성하고 그것을 목록에 연결하는 것을 잊는 경우입니다.
이 질문은 stackoverflow 어딘가에서 보았지만 다시 찾을 수 없습니다. 사과드립니다.
다음과 같이 작동해야합니다 (XML에서 ArrayList bean 제거).
public Class Xyz {    
    private List<Daemon> daemons;
    @Autowired
    public void setDaemons(List<Daemon> daemons){
        this.daemons = daemons;
    }
}
XML로이 작업을 수행하는 방법이 없다고 생각합니다.
참조 : 3.9.2. @Autowired및@Inject :
해당 유형의 배열이 필요한 필드 또는 메소드에 주석을 추가하여 ApplicationContext에서 특정 유형의 모든 Bean을 제공 할 수도 있습니다.
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, Spring 4.x부터 이러한 목록은 다음을 사용하여 자동으로 정렬 할 수 있습니다.@Ordered 메커니즘을 .
음, 이것은 다음과 같이 두 가지 방법으로 달성 할 수 있습니다. Spring Documentation에 .
아래는 문서에서 발췌 한 것입니다.
byType 또는 생성자 자동 연결 모드를 사용하면 배열 및 형식화 된 컬렉션을 연결할 수 있습니다.
1. autowire = "byType"
xml에 정의 된 빈의 유형이 목록 유형과 일치하면 "byType"을 사용하여 자동 연결이 가능합니다.
예:
Motor.java
package com.chiranth;
public interface Motor 
{
   public void start();
}
ElectricMotor1.java
package com.chiranth;
public class ElectricMotor1 implements Motor
{
     public void start() 
     { 
         System.out.println("Motor 1 Started.");
     }
}
ElectricMotor2.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
'developer tip' 카테고리의 다른 글
| ASP.NET MVC에서 프로필 공급자 구현 (0) | 2020.11.25 | 
|---|---|
| sqrt (n)의 정수 부분을 얻는 가장 빠른 방법은 무엇입니까? (0) | 2020.11.25 | 
| GNU 화면 복사 버퍼를 클립 보드에 복사하는 방법은 무엇입니까? (0) | 2020.11.25 | 
| Gulp.js를 사용하여 스트림을 여러 대상에 저장하는 방법은 무엇입니까? (0) | 2020.11.25 | 
| Excel에서 UDF를 사용하여 워크 시트 업데이트 (0) | 2020.11.25 |