簡體   English   中英

如何為來自不同屬性文件的 Bean 列表配置 Spring 配置?

[英]How to configure Spring configuration for List of Beans from different property files?

我有工作 Spring XML 配置,我想將它移到 Annotation Config。

問題是如何從不同的屬性文件創建不同的 bean。

這是 XML 片段:

<bean id="auditorium1" class="net.lelyak.edu.entity.Auditorium"
      c:name="${auditorium1.name}" c:numberOfSeats="${auditorium1.number-of-seats}" 
      c:vipSeats="${auditorium1.vip-seats}"/>
<bean id="auditorium2" class="net.lelyak.edu.entity.Auditorium"
      c:name="${auditorium2.name}" c:numberOfSeats="${auditorium2.number-of-seats}" 
      c:vipSeats="${auditorium2.vip-seats}"/>
<bean id="auditorium3" class="net.lelyak.edu.entity.Auditorium"
      c:name="${auditorium3.name}" c:numberOfSeats="${auditorium3.number-of-seats}" 
      c:vipSeats="${auditorium3.vip-seats}"/>

<util:list id="auditoriumsList">
    <ref bean="auditorium1"/>
    <ref bean="auditorium2"/>
    <ref bean="auditorium3"/>
</util:list>

<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean" /> 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:properties/auditorium1.properties</value>
            <value>classpath:properties/auditorium2.properties</value>
            <value>classpath:properties/auditorium3.properties</value>
            <value>classpath:db/dp.properties</value>
        </list>
    </property>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="systemPropertiesMode">
        <util:constant
                static-field="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    </property>
</bean>

屬性文件示例:

auditorium1.name=yellow
auditorium1.number-of-seats=150
auditorium1.vip-seats=1,2,3,4,5,6,7,8,9

我想將它移動到 Annotation 配置,例如:

@Configuration
public class AuditoriumConfiguration {

    @Bean
    public Auditorium auditorium1() {
        return new Auditorium();
    }

    @Bean
    public Auditorium auditorium2() {
        return new Auditorium();
    }

    @Bean
    public Auditorium auditorium3() {
        return new Auditorium();
    }

    @Bean
    public List<Auditorium> auditoriumsList() {
        return Arrays.asList(auditorium1(), auditorium2(), auditorium3());
    }

    @Bean
    public ConversionService conversionService() {
        return new DefaultConversionService();
    }
}

這是禮堂 POJO:

@Component
public class Auditorium {
    private Integer id;
    private String name;
    private Integer numberOfSeats;
    private Set<Integer> vipSeats;
    // get / set

如何為每個屬性文件創建不同的 Auditorium 實例?

我想我可以使用@Value ,但我找不到每個屬性文件的方法創建對象。

有什么建議嗎?

首先,您不需要列表,如果您需要類型列表,只需將@Autowired添加到集合中,spring 就會將該 bean 的所有類型注入到該集合中。

要獲取屬性,您可以使用Environment並且您可能希望為此添加一個幫助程序/工廠方法。

默認情況下已經配置了轉換服務,因此無需添加。

要加載配置文件,請將@PropertySource添加到您的配置類。 如果您需要@Value或替換占位符,您需要添加一個PropertySourcesPlaceholderConfigurer作為static bean。

基本上,這樣的事情應該達到你想要的。

@Configuration
@PropertySource({"classpath:properties/auditorium1.properties",
        "classpath:properties/auditorium2.properties",
        "classpath:properties/auditorium3.properties",
        "classpath:db/dp.properties"})
public class AuditoriumConfiguration {

    @Autowired
    private Environment env;

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    private Auditorium createAuditorium(String prefix) {
        String nameString = env.getProperty(prefix + ".name");
        String strNumberOfSeats = env.getProperty(prefix + ".number-of-seats");
        Integer[] integers = env.getProperty(prefix + ".vip-seats", Integer[].class);
        Set<Integer> integerSet = Arrays.stream(integers).collect(Collectors.toSet());

        Auditorium auditorium = new Auditorium();
        auditorium.setName(nameString);
        auditorium.setNumberOfSeats(Integer.valueOf(strNumberOfSeats));
        auditorium.setVipSeats(integerSet);
        return auditorium;
    }

    @Bean
    public Auditorium auditorium1() {
        return createAuditorium("auditorium1");
    }

    @Bean
    public Auditorium auditorium2() {
        return createAuditorium("auditorium2");
    }

    @Bean
    public Auditorium auditorium3() {
        return createAuditorium("auditorium3");
    }
}

現在,如果您想要這些類的列表,只需添加一個List<Auditorium>並且 spring 會將所有依賴項注入該列表。

public class MyClass {
    @Autowired
    private List<Auditorium> auditoriums;
}
@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(...);
    }
}

@Configuration
@Import({ DataSourceConfig.class, TransactionConfig.class })
public class AppConfig extends ConfigurationSupport {
    // bean definitions here can reference bean definitions in DataSourceConfig or TransactionConfig
}


@Configuration
@PropertySource("classpath:/com/myco/app.properties")
//@ResourceBundles("classpath:/org/springframework/config/java/simple")

public class AppConfig {

    @Value("${jdbc.url}")
    //@ExternalValue("datasource.username")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;
    
     @Bean
    public TestBean testBean () {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("one", 1);
        map.put("two", 2);
        return new TestBean(map);
    }
    
    @Bean
public Map<Integer, String> nameMap(){
    Map<Integer, String>  nameMap = new HashMap<>();
    nameMap.put(1, "John");
    nameMap.put(2, "Adam");
    nameMap.put(3, "Harry");
    return nameMap;
}

private Map<Integer, String> nameMap;
 
    @Autowired
    public void setNameMap(Map<Integer, String> nameMap) {
        this.nameMap = nameMap;
    }
 
    public void printNameMap() {
        System.out.println(nameMap);
    }
    
    

@Bean
    public List<String> nameList() {
        return Arrays.asList("John", "Adam", "Harry");
    }
    
    //set 
    private Set<String> nameSet;
 
    public AppConfig(Set<String> strings) {
        this.nameSet = strings;
    }
 
 @Bean
public AppConfig getCollectionsBean() {
    return new AppConfig(new HashSet<>(Arrays.asList("John", "Adam", "Harry")));
}


 
    public void printNameSet() {
     
   System.out.println(nameSet);
    }
    
    
    private Set<String> nameSet;
 
    public AppConfig(Set<String> strings) {
        this.nameSet = strings;
    }
 
    public void printNameSet() {
        System.out.println(nameSet);
    }
    
    
    

    
    }
    
    public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    TestBean bean = context.getBean(TestBean.class);
        System.out.println(bean.getMap());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM