powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / как правильно внедрить bean в компонент spring-boot.
40 сообщений из 40, показаны все 2 страниц
как правильно внедрить bean в компонент spring-boot.
    #40097050
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть класс JdbcRepository:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Repository
@Scope("prototype")
public class JdbcRepository {
    private final NamedParameterJdbcTemplate jdbc;

    public JdbcRepository(NamedParameterJdbcTemplate jdbc) {
        this.jdbc = jdbc;
    }
...
}


который работает для одного источника данных в среде spring-boot.
Нужно расширить его применение для нескольких источников данных, для нескольких значений параметра NamedParameterJdbcTemplate jdbc.

В конфигураторе создаются beans для каждого источника данных, как напр., для источника postgres:
Код: java
1.
2.
3.
4.
@Bean(name = "sourcePg")
public NamedParameterJdbcTemplate jdbcPg(HikariDataSource dataSourcePg) {
    return new NamedParameterJdbcTemplate(dataSourcePg);
}


и далее начинаются непонятки.
Для манипулирования данными разных источников используются классы DataAccessService[xx], напр., для источника postgres:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Service
public class DataAccessServicePg {
    private final NamedParameterJdbcTemplate jdbcPg;
    private final JdbcRepository jdbcRepository;

    public DataAccessService(NamedParameterJdbcTemplate jdbcPg, JdbcRepository jdbcRepository) {
        this.jdbcPg = jdbcPg;
        this.jdbcRepository = new JdbcRepository(jdbcPg);
    }
...
}


я не понимаю, как правильно внедрить bean(name = "sourcePg").
строка конструктора
Код: java
1.
 this.jdbcRepository = new JdbcRepository(jdbcPg);


очевидно, не правильная.

Как правильно внедрить bean(name = "anySource") в класс DataAccessService[anySource] ?
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097061
1. Твой бин не должен быть prototype, это обычный singleton. Ты ж не хочешь чтоб создавалось много одинаковых объектов JdbcRepository (с одинаковыми параметрами).
2. Ну и объяви несколько @Bean в контексте которые возвращают все тот же JdbcRepository:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Bean
public NamedParameterJdbcTemplate jdbcPg(HikariDataSource dataSourcePg) {
    return new NamedParameterJdbcTemplate(dataSourcePg);
}
@Bean
public NamedParameterJdbcTemplate jdbcMysql(HikariDataSource dataSourceMysql) {
    return new NamedParameterJdbcTemplate(dataSourceMysql);
}
@Bean
public NamedParameterJdbcTemplate jdbcOracle(HikariDataSource dataSourceOracle) {
    return new NamedParameterJdbcTemplate(dataSourceOracle);
}


И то же самое прийдется сделать с сервисами и пр. По сути ты создаешь как бы два приложения внутри одного.

Но архитектура конечно странноватая, я с трудом себе представляю требования.. Если расскажешь подробней зачем это все и как это будет использоваться, может тебе подскажут вариант по-удобней.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097062
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron
Как правильно внедрить

а это ты для дяди пишешь?
@Bean (name = "sourcePg")

бин с конкретным именем можно инжектировать либо неявно, указав его как имя параметра/поля, т.е. вместо NamedParameterJdbcTemplate jdbcPg -> NamedParameterJdbcTemplate sourcePg либо явно с помощью аннотации Qualifier
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097064
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron,
Какой смысл жонглировать базами в одном сервисе?
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097065
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
прошу прощения, имя бина я указал просто для передачи смысла, в тексте .java этого нет.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097068
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,
я так и сделал: в конфигураторе объявил неск. бинов для разных источников.
и то же самое делаю для сервисов.
я тщательно не пробовал проект, т.к. пока занят простым редактированием, и строка
Код: java
1.
    this.jdbcRepository = new JdbcRepository(jdbcPg);


мне не понравилась.
вот и вопрос такой: так - можно ?
и @Scope("prototype") должен быть именно такой.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097069
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
так ведь не всегда мы властны над судьбой.
но здесь для каждой БД - свой класс-сервис.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097071
chron , с такой формулировкой тебе не помогут или помогут неправильно. Либо ты расскажешь что и зачем, либо будешь продолжать есть кактус. Это ты еще до управления транзакциями не дошел..
chronи @Scope("prototype") должен быть именно такой.Ну раз ты познал все таинства, то ты и на другие вопросы наверно сам знаешь ответы :)
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097072
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron,
Заставляют?
Это плохо.
А как тогда пишите
sping.datasource.url.......driver?
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097080
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,
да, с транзакциями всё впереди.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097082
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
короче, я понял: нужно довести проект до формирования конкретной ошибки и тогда разсуждать.
возможно, я поторопился с вопросом. пусть пока так будет. Вот здесь уже Stanislav Bashkyrtsev предвидит шикарный трах.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097084
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron,
Ну дак Hello world же.
Сначала нужно сделать демку как все делают.
А потом уже фантазии из сна постановщика или программиста.
Удачи!
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097340
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не инициализируется bean одного из источников данных.
структура проекта прилагается.

конфигураторы написаны для каждого источника данных, для pg и h2.
для БД H2 класс DataSourcesConfigurationH2:
Код: 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.
33.
34.
35.
36.
37.
38.
@Configuration
@EnableTransactionManagement
public class DataSourcesConfigurationH2 {

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.h2")
    public DataSourceProperties dataSourcePropertiesH2() {
        return new DataSourceProperties();
    }

    @Bean(name = "dataSourceH2")
    @Primary
    @ConfigurationProperties("app.datasource.h2.configuration")
    public HikariDataSource dataSourceH2(DataSourceProperties dataSourcePropertiesH2) {
        return dataSourcePropertiesH2.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean
    @Primary
    public NamedParameterJdbcTemplate jdbcH2(HikariDataSource dataSourceH2) {
        return new NamedParameterJdbcTemplate(dataSourceH2);
    }


    @Bean
    @Primary
    TransactionManager transactionManagerH2(HikariDataSource dataSourceH2) {
        return new DataSourceTransactionManager(dataSourceH2);
    }

    @Bean
    @Primary
    JdbcRepository jdbcRepositoryH2(NamedParameterJdbcTemplate jdbcH2) {
        return new JdbcRepository(jdbcH2);
    };

}



для БД postgres класс DataSourcesConfigurationPg:
Код: 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.
@Configuration
@EnableTransactionManagement
//@ComponentScan(basePackages = {"mag.jdbc.repository"})
public class DataSourcesConfigurationPg {

    @Bean
    @ConfigurationProperties("app.datasource.pg")
    public DataSourceProperties dataSourcePropertiesPg() {
        return new DataSourceProperties();
    }

    @Bean(name = "dataSourcePg")
    @ConfigurationProperties("app.datasource.pg.configuration")
    public HikariDataSource dataSourcePg(DataSourceProperties dataSourcePropertiesPg) {
        return dataSourcePropertiesPg.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean
    public NamedParameterJdbcTemplate jdbcPg(HikariDataSource dataSourcePg) {
        return new NamedParameterJdbcTemplate(dataSourcePg);
    }
    @Bean
    TransactionManager transactionManagerPg(HikariDataSource dataSourcePg) {
        return new DataSourceTransactionManager(dataSourcePg);
    }

    @Bean
    JdbcRepository jdbcRepositoryPg(NamedParameterJdbcTemplate jdbcPg) {
        return new JdbcRepository(jdbcPg);
    };
}


класс JdbcRepository подключается из локальной библиотеки .m2
строка в начале листинга закомментирована
Код: java
1.
//@ComponentScan(basePackages = {"mag.jdbc.repository"})


потому, что класс находится без этого указателя.
--------
класс манипулирования данными DataAccessServicePg:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Service
public class DataAccessServicePg {

    private final JdbcRepository jdbcRepositoryPg;

    public DataAccessServicePg(JdbcRepository jdbcRepositoryPg) {
        this.jdbcRepositoryPg = jdbcRepositoryPg;
    }

    public Actor actorOne(String actorName) {
        return jdbcRepositoryPg.presentByString("actorList",
                actorName, ActorMapper::new, Actor::new);
    }

}



контроллер BaseController, который вызывает метод Actor actorOne:
Код: 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.
@Controller
@RequestMapping("")
public class BaseController {
    private final DataAccessServicePg servicePg;

    public BaseController(DataAccessServicePg servicePg) {
        this.servicePg = servicePg;
    }

    @GetMapping("")
    public String primary(
            Model model) {
        return "primary";
    }
    @GetMapping("/dataH2")
    public String spaceH2(
            HttpServletRequest request, Model model) {

        return "spaceData";
    }

    @GetMapping("/dataPg")
    public String spacePg(
            HttpServletRequest request, Model model) {

        Actor actor = servicePg.actorOne("palomnic");
        model.addAttribute("pageTitle", "pg: palomnic");
        model.addAttribute("actor", actor);
        return "spaceData";
    }

}


остальное — стандартно.

вызываю метод контроллера @GetMapping("/dataPg") и получаю сообщение:
Код: html
1.
2.
[500] Internal Server Error 
PreparedStatementCallback; bad SQL grammar [select * from actorList(?);]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Функция "ACTORLIST" не найдена Function "ACTORLIST" not found; SQL statement: select * from actorList(?); [90022-200]


из которого ясно, что вызывается метод сервиса H2, а не pg. Функция actorlist есть в БД pg, и её нет в БД H2. Другими словами, не выполнился код инициализации в конфигураторе DataSourcesConfigurationPg.

Кто знает, куда нужно посмотреть ?
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097373
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставь брейпоинты в Pg-конфигурации и посмотри что туда реально прилетает при создании бинов, возможно ты что-то с пропертями намутил и туда приходит не то, что ты думаешь. Так сложно на глаз косяк заметить, вроде бы (вроде бы) все норм
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097376
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
вот с каким application.properties всё запускается:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
server.servlet.context-path=/transData
server.error.include-message=always
spring.devtools.add-properties=false
spring.main.banner-mode=off

spring.thymeleaf.cache=false
spring.thymeleaf.enabled=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

server.error.whitelabel.enabled=false
server.error.path=/error

app.datasource.h2.jdbc-url=jdbc:h2:~/database/tester
app.datasource.h2.username=name
app.datasource.h2.password=pass

app.datasource.pg.jdbc-url=jdbc:postgresql://localhost:5432/tester
app.datasource.pg.username=name
app.datasource.pg.password=pass



в pg-конфигурации пробовал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    @Bean(name = "dataSourcePg")
    @ConfigurationProperties("app.datasource.pg.configuration")
    public HikariDataSource dataSourcePg(DataSourceProperties dataSourcePropertiesPg) {
        return dataSourcePropertiesPg.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }
    @Bean(name = "jdbcPg")
    public NamedParameterJdbcTemplate jdbcPg(@Qualifier("dataSourcePg") HikariDataSource dataSourcePg) {
        return new NamedParameterJdbcTemplate(dataSourcePg);
    }
    @Bean(name = "jdbcRepositoryPg")
    JdbcRepository jdbcRepositoryPg(@Qualifier("jdbcPg") NamedParameterJdbcTemplate jdbcPg) {
        return new JdbcRepository(jdbcPg);
    };


но тоже не помогло.
Конечно, дело в этом классе - конфигураторе БД pg.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097382
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
установлено: не включается инициализатор initializeDataSourceBuilder() для бина
Код: java
1.
2.
3.
4.
5.
@Bean(name = "dataSourcePg")
@ConfigurationProperties("app.datasource.pg.configuration")
public HikariDataSource dataSourcePg(DataSourceProperties dataSourcePropertiesPg) {
    return dataSourcePropertiesPg.initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097478
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron
установлено: не включается инициализатор initializeDataSourceBuilder() для бина

откуда вообще префикс "app.datasource.pg.configuration" - у тебя в пропертях такого нет, есть "app.datasource.h2" и "app.datasource.pg". и зачем он вообще над методом, если бин DataSourceProperties создается отдельно строчкой выше?
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097491
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, да, это лишнее.
я оставил:
-- в классе DataSourcesConfigurationH2
Код: java
1.
2.
3.
4.
5.
6.
    @Bean(name = "dataSourceH2")
    @Primary
    @ConfigurationProperties(prefix="app.datasource.h2")
    public HikariDataSource dataSourceH2(DataSourceProperties dataSourcePropertiesH2) {
        return dataSourcePropertiesH2.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }


-- и в классе DataSourcesConfigurationPg
Код: java
1.
2.
3.
4.
5.
    @Bean(name = "dataSourcePg")
    @ConfigurationProperties(prefix="app.datasource.pg")
    public HikariDataSource dataSourcePg(DataSourceProperties dataSourcePropertiesPg) {
        return dataSourcePropertiesPg.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }


но в обоих классах значение HikariDataSource datasource.getDriverClassName() после инициализации равно "org.h2.Driver".
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097523
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно значит дебажить что происходит в методе dataSourcePg - какие DataSourceProperties туда реально попадают и почему. Магия спринга нах. Я если честно, ни видал такого способа конфигурации через DataSourceProperties, по идее (по идее) должно работать и так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Bean
    @ConfigurationProperties(prefix="spring.first-datasource")
    public DataSource firstDataSource() {
        return DataSourceBuilder.create().build();
    }

@Bean
@ConfigurationProperties(prefix="spring.second-datasource")
    public DataSource secondDataSource() {
        return DataSourceBuilder.create().build();
    }
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097572
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, всё предельно просто, но не работает:
application.properties
Код: html
1.
2.
3.
4.
5.
6.
7.
app.datasource.h2.jdbc-url=jdbc:h2:~/database/tester
app.datasource.h2.username=usr
app.datasource.h2.password=pwd

app.datasource.pg.jdbc-url=jdbc:postgresql://localhost:5432/tester
app.datasource.pg.username=usr
app.datasource.pg.password=pwd



config h2
Код: 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.
    @Bean
    @Primary
    @ConfigurationProperties(prefix="app.datasource.h2")
    public DataSource dataSourceH2() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public NamedParameterJdbcTemplate jdbcH2(HikariDataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }

    @Bean
    @Primary
    JdbcRepository jdbcRepositoryH2(NamedParameterJdbcTemplate jdbc) {
        return new JdbcRepository(jdbc);
    };

    @Bean
    @Primary
    TransactionManager transactionManagerH2(HikariDataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }



config pg
Код: java
1.
2.
3.
4.
5.
6.
    @Bean
    @ConfigurationProperties(prefix="app.datasource.pg")
    public DataSource dataSourcePg() {
        return DataSourceBuilder.create().build();
    }
...


не инициализируется dataSourcePg ну, никак. без дебаггера ясно, что spring`у нужно что-то подсказать.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097583
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron,
Сворачивайся и делай как все.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097598
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
как это - как все ?
я не могу получить ответ на простой вопрос: как инициализировать в spring два источника данных. Даже в документации об этом есть http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-two-datasources . Значит - есть в этом потребность. Но указанный в доках код не работает и никто не знает ответа - почему. Я считал, что spring при его популярности, такие вопросы уже закрыл.
В данном случае выполняется "ручная инициализация", которая полностью в доках не описана, отсюда и непонятки.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097601
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron,
Смотри первый пост.
Жонглировать коннектами бд в одном приложении глупость.
Сделай микросервисы. Или jdbc. Но спринг и jpa и ОРМ и хибер не заточен на это.
Имхо
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097603
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chron
Значит - есть в этом потребность.
у тебя одного?
Прогеры часто выдумывают себе самому работу. Бывает.
...
Рейтинг: 0 / 0
как правильно внедрить bean в компонент spring-boot.
    #40097605
chron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
да, про микро я уже думал. побарахтаюсь ещё немного и буду всё переделывать.

chpasha спрашивал, откуда взялось использование
Код: java
1.
2.
3.
4.
5.
    @Bean
    @ConfigurationProperties("app.datasource.pg")
    public DataSourceProperties dataSourcePropertiesPg() {
        return new DataSourceProperties();
    }


вот отсюда взялось https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.data-access.configure-two-datasources .
...
Рейтинг: 0 / 0
как правильно внедрить 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
40 сообщений из 40, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / как правильно внедрить bean в компонент spring-boot.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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