浅谈Spring IoC容器

news2024/11/13 22:03:54

目录

1.IoC容器

2.依赖注入

1.IoC容器

IOC: Inversion of Control,是一种设计思想。

在spring框架中,Spring 通过IoC容器进行管理所有Java对象的实例化和初始化,控制对象与对象之间的依赖关系。

IoC管理的对象称为Bean,它与使用关键字new创建的java对象没有区别。所以我们可以理解为,IoC就是帮助我们将java对象的创建、管理及对象和对象之间的维护权交由spring框架进行负责。

IOC容器中使用map集合(map<String,Object>类型)存放Bean对象。

下面是IoC容器创建Bean的过程:

简单来说就是通过注解或是xml文件的形式,定义Bean的相关信息(如id、name之类的) ,然后通过相关抽象工具类(BeanDefinitionReader)读取Bean的定义信息,存入IoC容器中,IoC容器通过BeanFactory和反射的机制,使用Bean的定义信息对Bean进行实例化,然后初始化对象,最终化为最终对象。

2.依赖注入

依赖注入:指在Spring创建对象的过程中,将对象依赖属性通过配置进行注入(类似于一个实体类Student中的属性包含另一个定义好的实体类Person,Person类就是注入到的Student中的类)。

依赖注入是对IoC的具体实现。

Spring中我们一般使用两个注解进行依赖注入:

  • 1、@Autowired
  • 2、@Resource

@Autowired注解:根据类型进行装配。主要有以下4种注入方式,其中,属性注入为最常用的注入方式:

    //属性注入
    @Autowired
    private UserDao userDao;

    //set注入
    private UserDao userDao;
    @Autowired
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    //构造注入1
    private UserDao userDao;
    @Autowired
    public UserServiceImpl(UserDao userDao){
        this.userDao = userDao;
}

    //构造注入2
    private UserDao userDao;
    public UserServiceImpl(@Autowired UserDao userDao){
        this.userDao = userDao;
    }

上述代码皆为在ServiceImpl类中注入Dao类代码。需要注意的是, 如果只有一个有参构造方法时,@Autowired注解可以省略。即上述构造注入1、2中@Autowired注解都可以省略。

如果一个类型下有两个实现类,@Autowired注解无法正常根据类型进行注入,此时我们需要使用@Qualifier注解指定Bean的名称。

@Resource注解:根据名称进行装配,未指定name时,使用属性名作为name并根据属性名称进行注入,当name找不到时,会自动根据类型进行装配。

    //无指定名称,根据类型注入
    @Resource
    private UserService userService;
    
    //根据属性名称注入
    @Resource
    private UserService myUserService;
    
    //根据指定名称注入
    @Resource(name = "myUserService")
    private UserService userService;

区别:@Resource注解是JDK拓展包中的注解,更具有通用性;@Auotwired是spring中的注解。@Resource只能使用在属性及set方法上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“华为杯”研究生数学建模竞赛2005年-【华为杯】A题:行车时间估计和最优路线选择(附获奖论文)

赛题描述 A: Highway Traveling time Estimate and Optimal Routing Ⅰ Highway traveling time estimate is crucial to travelers. Hence, detectors are mounted on some of the US highways. For instance, detectors are mounted on every two-way six-lane highways o…

MySQL 百万级数据,如何做分页查询?

随着业务的增长&#xff0c;数据库的数据也呈指数级增长&#xff0c;拿订单表为例&#xff0c;之前的订单表每天只有几千个&#xff0c;一个月下来不超过十万。而现在每天的订单大概就是2w&#xff0c;目前订单表的数据已经达到了700w。这带来了各种各样的问题&#xff0c;今天…

国产ETL工具/ETL 产品 (BeeDI ) 集团财务 双向同步 审核平台

项目需求核心 实时同步、双向同步、部分同步、日志解析同步、断点续传 项目需求概要 35分公司财务数据实时同步汇总中心平台 &#x1f51b; 中心平台财务数据实时同步分发35分公司 项目需求内容 35分公司数据中部分表数据同步到中心库对应表&#xff0c;10张表分公司表年数…

【MyBatis】mybatis缓存机制

1. 缓存基础知识:缓存: cache缓存的作用: 通过减少IO的方式, 来提高程序的执行效率mybatis缓存包括:一级缓存: 讲话查询的数据存储到SqlSession中二级缓存: 将查询的数据存储到SqlSessionFactory中或者集成第三方的缓存: 比如EhCache...mybatis缓存只针对DQL语句, 也就是说缓存…

【1145. 二叉树着色游戏】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中&#xff0c;给出二叉树的根节点 root&#xff0c;树上总共有 n 个节点&#xff0c;且 n 为奇数&#xff0c;其中每个节点上的值从 1 到 n 各不…

WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能

很多工程软件拥有自己定义的脚本语言&#xff0c;作为程序员用惯了具有高亮显示和智能提示功能的编辑器&#xff0c;所以针对特定的脚本自己开发一个编辑器。主要采用WPF、C#语言以及AvalonEdit控件。 文章目录AvlonEdit控件实现自定义高亮显示实现文本搜索实现文本替换自定义搜…

磁疗效果因“病”而异,坚持=胜利!

磁疗在我国具有悠久的历史早在春秋战国时期&#xff0c;就有神医扁鹊运用磁疗治病的记载。 北京军区总医院理疗科主任&#xff0c;中华生物磁学研究会秘书长周万松认为&#xff0c;关于磁场改善血液循环这一点是肯定的&#xff0c;磁场可以扩张血管、加速血流、改善血液循环。但…

【H5游戏】-整一个简单的解压小游戏【抽纸巾】

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;社会不相信庸俗&#xff0c;成功需要汗水和寂寞铸就。无数次的质疑或是嘲笑&#xff0c;这些都无所谓&#xff0c;记住自己是谁&#xff0c;自己想要什么就…

Django的信号机制解读

Django的信号 Django的信号机制不同于Linux的信号机制&#xff0c;Django 中的信号用于在框架执行操作时解耦。当某些动作发生的时候&#xff0c;系统会根据信号定义的函数执行相应的操作 Django的信号主要包含以下三个要素&#xff1a; 发送者&#xff08;sender&#xff0…

网络隔离后的文件传输怎么解决?深度解析4种主流方案

网络隔离对于很多企业来说并不陌生&#xff0c;出于数据安全的考虑&#xff0c;为了隔离有害的网络和可能的网络攻击&#xff0c;越来越多的企业在内部进行了网络隔离。隔离的形态和方式有多种&#xff0c;总体上主要以物理隔离和逻辑隔离为主。网络隔离可以一定程度上甚至彻底…

功能测试环境搭建

前言新年好呀大家&#xff0c;大家都复工了吗~小编已经在搬砖中了&#x1f636;在假期中小编学习了一点功能测试方面知识&#xff0c;打算写篇博客记录下来&#xff0c;希望这篇博客可以帮到需要的朋友。流程图一、测试计划测试计划需要在所有的测试工作之前进行&#xff0c;一…

HTTP协议(2)

1)当我们在浏览器上面输入一个搜狗搜索的网址之后&#xff0c;浏览器就会给搜狗的服务器发送了一个HTTP请求&#xff0c;这样咱们的搜狗的服务器就会返回一个HTTP响应&#xff1b; 2)当这个响应结果被浏览器解析之后&#xff0c;就展示成了我们目前所看到的页面内容&#xff0c…

20230203英语学习

What Is a Dog Anyway? 狗的争议性起源&#xff1a;到底怎么定义“狗” The geographer Jared Diamond has called domestication the worst mistake humans ever made. And yet, the first domestication — the turning of wolves into dogs — was an impressive feat.Hu…

java对象的比较

上一章中关于PriorityQueue的使用要注意&#xff1a; 1. PriorityQueue中放置的元素必须要能够比较大小&#xff0c;不能插入无法比较大小的对象&#xff0c;否则会抛出 ClassCastException异常 2. 不能插入null对象&#xff0c;否则会抛出NullPointerException 3. 没有容量限制…

C/C++ 内存泄漏检测

C/C 内存泄漏检测内存泄漏的两个问题使用宏定义覆盖 malloc 和 free 函数使用 hook 钩子最近学习了 C/C 内存泄漏检测的相关知识&#xff0c;写博客记录一下。 内存泄漏的两个问题 是否有内存泄漏&#xff1f;内存泄漏是在代码的哪一行&#xff1f; 检测内存泄漏主要从上面两…

数据库系统概念 | 第十三章:事务管理 | 事务特性(ACID)| 冲突可串行化

文章目录&#x1f4da;事务的概念&#x1f407;事务定义&#x1f407;事务界定&#x1f407;事务特性&#xff08;ACID&#xff09;&#x1f407;一个简单的事务模型&#x1f4da;存储器结构&#x1f4da;事务的原子性和持久性&#x1f407;几种常见的事务状态&#x1f407;事务…

MDA260-16-ASEMI整流模块MDA260-16

编辑-Z MDA260-16在MDA封装里采用的2个芯片&#xff0c;是一款单臂共阳极整流模块。MDA260-16的浪涌电流Ifsm为11000A&#xff0c;漏电流(Ir)为15mA&#xff0c;其工作时耐温度范围为-40~150摄氏度。MDA260-16采用GPP硅芯片材质&#xff0c;里面有2颗芯片组成。MDA260-16的电性…

转行大数据开发应该怎么学习

转行进入大数据&#xff0c;首先需要了解的就是大数据是做什么&#xff0c;工作内容&#xff0c;然后就是找个完整的学习路线跟着去学习了&#xff0c;大数据的学习内容也是不少的~ 简单来说&#xff0c;分为6步&#xff0c;大数据开发入门&#xff0c;大数据核心基础&#xf…

【iHooya】2023年2月2日寒假作业解析

#include <bits/stdc.h> using namespace std;int main() {int n, r; //n个人&#xff0c;r个水龙头cin >> n >> r;int time[n];for (int a 0; a < n; a){cin >> time[a];}sort(time, time n); //时间从小到大排序int minx 0, lt_time[10001], j…

程序全过程:觉醒(序)

程序全过程序很惭愧&#xff0c;写了几年的程序&#xff0c;技术的功力没有太大增长&#xff0c;只是在项目的熟悉程度上有不少进步。因为上学时没好好学&#xff0c;很多现在工作中用到的编程技能都是在工作中边学边用的&#xff0c;相当于一直处于临时抱佛脚的状态&#xff0…