这段代码会有隐患吗?

网上看来的一种写法
某个配置类,构造函数的时候去查数据库取数据,
configMapper这里IDEAL报以下错误:
Could not autowire. No beans of 'ConfigMapper' type found.
但是,代码也能正常运行也查到东西了,就是不知道有什么隐患没?

...

    @Configuration
    @Data
    public class AppConfig {

        private String some;
        
        //configMapper这里ideal是报错的
        @Autowired
        public AppConfig(ConfigMapper configMapper) {
            System.out.println("---------------");
            List<ConfigDO>  all= configMapper.selectList();
            System.out.println(all);
            this.some = ...;

        }
    }
阅读 2.2k
4 个回答
  • @Configuration搭配@Bean注解作为配置类使用,这里把@Cofiguration换成@Component注解。虽然@Configuration这样用最终的效果一样,但语义不一样,所以放到这里不合适。
  • Spring4.x开始构造方法上面可以不使用@Autowired,spring会根据构造方法的参数去容器找到bean然后传参进去。
  • 对于你说的这个问题没有任何隐患,因为不管这段逻辑放在哪里,最终都是要被执行的,而且你的期望是只执行一次。所以放到构造方法里面也是合理的。但既然使用了spring,建议保持跟spring一样的风格,spring及springboot提供了以下初始化方式
  • 实现InitializingBean
    image.png
  • 使用@PostConstruct注解
    image.png
  • 实现ApplicationRunner
    image.png
  • 实现CommandLineRunner
    image.png
  • 使用@Configuration+@Bean
    image.png
  • 最终这些方法都会在容器启动时被执行
    image.png

倒是不会出错,但是这种写法很奇怪,一般是用@PostConstruct在bean实例化之后来做这个处理

没有什么隐患,因为ConfigMapper 是通过@MapperScan去扫描注入的,所以idea并不清楚这个ConfigMapper是个bean才会提示Could not autowire. No beans of 'ConfigMapper' type found.如果实在不想idea提示给ConfigMapper上加上@Component或者@Repository注解就可以了,但是没什么必要。
补充: 想要解决idea不提示的问题可以参考以下做法
1、在AppConfig的参数中使用@Qualifier注解

    //configMapper这里ideal是报错的
    @Autowired
    public AppConfig(@Qualifier("configMapper") ConfigMapper configMapper) {
        System.out.println("---------------");
        List<ConfigDO> all= configMapper.selectList();
        System.out.println(all);
        this.some = "...";

    }

2、在ConfigMapper上加上注入

@Repository
public interface ConfigMapper {

    List<ConfigDO> selectList();
}

看了一下你的代码猜测ConfigMapper是mybatis的一个mapper,mybatis的mapper需要加上@org.apache.ibatis.annotations.Mapper这个注解

例子:
image.png

如果不加就会出现image.png

这个注解在Spring Boot项目当中只作用于提醒IDE告诉他这是一个Bean, 但是最好用这个注解标记一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题