powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / как правильно внедрить bean в компонент spring-boot.
15 сообщений из 40, страница 2 из 2
как правильно внедрить bean в компонент spring-boot.
    #40097641
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
небольшое дополнение.
если назначить нужные свойства напрямую в бинах классах конфигурации, как показано для БД postgres, то всё работает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @Bean
    public NamedParameterJdbcTemplate jdbcPg(HikariDataSource dataSource) {
        dataSource.setDriverClassName("org.postgresql.Driver");
        dataSource.setUsername("usr");
        dataSource.setPassword("pwd");
        dataSource.setJdbcUrl("jdbc:postgresql://localhost:5432/tester");
        return new NamedParameterJdbcTemplate(dataSource);
    }
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097672
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я х.з. что у тебя там не так, специально потратил время на создание пустого проекта с двумя datasource. все нах работает как надо, ковыряй свою консерваторию или выкладывай исходники

Код: json
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
app:
  datasource1:
    jdbcUrl: jdbc:postgresql://localhost:5432/postgres
    driverClassname: org.postgresql.Driver
    username: dbuser
    password: dbpass

  datasource2:
    jdbcUrl: jdbc:h2:mem:2db
    driverClassname: org.h2.Driver
    username: SA
    password:


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
@Configuration
public class MyConfig
{
	@Primary
	@Bean
	@ConfigurationProperties(prefix = "app.datasource1")
	public DataSource dataSource1()
	{
		return DataSourceBuilder.create().build();
	}

	@Bean
	@ConfigurationProperties(prefix = "app.datasource2")
	public DataSource dataSource2()
	{
		return DataSourceBuilder.create().build();
	}

	@Bean
	public JdbcTemplate jdbcTemplate1()
	{
		DataSource ds = dataSource1();
		return new JdbcTemplate(ds);
	}

	@Bean
	public JdbcTemplate jdbcTemplate2()
	{
		DataSource ds = dataSource2();
		return new JdbcTemplate(ds);
	}
}


показываю скриншоты дебага
адын
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097673
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
два
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097721
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, я твой должник.
но.
1. нужно добавить @Primary для @Bean public JdbcTemplate jdbcTemplate1()
2. используемый класс класс просит NamedParameterJdbcTemplate а не JdbcTemplate

у меня код всё равно не работает. и причина в том, что DataSourceBuilder.create().build(); не отображает свойства @ConfigurationProperties(prefix = "app.datasource.pg")

я посмотрел на stackoverflow.com, там народ использует JPA и всё работает. а я только JDBC DATA. может не хватает каких н.б. библиотек.

спасибо тебе.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097727
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, мне нужно время, у тебя в project java-16, а у меня - 11.
если причина в этом - ура.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097742
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
твой проект работает, мой нет.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097746
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron
твой проект работает, мой нет.
а ты пробовал делать инъекцию, как у меня? не через параметр метода, а через вызов метода бина? Может с этим какой-то ньюанс?
то бишь
Код: java
1.
2.
3.
4.
5.
@Bean
	public JdbcTemplate jdbcTemplate1()
	{
		return new JdbcTemplate(dataSource1());
	}



вместо
Код: java
1.
2.
3.
4.
5.
@Bean
	public JdbcTemplate jdbcTemplate1(DataSource dataSource1)
	{
		return new JdbcTemplate(dataSource1);
	}




chron

1. нужно добавить @Primary для @Bean public JdbcTemplate jdbcTemplate1()
2. используемый класс класс просит NamedParameterJdbcTemplate а не JdbcTemplate
это все не важно, т.к. многие фишки спринга требуют одного настроенного ds то @Primary просто говорит какой брать если их много. Главное что оба ds у меня правильно инициализируются. NamedParameterJdbcTemplate вообще непринципиально

chron

я посмотрел на stackoverflow.com, там народ использует JPA и всё работает. а я только JDBC DATA. может не хватает каких н.б. библиотек.
тоже не важно

chron
chpasha, мне нужно время, у тебя в project java-16, а у меня - 11.
если причина в этом - ура.

скорее всего нет.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097753
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
а ты пробовал делать инъекцию, как у меня? не через параметр метода, а через вызов метода бина? Может с этим какой-то ньюанс?

точно - в этом проблема. поменял в моем проекте и тоже инжектит один ds в оба метода (инжектит тот, что Primary). Либо меняй на инъекцию через вызов метода, либо ставь явно @Qualifier("dataSourceX") перед параметром - так тоже работает.

Интересно, это баг или фича, что внутри конфигурации не инжектит по имени параметра - я бы сказал, что баг, но поскольку рекомендованный метод инъекции через явный вызов метода внутри одного конфига, то может и фича
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097797
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
сделал, как у тебя
Код: java
1.
2.
3.
4.
5.
6.
7.
  
    @Bean
    public NamedParameterJdbcTemplate jdbcTemplateH2()
    {
        DataSource ds = dataSourceH2();
        return new NamedParameterJdbcTemplate(ds);
    }


, даже перешел на application.yml вместо application.properties, но не помогло.
здесь не выполняется начальная инициализация, при чтении конфигурационного файла:
Код: java
1.
2.
3.
4.
5.
6.
    @Bean("dataSourcePg")
    @ConfigurationProperties(prefix = "app.datasourcepg")
    public DataSource dataSourcePg()
    {
        return DataSourceBuilder.create().build();
    }


в методе .build();
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097801
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выложи минимально воспроизводимый пример - выкинь все ненужное, оставь только этот конфиг и если не работает, выкладывай
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097812
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на счет инъекции по имени прояснилось - оказывается, если существует несколько бинов одного типа, то инъекция по имени это fallback для случая, когда нет @Primary, если @Primary есть, то инжектится он, а имя параметров игнорируется. Так что лучше либо явно бин-методы вызывать, либо использовать Qualifier
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097824
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
с твоей помощью - победа.
вот как работает у меня: привожу пример только 2-й БД
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
@Configuration
public class DataSourcesConfigurationPg {
    @Bean
    @ConfigurationProperties("app.datasourcepg")
    public DataSourceProperties dataSourcePropertiesPg() {
        return new DataSourceProperties();
    }

    @Bean("dataSourcePg")
    @ConfigurationProperties(prefix = "app.datasourcepg")
    public HikariDataSource dataSourcePg() {
        return dataSourcePropertiesPg()
                .initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean("jdbcTemplatePg")
    public NamedParameterJdbcTemplate jdbcTemplatePg()
    {
        HikariDataSource ds = dataSourcePg();
        return new NamedParameterJdbcTemplate(ds);
    }
    @Bean("jdbcRepositoryPg")
    JdbcRepository jdbcRepositoryPg() {
        NamedParameterJdbcTemplate jdbc = jdbcTemplatePg();
        return new JdbcRepository(jdbc);
    };
}



и инжектить bean jdbcRepositoryPg нужно не так:
Код: java
1.
2.
3.
4.
5.
//    private final JdbcRepository jdbcRepositoryPg;
//
//    public DataAccessServicePg(JdbcRepository jdbcRepositoryPg) {
//        this.jdbcRepositoryPg = jdbcRepositoryPg;
//    }


а так:
Код: java
1.
2.
3.
    @Autowired
    @Qualifier("jdbcRepositoryPg")
    private JdbcRepository jdbcRepository;


...
пошёл изучать твою ссылочку "на счет инъекции".
без тебя - ничего бы не было.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097840
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron
пошёл изучать твою ссылочку "на счет инъекции".

это не "ссылочка", я просто запостил типа багрепорт на гитхабе спринга, они мне сказали, что это не баг и объяснили почему
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40098800
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор столкнулся с проблемой ,которая задается на любом тех интервью- как обозначить две имплементации одного интерфейса

я предпочитаю спринг нейминг- но вообще для общего понимания лучше @Qualifier(name =a)
причем нужно понимать что @Qualifier может использоваться как для обьявления ,так и для внедрения- тоесть @Primary по сути не нужен
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40099258
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O, здорово, всё работает:
конфигурация:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Configuration
public class DataSourcesConfigurationH2 {
...
//    @Primary
    @Bean
    @Qualifier("jdbcRepositoryH2")
    JdbcRepository jdbcRepositoryH2() {
        NamedParameterJdbcTemplate jdbc = jdbcTemplateH2();
        return new JdbcRepository(jdbc);
    };
...
}


и класс-Service:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@Service
public class DataAccessServiceH2 {
...
    @Autowired
    @Qualifier("jdbcRepositoryH2")
    private JdbcRepository jdbcRepository;
...
}


мне с самого начала конструкция @Primary казалась легкомысленной. Логика: если есть @Primary, значит есть альтернатива, и нужно правильно настроить возможные коллизии, а не отдавать всё @Primary.
а вообще, развитие spring напоминает ризому.
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / как правильно внедрить bean в компонент spring-boot.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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