Как я могу автоматически связать атрибуты объекта, который я создал вручную? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть класс, который я создал вручную, используя new, потому что мне нужно было передать ему некоторые объекты (не bean-компоненты). У него 2 жестких предмета, которые я хочу, чтобы они были подключены к весне. Это мой класс:

@Component
@Scope("prototype")
public class DayLayout extends VerticalLayout {

    @Autowired
    private SchedulingService schedulingService;

    @Autowired
    private GeneralService generalService;

    .
    .
    .
}

Но после создания класса эти объекты по-прежнему равны нулю. Я думаю, это потому, что я не получил этот боб с помощью пружинного контейнера. Но есть ли способ, как я могу создать объект вручную, и все его объекты будут по-прежнему автоматически подключены?

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Я думаю, вы неправильно понимаете некоторую часть управляемых объектов, но я не уверен, что это за часть.

Поскольку вы аннотировали компонент как @Prototype, я предполагаю, что вы понимаете, что Spring будет создавать для вас новый экземпляр каждый раз, когда вы его запрашиваете. Тогда было бы тривиально вызвать сеттеры для ваших неуправляемых объектов. Вы могли бы даже добавить подход с поясом и подтяжками, и ваш бин выдавал исключение IllegalStateException, если сеттеры не были вызваны.

@ Иван абсолютно прав, как вы можете вручную запросить боб. Он также совершенно прав, что если вы прибегаете к этому, ваш дизайн, вероятно, не самый лучший.

0 голосов
/ 04 мая 2018

Если вы это сделаете: Object obj = new Object (); Это не будет автоматически. Если вы хотите создать свой объект вручную, вы можете использовать файл конфигурации с @Configuration и вернуть @Bean. https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html. Если это не то, что вы хотите, можете ли вы представить, как вы создаете эти два объекта? Что вы им передаете?

0 голосов
/ 04 мая 2018

Так что, если вам нужно добавить Autowired свойства к объекту, созданному с помощью new, вы можете сделать следующее:

DayLayout dl = new DayLayout(<whatever parameters go here>);
ctx.getAutowireCapableBeanFactory().autowireBean(dl); // Where ctx is Spring's application context

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

0 голосов
/ 04 мая 2018

Предполагая, что GeneralService не является классом, аннотированным @Component или другими аннотациями Spring для стереотипов: да, есть.

@Configuration
public class ConfigClasses{

@Bean
public GeneralService generalService(){
    return new GeneralService();
    }

}

Очевидно, то же самое для SchedulingService, просто добавьте еще один метод, который создает этот класс.

...