这段代码会有隐患吗?

网上看来的一种写法
某个配置类,构造函数的时候去查数据库取数据,
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 = ...;

}

}


回答:

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


回答:

倒是不会出错,但是这种写法很奇怪,一般是用@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这个注解

例子:

如果不加就会出现

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

以上是 这段代码会有隐患吗? 的全部内容, 来源链接: utcz.com/p/944992.html

回到顶部