当前位置: 首页 > 知识库问答 >
问题:

自定义springboot自动配置不检测bean

施海
2023-03-14
@Configuration
@ConditionalOnClass({LibServer.class, LibClient.class})
@EnableConfigurationProperties(LibProperties.class)
public class LibAutoConfiguration {

    @Autowired
    LibProperties props;

    @Bean
    @ConditionalOnMissingBean(LibServer.class)
    public LibServer lbServ() {
        // create and configure a server object
    }

    @Bean
    @ConditionalOnMissingBean(LibClient.class)
    public LibClient lbClient() {
        //create and configure a client object
    }
}

本机Spring Boot自动配置(例如datasourceone)也可以检测主类中声明的bean(例如@bean注释的jdbctemplate方法)。

如何对主类中声明的bean进行正确的bean检测?

编辑

共有1个答案

梁丘招
2023-03-14

如果在application.properties(logging.level.org.springframework=debug)中设置debug的日志级别,您将注意到Spring将检测这两个定义。然而,您还将看到,这种情况发生的顺序可能与您预期的不一样,因为它首先从库配置实例化bean,然后从主类实例化bean,因此您得到了2个实例(删除了时间戳,使其更加友好):

Bean定义

o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'autoConfigurationReport'
a.ConfigurationClassBeanDefinitionReader : Registering bean definition for @Bean method af.spring.boot.libbo.LibAutoConfiguration.lbServ()
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'org.springframework.boot.autoconfigure.condition.BeanTypeRegistry'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'autoConfigurationReport'
a.ConfigurationClassBeanDefinitionReader : Registering bean definition for @Bean method af.spring.boot.libbo.LibAutoConfiguration.lbClient()
a.ConfigurationClassBeanDefinitionReader : Registering bean definition for @Bean method af.DemoLibboApplication.libServ()
a.ConfigurationClassBeanDefinitionReader : Registering bean definition for @Bean method af.DemoLibboApplication.libClient()

Bean实例化

o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'lbServ'
o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'lbServ'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'libAutoConfiguration'
Autoconfiguring LibServer
o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'lbServ' to allow for resolving potential circular references
o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'lbServ'
o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'lbClient'
o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'lbClient'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'libAutoConfiguration'
Autoconfiguring LibClient
o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'lbClient' to allow for resolving potential circular references
o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'lbClient'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'lib.CONFIGURATION_PROPERTIES'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.store'
o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'libServ'
o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'libServ'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'demoLibboApplication'
o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'libServ' to allow for resolving potential circular references
o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'libServ'
o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'libClient'
o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'libClient'
o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'demoLibboApplication'
o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'libClient' to allow for resolving potential circular references
o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'libClient'
Positive matches:
-----------------
...
LibAutoConfiguration#lbClient matched
  - @ConditionalOnMissingBean (types: af.libbo.LibClient; SearchStrategy: all) found no beans (OnBeanCondition)

LibAutoConfiguration#lbServ matched
  - @ConditionalOnMissingBean (types: af.libbo.LibServer; SearchStrategy: all) found no beans (OnBeanCondition)
...
Negative matches:
-----------------
...
DemoLibboApplication#libClient did not match
  - @ConditionalOnMissingBean (types: af.libbo.LibServer; SearchStrategy: all) found the following [lbServ] (OnBeanCondition)

DemoLibboApplication#libServ did not match
  - @ConditionalOnMissingBean (types: af.libbo.LibServer; SearchStrategy: all) found the following [lbServ] (OnBeanCondition)
...
 类似资料:
  • 4.1 根据条件的自动配置 @conditional是基于条件的自动配置,一般配合Condition接口一起使用,只有接口实现类返回true,才装配,否则不装配. 用实现了Condition接口的类传入@Conditional中 @Conditional可以标记在配置类的方法中,也可以标记在配置类上.标记的位置不同,作用域不同. @Conditional可以传入多个实现了condition接口的类

  • MOSN 自定义配置说明。 本文是对 MOSN 自定义配置的说明。 Duration String 字符串,由一个十进制数字和一个时间单位后缀组成,有效的时间单位为 ns、us(或?s)、ms、s、m、h,例如 1h、3s、500ms。 metadata metadata 用于 MOSN 路由和 Cluster Host 之间的匹配。 { "filter_metadata":{ "mo

  • 如果你想自定义 Next.js 的高级配置,可以在根目录下新建next.config.js文件(与pages/ 和 package.json一起) 注意:next.config.js是一个 Node.js 模块,不是一个 JSON 文件,可以用于 Next 启动服务已经构建阶段,但是不作用于浏览器端。 // next.config.js module.exports = { /* config

  • 与以下属性相关联,但它并没有更好地工作 我该怎么办?

  • Gitea 引用 custom 目录中的自定义配置文件来覆盖配置、模板等默认配置。 如果从二进制部署 Gitea ,则所有默认路径都将相对于该 gitea 二进制文件;如果从发行版安装,则可能会将这些路径修改为Linux文件系统标准。Gitea 将会自动创建包括 custom/ 在内的必要应用目录,应用本身的配置存放在 custom/conf/app.ini 当中。在发行版中可能会以 /etc/g

  • Examples Custom babel configuration 为了扩展方便我们使用babel,可以在应用根目录新建.babelrc文件,该文件可配置。 如果有该文件,我们将会考虑数据源,因此也需要定义 next 项目需要的东西,也就是 next/babel预设。 这种设计方案将会使你不诧异于我们可以定制 babel 配置。 下面是.babelrc文件案例: { "presets":