【路径扫描】
Spring注重路径,约定大于配置
例如,这个路径下,Spring默认会去扫描下【com.baiye.ioc】下面所有类中加了五大注解的路径,不在这个路径下是默认不会去扫描的
即:Spring默认的扫描路径是——启动类所在的目录及其子目录
但,当启动类放到Service包中时,扫描路径就变成了【com.baiye.ioc.Service】,那么我们的其他包(component,config等)就都扫描不到了
所以我们可以使用注解「@ComponentScan」来去定义扫描路径
这会很麻烦,所以我们一般默认把启动类放到最外层,不要放到包中
【DI依赖注入】
我们可以依靠“依赖注入”从IoC容器中以一种更方便的方式取对象,并注入给使用者
依赖注入共有三种方式
1.属性注入
2.构造方法注入
3.setter方法注入
【属性注入】
使用「@Autowired」注解
在这里,UserService这个对象交给了Spring进行管理,然后通过@Autowired注入给UserController这个使用方,这就是「属性注入」
【构造方法注入】
但需要注意的是,如果有了带参的构造方法,那么默认提供的无参构造方法就不存在了
但如果补充了无参构造方法,会报错
spring在帮我们管理对象时,它一般会走构造方法,而代码中有两个构造方法,它不知道使用哪个,因此它使用了默认的无参构造方法,这样一来UserService就为null值,报错了
因此我们可以给有参方法加上@Autowired注解来解决这个问题
当存在多个构造方法时,需要使用@Autowired指定默认的构造方法
如果只存在一个构造方法,@Autowired可以省略
值得一提的是,交给Spring管理的对象,如果有参数,这个参数可以自己指定
如果未指定,Spring会根据名称或类型,从容器中查找对象,并注入进来
【setter方法注入】
同理,也是要加上@Autowired,它不可省略
【三种注入优缺点】
此外,@Autowired在同种类型时,有多个名称的对象时,按照名称来注入
该类型只有一个对象时,直接注入
但如果这个类型有多个对象,且名称与已有的对象名称不符时,会报错
因此,我们可以使用「@Qualifier」注解
可以在该注解内部指定想要的对象名称
该注解也可以这么使用
此外,还有一种Spring自己提供的方式:使用「@Resource」注解
在name参数中写对象名称,可以调用对应类型的对象
【总结】
【SpringMVC和SpringBoot的理解】
Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个MVC框架,而Spring Boot是基于Spring的一套快速开发整合包
【常见注解和它们的作用】
web中url的映射:@RequestMapping
参数接收,接口响应:@RequestParam,@RequestBody,@ResponseBody
bean的存储:@Controller,@Service,@Repository,@Component,@Configuration,@Bean
bean的获取:@Autowired,@Qualifier,@Resource
【@Autowired和@Resource的区别】
1.@Autowired根据类型匹配,@Resource根据名称匹配
2.@Autowired是spring框架提供的注解,@Resource是jdk提供的注解