@ Component和@ Bean注册的Bean有什么本质区别?
@ Component是类注解扫描,Spring会通过类路径扫描自动实例化,依赖无参构造;@ Bean可以进行手动定义,开发者可以自定义实例化的逻辑,根据@ Bean方法返回的实例来管理Bean。 如果同一类型的Bean被两种方式注册,Bean会覆盖Component的,因为Bean是显式配置,优先级更高。 如果一个类既引用了@ Service又在@ Configuration中使用@ Bean定义了该类的实例,容器中会有几个Bean?分别是什么名称?
使用Service没有指定名称时默认类名是首字母小写,而Bean的默认名称是方法名,如果产生了名称冲突,@ Bean注解定义的Bean会覆盖Service注解,容器中只有一个Bean,如果Bean注解指定了不同的名称那么容器中会有两个Bean。 @ Autowired和@ Resource有什么区别?Autowired什么时候会报错?
@ Autowired是Spring的原生注解,默认会按类型匹配,@ Resource是JDK注解,是优先按照名称匹配的。 当Autowired没有找到匹配类型的Bean时会报错NoSuchDefinitionException,需要设置required=false,将变量赋值为null,但是后续代码需要判断该Bean是否为空。 @ RestController和@ Controller有什么区别?如果@ Controller想返回JSON可以怎么做?
RestController注解是Controller注解和ResponseBody注解的结合,类中的所有方法默认返回JSON;所以在有Controller注解的方法上添加@ ResponseBody注解可以返回JSON。