1、在Spring框架中,如果通过组件扫描来创建类的对象
答:在某个配置类上添加`@ComponentScan`注解,必要的话,配置这个注解的`value` / `basePackages`属性,可以指定组件扫描的根包。
将需要被Spring创建对象的类型,声明在这个根包之下,并且,在类上添加组件注解即可。
*常用的**基本**组件注解有:`@Component`、`@Controller`、`@Service`、`@Repository`。*
2、使用Spring框架时,如何选取@Bean方法和组件扫描,使得Spring创建对象
自定义的类应该使用组件扫描,其它类(不是自行创建的类型)必须使用
@Bean
方法。
3、请描述@Autowired
的自动装配机制
答:首先,在Spring容器中查找匹配类型的Spring Bean的数量
- 0个:取决于
@Autowired
注解的required
属性 **-required = true
:加载Spring时出现NoSuchBeanDefinitionException
required = false
:放弃自动装配,则属性值为null
**- 1个:直接装配,且成功
- 多个:将尝试根据名称来自动装配,要求被自动装配的属性名与Spring Bean的名称是匹配的,如果存在匹配的,则成功装配,否则,在加载Spring项目时出现
NoUniqueBeanDefinitionException
- 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加
@Qualifier
注解来指定某个Spring Bean的名称
4、请描述@Autowired
与@Resource
的装配机制的区别
答:@Autowired
的装配机制如题3所示:
@Resource
的装配机制是:先尝试根据名称查找匹配的Spring Bean,且类型也匹配,则自动装配,如果没有匹配名称的Spring Bean,将尝试按照类型来装配,简单来说,是先根据名称,再根据类型的装配机制。
请描述@Autowired
与@Resource
的区别
答:两者的装配机制区别如题4所示:
@Resource
是javax.annotation
包中的注解,而@Autowired
是Spring框架定义的注解。
@Resource
注解可以添加在类上、属性上、方法上,但是,只有添加在属性上,才被解释为自动装配。
@Autowired
注解可以添加在属性上、Setter方法上、构造方法上,所以,当尝试自动装配时,可以:
public class BrandController {
@Autowired
private IBrandService brandService;
}
// 本示例代码的效果,使用@Resource无法实现
public class BrandController {
private IBrandService brandService;
@Autowired
public void setBrandService(IBrandService brandService) {
this.brandService = brandService;
}
}
// 本示例代码的效果,使用@Resource无法实现
public class BrandController {
private IBrandService brandService;
@Autowired
public BrandController(IBrandService brandService) {
this.brandService = brandService;
}
}
其实,关于Spring框架自动调用构造方法:
- 如果类中仅有无参构造方法,则直接调用(不需要使用
@Autowired
注解)- 如果类中仅有1个非无参构造方法,则直接调用(不需要使用
@Autowired
注解)- 如果类中有多个构造方法,则尝试调用无参数构造方法(不需要使用
@Autowired
注解)- 如果类中有多个构造方法,且都是有参数的,则尝试调用带
@Autowired
的那1个
由于@Autowired
可以添加在方法上,如果方法的参数需要被自动装配,但名称不匹配,还可以在方法的参数前添加@Qualifier
来指定Spring Bean的名称。