如何在Spring Boot中以编程方式创建bean?

如何在Spring Boot中以编程方式创建bean?,第1张

如何在Spring Boot中以编程方式创建bean?

如何创建你的bean并要求Spring Boot向其中注入值?

就像是

@Bean@ConfigurationProperties("ds.client1")public DataSource dataSourceClient1() {    DataSourceBuilder.create().build();}@Bean@ConfigurationProperties("ds.client2")public DataSource dataSourceClient2() {    DataSourceBuilder.create().build();}

然后,

ds.client1
名称空间中的任何设置都属于第一个数据源(即
ds.client1.password
该数据源的密码
DataSource
)。

但是,也许你不知道将拥有多少数据源?这变得越来越复杂,尤其是当你需要将那些动态数据源注入其他对象时。如果只需要按名称查找它们,则可以将它们自己注册为单例。这是一个有效的例子

@ConfigurationProperties(prefix = "ds")public class DataSourceSettings implements BeanFactoryAware {    private List<String> clients = new ArrayList<>();    private BeanFactory beanFactory;    public List<String> getClients() {        return clients;    }    public void setClients(List<String> clients) {        this.clients = clients;    }    @Override    public void setBeanFactory(BeanFactory beanFactory) {        this.beanFactory = beanFactory;    }    @PostConstruct    public void configure() {        Map<String, String> clientDataSources = new HashMap<String, String>();        for (String client : clients) { // extract client name String[] parts = client.split("\|"); String clientName = parts[0]; String url = parts[1]; // client to datasource mapping String dsName = url.substring(url.lastIndexOf("/") + 1); if (clientName.contains(",")) {     // multiple clients with same datasource     String[] clientList = clientName.split(",");     for (String c : clientList) {         clientDataSources.put(c, url);     } } else {      clientDataSources.put(clientName, url); }        }        Assert.state(beanFactory instanceof ConfigurableBeanFactory, "wrong bean factory type");        ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;        for (Map.Entry<String, String> entry : clientDataSources.entrySet()) { DataSource dataSource = createDataSource(entry.getValue()); configurableBeanFactory.registerSingleton(entry.getKey(), dataSource);        }    }    private DataSource createDataSource(String url) {        return DataSourceBuilder.create().url(url).build();    }}

请注意,这些bean 仅可通过bean名称查找获得。让我知道是否适合你。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5011448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存