Статьи

Как: Использование аннотации @PropertySource в Spring 4 с Java 7

Сегодня я перенес один из моих проектов, над которым я сейчас работаю, на Spring 4.0. Поскольку это очень простое веб-приложение, которое я использую для изучения и демонстрации возможностей Spring, мне нужно было только обновить POM-файл моего проекта и изменить версию Spring. Я развернул проект на сервере Tomcat 7 и, очевидно, приложение не запустилось. Я видел это сообщение в консоли IntelliJ: Failed to load bean class: pl.codeleak.t.config.RootConfig; nested exception is org.springframework.core.NestedIOException: Unable to collect imports; nested exception is java.lang.ClassNotFoundException: java.lang.annotation.Repeatable Failed to load bean class: pl.codeleak.t.config.RootConfig; nested exception is org.springframework.core.NestedIOException: Unable to collect imports; nested exception is java.lang.ClassNotFoundException: java.lang.annotation.Repeatable Failed to load bean class: pl.codeleak.t.config.RootConfig; nested exception is org.springframework.core.NestedIOException: Unable to collect imports; nested exception is java.lang.ClassNotFoundException: java.lang.annotation.Repeatable . Что за …?

java.lang.annotation.Repeatable аннотация, которая является мета-аннотацией, используемой для пометки ваших аннотаций для многократного использования в Java 8 (но я использую Java 7 в проекте). Например:

1
2
3
4
5
6
@Repeatable(Schedules.class)
public @interface Schedule { ... }
 
@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }

Это хорошо описано здесь: http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html .

Spring 4 использует эту функцию в своей аннотации @PropertySource . Напомним, что аннотация @PropertySource предоставляет механизм для добавления источника пар свойств имя / значение в среду Spring, и он используется вместе с классами @Configuration . Как вы, наверное, уже знаете, я использую эту функцию в моей собственной конфигурации:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@Configuration
@PropertySource("classpath:/datasource.properties")
public class DefaultDataSourceConfig implements DataSourceConfig {
 
    @Autowired
    private Environment env;
 
    @Override
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getRequiredProperty("dataSource.driverClassName"));
        dataSource.setUrl(env.getRequiredProperty("dataSource.url"));
        dataSource.setUsername(env.getRequiredProperty("dataSource.username"));
        dataSource.setPassword(env.getRequiredProperty("dataSource.password"));
        return dataSource;
    }
}

Первым подумал, что Spring больше не совместим с Java ниже 8. Невозможно. При поиске в GitHub я нашел совершенно новую аннотацию @PropertySources, которая является контейнером аннотаций @PropertySource . И это было мое решение проблемы совместимости с Java: использование аннотации @PropertySources в моем классе конфигурации, например:

1
2
3
4
5
6
7
8
@Configuration
@PropertySources(value = {@PropertySource("classpath:/datasource.properties")})
public class DefaultDataSourceConfig implements DataSourceConfig {
 
    @Autowired
    private Environment env;
 
}

Вот и все! После этого изменения мое приложение запустилось, и я увидел, что оно работает просто отлично!

РЕДАКТИРОВАТЬ : См .: https://jira.springsource.org/browse/SPR-11086