找回密码
 立即注册
查看: 58|回复: 0

IOC&DI,IOC容器或Spring容器

[复制链接]

73

主题

3

精华

77

金币

技术维护QQ:515138

积分
165
发表于 2025-11-14 09:23:51 | 显示全部楼层 |阅读模式
IOC&DI,IOC容器或Spring容器

  • 控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
    • 对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器。
  • 依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
    • 程序运行时需要某个资源,此时容器就为其提供这个资源。
    • 例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象。
  • bean对象:IOC容器中创建、管理的对象,称之为:bean对象。

注解

说明

位置

@Component

声明bean的基础注解

不属于以下三类时,用此注解
@Controller

@Component的衍生注解

标注在控制层类上
@Service

@Component的衍生注解

标注在业务层类上
@Repository

@Component的衍生注解

标注在数据访问层类上(由于与mybatis整合,用的少)

问题:使用前面学习的四个注解声明的bean,一定会生效吗?
答案:不一定。(原因:bean想要生效,还需要被组件扫描)
  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解 @ComponentScan 扫描。
  • 该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。
依赖注入,是指IOC容器要为应用程序去提供运行时所依赖的资源,而资源指的就是对象。
在入门程序案例中,我们使用了@Autowired这个注解,完成了依赖注入的操作,而这个Autowired翻译过来叫:自动装配。
@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)
入门程序举例:在EmpController运行的时候,就要到IOC容器当中去查找EmpService这个类型的对象,而我们的IOC容器中刚好有一个EmpService这个类型的对象,所以就找到了这个类型的对象完成注入操作。
注意事项
那如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?
在下面的例子中,我们准备了两个UserService的实现类,并且都交给了IOC容器管理。 代码如下:
image.png
此时,我们启动项目会发现,控制台报错了:
1.png

出现错误的原因呢,是因为在Spring的容器中,UserService这个类型的bean存在两个,框架不知道具体要注入哪个bean使用,所以就报错了。

如何解决上述问题呢?Spring提供了以下几种解决方案:
  • @Primary
  • @Qualifier
  • @Resource

方案一:使用@Primary注解
当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。
  1. @Primary
  2. @Service
  3. public class UserServiceImpl implements UserService {
  4. }
复制代码
方案二:使用@Qualifier注解
指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。 @Qualifier注解不能单独使用,必须配合@Autowired使用。
  1. @RestController
  2. public class UserController {
  3.     @Qualifier("userServiceImpl")
  4.     @Autowired
  5.     private UserService userService;
复制代码
方案三:使用@Resource注解
是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。
  1. @RestController
  2. public class UserController {
  3.         
  4.     @Resource(name = "userServiceImpl")
  5.     private UserService userService;
复制代码
@Autowird 与 @Resource的区别
  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入


综合项目:
JavaWeb(SpringBoot3+vue3)开发+教学管理系统项目实战

网站建设,公众号小程序开发,系统定制,软件App开发,技术维护【联系我们】手机/微信:17817817816 QQ:515138

QQ|Archiver|自丢网 ( 粤ICP备2024252464号-1 )

GMT+8, 2025-12-1 07:02

专注于网站建设,公众号小程序制作,商城小程序,系统定制,软件App开发

【联系我们】手机/微信:17817817816 QQ:515138

快速回复 返回顶部 返回列表