这段代码会有隐患吗?
网上看来的一种写法
某个配置类,构造函数的时候去查数据库取数据,
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上加上注入
@Repositorypublic interface ConfigMapper {
List<ConfigDO> selectList();
}
回答:
看了一下你的代码猜测ConfigMapper
是mybatis的一个mapper,mybatis的mapper需要加上@org.apache.ibatis.annotations.Mapper
这个注解
例子:
如果不加就会出现
这个注解在Spring Boot项目当中只作用于提醒IDE告诉他这是一个Bean, 但是最好用这个注解标记一下
以上是 这段代码会有隐患吗? 的全部内容, 来源链接: utcz.com/p/944992.html