控制反转(IoC)和依赖注入(DI)

 控制反转(IoC)

IoC(Inversion of Controller:控制反转)的思想就是将原本在程序中手动创建对象的控制权交给Spring框架来管理,也就是说控制对象生命周期的不再是引用他的对象,而是容器,这就是控制反转。

使用控制反转的好处:将对象的之间的依赖关系交给IoC容器来管理,并由IoC容器染成对象的注入。这样在很大程度上能够简化应用的开发,把应用从复杂的依赖关系中解放出来。IoC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置未见/注解即可,完全不用考虑对象是如何被创建出来的。

将Bean添加到IoC容器中的注解

  1. @Controller:标注在控制类上,对应Spring MVC控制层,主要接受用户请求并调用Service层返回数据给前端页面。
  2. @Service:标注在业务类上,对应服务层,主要针对逻辑处理的操作。
  3. @Repository:标注在数据访问类上,对应持久层(Dao层),进行数据访问。一般和Mybatis整合使用,一般会使用@Mapper注解。
  4. @component:通用的注解,如果一个Bean不属于上面的三个层,就可以使用@component注解
  5. @RestController:该注解是@Contoller的衍生注解,@RestController = @Controller + @ResponseBody,标有该注解的类将注入IoC容器中,并且标有该注解的类的所有方法的返回值类型是实体对象/集合,将会转换为JSON格式响应。
  6. @Bean:该注解通常是标注在方法上面,能见该方法的返回的对象添加到IoC容器中,一般在引用第三方库中的类需要装配到Spring容器时,则只能通过@Bean来实现。
  7. @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的注解

  1. @Autowired
  2. @Resource
  3. @Inject

@Autowired与Resource的区别

  1. @Autowired是Spring框架提供的注解,而@Resource是JDK提供的注解。
  2. @Autowired默认是按照类型注入,而@Resource默认是按照名称注入。
  3. @Autowired支持在构造函数、方法、字段和参数上使用。@Resource主要用于字段和方法上的注入,不支持在构造函数或参数上使用。

如果存在多个相同类型的Bean,使用Autowired注解的时候会发生什么,如何解决?

  1. @Primary:在要注入的类上添加此注解,优先注入这个这个类的对象。
  2. @Qualifier:在@Autowired上加@Qualifier('Bean的名字'),按照名字来进行注入。

控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI)是两个相关的概念,用于解耦和管理对象之间的依赖关系。 控制反转IoC)是一种设计原则,它将对象的创建和管理权从应用程序代码中转移到容器中。传统的程序设计中,对象之间的依赖关系由对象自己创建和管理,而在IoC中,容器负责创建和管理对象,并将它们注入到需要它们的地方。 依赖注入DI)是实现IoC的一种方式。它通过将依赖关系作为参数传递给对象,或者通过使用容器来自动注入依赖关系,来实现对象之间的解耦。依赖注入可以通过构造函数注入、属性注入或者接口注入等方式来实现。 下面是一个简单的示例来说明IoCDI的概念: 假设我们有一个UserService类,它依赖于一个UserRepository类来获取用户数据。在传统的程序设计中,UserService需要自己创建UserRepository对象并管理它的生命周期: ```java public class UserService { private UserRepository userRepository; public UserService() { userRepository = new UserRepository(); } public User getUserById(int id) { return userRepository.getUserById(id); } } ``` 而在使用IoCDI的方式下,我们可以将UserRepository的创建和管理交给容器来处理,UserService只需要声明它所依赖的UserRepository,并通过构造函数或者属性注入的方式接收它: ```java public class UserService { private UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public User getUserById(int id) { return userRepository.getUserById(id); } } ``` 在这个示例中,UserService不再负责创建UserRepository对象,而是通过构造函数接收一个UserRepository对象。这样,我们可以通过容器来创建UserService,并将一个UserRepository对象注入到它中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值