控制反转(IoC)
IoC(Inversion of Controller:控制反转)的思想就是将原本在程序中手动创建对象的控制权交给Spring框架来管理,也就是说控制对象生命周期的不再是引用他的对象,而是容器,这就是控制反转。
使用控制反转的好处:将对象的之间的依赖关系交给IoC容器来管理,并由IoC容器染成对象的注入。这样在很大程度上能够简化应用的开发,把应用从复杂的依赖关系中解放出来。IoC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置未见/注解即可,完全不用考虑对象是如何被创建出来的。
将Bean添加到IoC容器中的注解
- @Controller:标注在控制类上,对应Spring MVC控制层,主要接受用户请求并调用Service层返回数据给前端页面。
- @Service:标注在业务类上,对应服务层,主要针对逻辑处理的操作。
- @Repository:标注在数据访问类上,对应持久层(Dao层),进行数据访问。一般和Mybatis整合使用,一般会使用@Mapper注解。
- @component:通用的注解,如果一个Bean不属于上面的三个层,就可以使用@component注解
- @RestController:该注解是@Contoller的衍生注解,@RestController = @Controller + @ResponseBody,标有该注解的类将注入IoC容器中,并且标有该注解的类的所有方法的返回值类型是实体对象/集合,将会转换为JSON格式响应。
- @Bean:该注解通常是标注在方法上面,能见该方法的返回的对象添加到IoC容器中,一般在引用第三方库中的类需要装配到Spring容器时,则只能通过@Bean来实现。
- @Configuration:这个注解表示这个类是配置类,表明一个类中声明一个和多个 @Bean 标记的方法,这个类的底层就是用到了@Component注解。
注:声明Bean的四大注解想要生效,必须被@ComponentScan扫描到才能够正常使用,启动类声明的注解@SpringBootApplication中已经包含该注解,默认扫描的是范围是启动类所在的包及其子包,@Controller, @Service, @Repository, @Component 四个注解标记的类都能够通过 @ComponentScan 扫描到,其中 @Controller,@Service,@Repository 的注解上都有 @Component。
@Component和@Bean的区别是什么?
- @Component注解作用于类,而@Bean作用于方法。
- @Component通常通过路径扫描来自动装配IoC容器中,@Bean注解通常是我们在标有该注解的方法中产生这个Bean,注入IoC容器。
依赖注入(DI)
依赖注入(Dependency Injection,简称DI)是IOC的一种实现方式。它是指通过外部配置或者其他方式,将一个对象所依赖的其他对象的引用传递给它,从而实现对象之间的解耦。
注入Bean的注解
- @Autowired
- @Resource
- @Inject
@Autowired与Resource的区别
- @Autowired是Spring框架提供的注解,而@Resource是JDK提供的注解。
- @Autowired默认是按照类型注入,而@Resource默认是按照名称注入。
- @Autowired支持在构造函数、方法、字段和参数上使用。@Resource主要用于字段和方法上的注入,不支持在构造函数或参数上使用。
如果存在多个相同类型的Bean,使用Autowired注解的时候会发生什么,如何解决?
- @Primary:在要注入的类上添加此注解,优先注入这个这个类的对象。
- @Qualifier:在@Autowired上加@Qualifier('Bean的名字'),按照名字来进行注入。