Невозможно autowire bean в классе планировщика задач в Java [duplicate]

Ошибки округления с плавающей запятой. 0,1 не могут быть представлены точно в базе-2, как в базе-10, из-за недостающего простого коэффициента 5. Так же, как 1/3 принимает бесконечное число цифр для представления в десятичной форме, но составляет «0,1» в базе-3, 0.1 принимает бесконечное число цифр в базе-2, где оно не находится в базе-10. И компьютеры не имеют бесконечного объема памяти.

17
задан T.G 3 March 2016 в 08:52
поделиться

3 ответа

Вы не можете @Autowired статическое поле. Но с этим сложно справиться:

@Component
public class StatisticLogger {

  private static Dao dao;

  @Autowired
  private Dao dao0;

  @PostConstruct     
  private void initStaticDao () {
     dao = this.dao0;
  }

}

В одном слове @Autowired поле экземпляра и присваивать значение статическому файлу, когда вы строите свой объект. BTW, объект StatisticLogger должен управляться также Spring.

41
ответ дан Weibo Li 5 September 2018 в 10:39
поделиться

Я знаю, что это старый вопрос, но просто хотел поделиться тем, что я сделал, решение @Weibo Li в порядке, но проблема в том, что он поднимает критическое предупреждение сонара о назначении нестатической переменной статической переменной

способ, которым я разрешил его без предупреждений сонара, следующий

  1. Я меняю StatisticLogger на singlton class (уже не статический), как этот публичный класс StatisticLogger {private static StatisticLogger instance = null; частный Дао Дао;
    public static StatisticLogger getInstance() {
        if (instance == null) {
            instance = new StatisticLogger();
        }
        return instance;
    }
    
    protected StatisticLogger() {
    }
    
    public void setDao(Dao dao) {
        this.dao = dao;
    }
    public void AddLoginEvent(LogStatisticBean user){
        //TODO code it god damn it
    }
    public void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
        //TODO code it god damn it
    }
    public  void addErrorLog(Exception e, String page,  HashMap<String, Object> parameters){
        ExceptionLogBean elb=new ExceptionLogBean();
        elb.setStuntDescription(e);
        elb.setSourcePage(page);
        elb.setParameters(parameters);
        if(dao!=null){ 
            dao.saveOrUpdateEntity(elb);
    }
    
    }
  2. Я создал службу (или компонент), которая автоматически выполняет службу, которую я хочу, и задаю ее в классе singlton. Это безопасно, так как весной она инициализирует все управляемые компоненты, прежде чем что-либо делать и это означает, что метод PostConstruct, приведенный ниже, всегда вызывается, прежде чем что-либо может получить доступ к StatisticLogger примерно так, как этот публичный класс @Component DaoSetterService {
    @Autowired
    private Dao dao0;
    
    @PostConstruct     
    private void setDaoValue () {
        StatisticLogger.getInstance().setDao(dao0);
    }
    
    }
  3. Вместо использования StatisticLogger в качестве статического класса я просто использую его как StatisticLogger. getInstance (), и я могу получить доступ ко всем методам внутри него
0
ответ дан Hani 5 September 2018 в 10:39
поделиться

Классическое автоустройство, вероятно, не будет работать, потому что статический класс не является Bean и, следовательно, не может управляться Spring. Есть способы обойти это, например, используя aproach в или загружая компоненты из контекста Spring в статическом блоке инициализатора, но я бы предложил изменить design:

Не используйте статические методы, используйте службы, которые вы вводите там, где они вам нужны. Если вы используете Spring, вы можете использовать его правильно. Инъекция зависимостей - это объектно-ориентированная техника, и это имеет смысл, если вы действительно используете ООП.

15
ответ дан Sean Patrick Floyd 5 September 2018 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: