powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Autowired над конструктором
11 сообщений из 11, страница 1 из 1
Autowired над конструктором
    #39710569
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Недавно прочитал на хабре, что внедрение зависимостей через поле -это не очень хорошо. И решил попробовать через конструктор (раз уж настоятельно советуют)
И столкнулся с вопросом: а где собственно прописыва-то @Autowired?
Вот тут [1]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
@Configuration
@ComponentScan(basePackages = "com.example")
public class GeneralConfig {

    @Bean
    @Autowired //[1]
    public ThreadManager threadManager(Config config){
      return   new ThreadManager(config) {
            protected xmlsProcessor getXmlProcessor() {
                return xmlProcessor();
            }
        };
    }

    @Bean
    @Scope("prototype")
    public XmlProcessor xmlProcessor(){
        return new XmlProcessor ();
    }
}



Или вот тут [2]:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class XmlProcessor{

    
    private Config config;
    
    @Autowired //[2]
    public XmlProcessor(Config config) {
        this.config = config;
    }

//и т.д.
}



Config, если что, помечен, как @Component
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39710572
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, не тот класс)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public abstract class ThreadManager {

    private Config config;

    @Autowired //[2]
    public ThreadManager(Config config) {
        this.config = config;
    }

    protected abstract RejectStatusProcessor getRejectStatusProcessor();
}
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39710578
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в статье скорее всего имелся в виду второй вариант - внедрение зависимостей в объект. в первом же примере у тебя конфигурация для dependency injection - т.е. это ява-аналог xml-файлов спринга.
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39710587
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpasha, то есть я правильно понимаю, что внедрять через конструктор имеет смысл, например, вот в таком классе:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Component
public class Config {
    private SettingsDao settingsDao;

    @Autowired
    public Config(SettingsDao settingsDao) {
        this.settingsDao = settingsDao;
    }
}



Или неправильно мысль понял?

И как в приведенном изначально примере все же внедрить зависимости?
Чувствую, что, честно говоря, подзапутался
Статья , кстати
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39710628
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timeinто есть я правильно понимаю
правильно. по-крайней мере архитектурно

TimeinИ как в приведенном изначально примере все же внедрить зависимости?
там много вариантов

если config определен в другом месте или для его создания не нужно никаких особых телодвижений, то например так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Configuration
@ComponentScan(basePackages = "com.example")
public class GeneralConfig {
    @Autowired
    Config config

    @Bean
    public ThreadManager threadManager(){
      return   new ThreadManager(config) {
            protected xmlsProcessor getXmlProcessor() {
                return xmlProcessor();
            }
        };
    }
}



если config определен тут же то так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
@Configuration
@ComponentScan(basePackages = "com.example")
public class GeneralConfig {
    
    @Bean    
    public ThreadManager threadManager(){
      return   new ThreadManager(config()) {
            protected xmlsProcessor getXmlProcessor() {
                return xmlProcessor();
            }
        };
    }

    @Bean
    Config config() {
        Config c = new Config();
        ....
        return c;
    }

}



Ява-конфигурация для spring это не совсем обычный класс, по-этому не все методы правильного проектирования стоит применять к нему слишком рьяно (кроме очевидных типа do not repeat yourself и т.п.).
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39710633
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P. S. так кстати тоже работает, так что можно более компактно записать, особенно если объект нужен только в одном месте
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Configuration
@ComponentScan(basePackages = "com.example")
public class GeneralConfig {
    

    @Bean
    public ThreadManager threadManager(@Autowired Config config){
      return   new ThreadManager(config) {
            protected xmlsProcessor getXmlProcessor() {
                return xmlProcessor();
            }
        };
    }
}
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39711338
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaTimeinто есть я правильно понимаю
правильно. по-крайней мере архитектурно

Ява-конфигурация для spring это не совсем обычный класс, по-этому не все методы правильного проектирования стоит применять к нему слишком рьяно (кроме очевидных типа do not repeat yourself и т.п.).
яваконфиг спринга это точно такой же бин как и другие бины с той лишь разницей, что он всегда синглтон и запускается первым по списку, делая что-то этакое прежде чем "загрузятся" те бины что в этом бине описаны.

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

далее, лично для меня в кострукторах некрасиво то что если у тебя скажем, внутри твоего бина подвязаны еще 2-3-4-5 бинов, то твой конструктор будет выглядеть как колбаса. и будет весь код в таких вот колбасках.
в клинкоде чел очень нервно относился к методам где больше ОДНОГО параметра, типа 2 это окей 3 это трэш на грани безумия, 4 - это форменное безумство.

я канеш понимаю, что, скажем, слишком много инжектов в один бин это плохо, но один инжект в один бин это чот совсем мало.
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39711634
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если конструктор в классе один, то над ним можно не писать @Autowired
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39711768
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTяваконфиг спринга это точно такой же бин
не согласен. имхо яваконфиг - это в первую очередь конфиг, т.е. DSL для инициализации контейнера. Применимы ли все правила написания ява-бинов к конфигу на groovy или xml? И если нет, то почему они должны быть применимы к ява-конфигу?

andreykaTа вот насчет автоваера в конструкторе вот тут не совсем лично мне ясен смысл такого автоваера, ну кроме пространных заявлений что они архитектурно "правильнее" чем как поля
если я правильно понял посыл статьи (но я признаться по диагонали просмотрел) там критикуется инъекция на поле, как ограничивающая использование бина без DI

andreykaTесли у тебя скажем, внутри твоего бина подвязаны еще 2-3-4-5 бинов
автор статьи утверждает, что если у нас много бинов, то что-то не так в консерватории и возможно класс делает слишком много всего
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39711929
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaandreykaTесли у тебя скажем, внутри твоего бина подвязаны еще 2-3-4-5 бинов
автор статьи утверждает, что если у нас много бинов, то что-то не так в консерватории и возможно класс делает слишком много всего

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

насчет простыней инжекта тоже согласен. но не согласен с утверждением что не больше одного-двух. 1-2 это идеал. но не всегда бывает именно так. я (не утверждаю что это бестпрактиз) видал и легаси классы где инжектов было с десяток. как там будет выглядеть конструктор?
...
Рейтинг: 0 / 0
Autowired над конструктором
    #39712077
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTно даже в джавовских либах искаропки
никто не безгрешен

andreykaTвидал и легаси классы где инжектов было с десяток. как там будет выглядеть конструктор?вот там скорее всего широкое поле для рефакторинга
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Autowired над конструктором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]