У меня возникла проблема с аннотацией весны @Order
, похоже, я не могу заставить ее работать в моем приложении. Поэтому мне удалось создать тестовый класс, который имитирует то же поведение, которое @Order
не оказывает никакого влияния на мои компоненты. Следующий тест не запускается из-за отсутствия боба напечатал javax.sql.Datasource
:Запрос на регистрацию и настройку ручной обработки
package com.so;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.datasource.AbstractDataSource;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class TestSpring {
public static void main(String[] args) {
Class<?>[] classes = new Class[]{AConf.class, ADAO.class, AService.class, RepoConf.class} ;
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(classes);
}
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE + 100)
public static class AConf {
@Autowired
AService aService;
}
@Repository
@Order(Ordered.LOWEST_PRECEDENCE)
public static class ADAO {
@Autowired
@Qualifier("myds")
DataSource dataSource;
}
@Service
@Order(Ordered.LOWEST_PRECEDENCE)
public static class AService {
@Autowired
ADAO adao;
@PostConstruct
public void init() {
System.out.println("service init");
}
}
// @Component does not have any effect
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public static class RepoConf {
@Autowired
BeanFactory beanFactory;
@PostConstruct
public void init() {
ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;
configurableBeanFactory.registerSingleton("myds", new AbstractDataSource() {
@Override
public Connection getConnection() throws SQLException {
return null;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
});
}
}
}
Ручная регистрация боб имеет риски, как указано здесь: https://stackoverflow.com/a/11751503/1941560, хотя я не могу выяснить, в каких circumtances что @Order
аннотаций работ. Для вышеприведенной конфигурации приложения я ожидаю, что порядок выполнения, например; RepoConf
, AConf
, ADAO
, AService
.
Странная вещь, чтобы заметить, что, когда я изменил порядок классов компонентов, объявленных (с начала массива с RepoConf
):
Class<?>[] classes = new Class[]{RepoConf.class, AConf.class, ADAO.class, AService.class};
или изменил мой AConf
класс:
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE + 100)
public static class AConf {
@Autowired
RepoConf repoConf; // must be declared before aService
@Autowired
AService aService;
}
приложение работает, как ожидалось. Может ли кто-нибудь объяснить поведение весеннего контейнера и как я могу использовать аннотации @Order
?
springframework версия Я использую 4.2.1.RELEASE
Я попробовал '@ Order' только на конфигурациях' RestConf' и 'AConf', с этим использованием уже должно быть хорошо, но я тоже не работал. Что означает основной символ по имени? – px5x2
Если у вас есть две фасоли с одинаковым именем, один компонент переопределяет другой, например, если у вас есть фасоль с тем же именем в XML-файлах с несколькими контекстами, которые вы можете контролировать с помощью порядка файлов. Весенние бобы также могут быть определены в классах '@ Configuration', а' @ Order' помещает заказ в классы '@ Configuration', поэтому, если у вас несколько классов' @ Configuration', определяющих '@ Bean' с тем же именем, класс '@ Configuration' с наивысшим приоритетом получает создание' @ Bean' с этим именем. '@ Order' определенно кажется неправильным использованием. '@ DependsOn' выглядит лучше. – sh0rug0ru