Как создать экземпляр класса обслуживания в классе без компонентов - PullRequest
2 голосов
/ 18 июня 2020

У меня есть класс обслуживания, который выполняет почтовый вызов. Я хотел бы создать экземпляр этого bean-компонента / autowire для создания объекта в другом классе, который не является классом компонента или конфигурации.

@Service
public class SavePayload {

  // Rest Post Call implementation 

}



    public class PayloadRecord
            implements Record {

        private String payload;

        PayloadProcessor payloadProcessor = new PayloadProcessor();

        public PayloadRecord(String payload) {
            this.payload = payload;
        }

        @SneakyThrows
        @Override
        public boolean isValid() throws ValidationException {
            payloadProcessor.savePayload(payload);
            return true;
        }

        @Override
        public byte[] getBytes(Charset charset) {
            return payload.getBytes(StandardCharsets.UTF_8);
        }

        @Override
        public String getID() {
            return payload;
        }


        @Override
        public String toString() {
            return payload;
        }

        private static class PayloadProcessor {

            @Autowired
            private SavePayload savePayload;

        }

    }

Я использую шаблон, который будет выполнять обработку записи . Как только я получил сообщение, я назначаю его Payload в Payload Record, который не является классом компонентов. Я хочу инициализировать службу SavePayload. Служба сохранения полезной нагрузки возвращает значение null.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

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

@Component
public class ContextAwareClass implements ApplicationContextAware {

    private static ApplicationContext ctx;

    public static ApplicationContext getApplicationContext() {
        return ctx;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        ctx = applicationContext;
    }
}

Затем просто получите контекст и получите bean-компонент, например:

public class YourRegularNoSpringComponentClass {

    public void doSomething() {
        System.out.println(ContextAwareClass
                .getApplicationContext()
                .getBean("savePayload")
        );
    }
}

Выше будет напечатан bean-компонент, если он существует в вашем контексте. В вашем случае вы бы просто использовали его, а не печатали.

Надеюсь, это поможет!

0 голосов
/ 18 июня 2020

Вам нужно будет создать экземпляр ApplicationContext

Вы можете изучить AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ();

, а затем использовать. SavePayload savePayload = applicationContext.getBean ("savePayload");

...