面试题
Spring框架中,如果通过组件扫描来创建类的对象
在某个配置类上添加@ComponentScan
注解,必要的话,配置这个注解的value
/ basePackages
属性,可以指定组件扫描的根包。
将需要被Spring创建对象的类型,声明在这个根包之下,并且,在类上添加组件注解即可。
常用的基本组件注解有:@Component
、@Controller
、@Service
、@Repository
。
使用Spring框架时,如何选取@Bean方法和组件扫描,使得Spring创建对象
自定义的类应该使用组件扫描,其它类(不是自行创建的类型)必须使用@Bean
方法。
请描述@Autowired
的自动装配机制
首先,在Spring容器中查找匹配类型的Spring Bean的数量
- 0个:取决于
@Autowired
注解的required
属性required = true
:加载Spring时出现NoSuchBeanDefinitionException
required = false
:放弃自动装配,则属性值为null
- 1个:直接装配,且成功
- 多个:将尝试根据名称来自动装配,要求被自动装配的属性名与Spring Bean的名称是匹配的,如果存在匹配的,则成功装配,否则,加载Spring时出现
NoUniqueBeanDefinitionException
- 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加
@Qualifier
注解来指定某个Spring Bean的名称
- 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加
请描述@Autowired
与@Resource
的装配机制的区别
【先回答以上@Autowired
的装配机制】
@Resource
的装配机制是:先尝试根据名称查找匹配的Spring Bean,且类型也匹配,则自动装配,如果没有匹配名称的Spring Bean,将尝试按照类型来装配,简单来说,是先根据名称,再根据类型的装配机制。
请描述@Autowired
与@Resource
的区别
【先回答以上题目的答案】
@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的名称。
在Spring框架中,IoC与DI的区别
IoC:Inversion Of Control,控制反转,表示将对象的控制权(创建、管理)交给框架
DI:Dependency Injection,依赖注入,表现为给对象的依赖属性赋值
Spring框架通过DI实现了(完善了)IoC。
Spring MVC的核心处理流程
Spring MVC的核心组件:
DispathcerServlet
:用于统一接收请求,并分发HandlerMapping
:记录了请求路径与处理请求的控制器组件的对应关系Controller
:实际请求的组件ModelAndView
:封装了数据与视图名称的结果ViewResolver
:根据视图名称确定实际应用的视图组件
使用Mybatis的查询时,如何选取resultType和resultMap
在配置<select>
节点时,必须配置resultType
或resultMap
,其中,resultType
是直接指定返回值的类型,此属性的取值为返回值类型的全限定名,而resultMap
的取值为自行配置的<resultMap>
节点的id
属性的值,而自定义的<resultMap>
是用于指导Mybatis如何封装查询结果的。
当抽象方法的返回值类型是基本数据类型(例如统计查询)或其它基本值类型(通常包括String
)时,只能使用resultType
。
当抽象方法的返回值类型是封装的类型时,强烈推荐使用resultMap
,因为<resultMap>
可能具有一定的复用性,并且,复杂的关联查询只能使用<resultMap>
的配置。