spring框架学习记录(1)

前半个月一直在应付期中考试,快被折磨似了orz

文章目录

  • Spring
    • IoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入
    • bean相关
      • bean配置
      • bean实例化
      • bean的生命周期
    • 依赖注入相关
      • 依赖注入方式
      • 依赖自动装配
    • 容器
      • 创建容器
      • 获取bean

Spring

IoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入

  • IoC(Inversion of Control) 控制反转

    • 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转(降低程序的耦合度
  • Spring技术对IoC思想进行了实现

    • Spring提供了一个容器,称为IoC容器,用来充当思想中的“外部

    • IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中被称为Bean

  • DI(Dependency Injection) 依赖注入

    • 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

在这里插入图片描述

以上操作的目标:充分解耦

bean相关

bean配置

  • bean基础配置

    • id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一

    • class:bean的类型,即配置的bean的全路径类名

    • 例子

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
  • bean的别名
    • name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔
    • 例子
<bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>
  • bean的作用范围
    • scope:为bean设置作用范围,可选值为单例singleton,非单例prototype,若不写scope,则默认是单例对象
    • 例子
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>

bean实例化

使用FactoryBean的方式实例化bean对象

  • 实现FactoryBean接口,指定创建的泛型对象
//FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    public Class<?> getObjectType() {
        return UserDao.class;
    }

    // 控制创建的bean是单例的还是非单例的,通常都是单例的
    public boolean isSingleton() {
        return true;
    }
}
  • 配置
<!--方式四:使用FactoryBean实例化bean-->
    <!--注意,这种构造方法创建的不是FactoryBean对象,而是FactoryBean对象中的getObject对象-->
    <bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>

bean的生命周期

  • 初始化容器

    • 1.创建对象(内存分配)
    • 2.执行构造方法
    • 3.执行属性注入(set操作)
    • 4.执行bean初始化方法
  • 使用bean

    • 执行业务操作
  • 关闭/销毁容器

    • 执行bean销毁方法
  • bean的销毁时机

    • 容器关闭前触发bean的销毁

    • 关闭容器方式:

      • 手动关闭容器
      ConfigurableApplicationContext接口close()操作
      
      • 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
      ConfigurableApplicationContext接口registerShutdownHook()操作
      
public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        //注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        //ctx.registerShutdownHook();
        //关闭容器
        ctx.close();
    }
}

依赖注入相关

依赖注入方式

  • 向一个类中传递数据的方式有几种?

    • 普通方法(set方法)
    • 构造方法
  • 依赖注入描述了在容器中建立bean和bean之间依赖关系的过程,如果bean运行需要的是数字或字符串呢?

    • 引用类型
    • 简单类型(基本数据类型与String)
  • 依赖注入方式

    • setter注入

      • 简单类型

        • 在bean中定义引用类型属性并提供可访问的set方法
        public class BookDaoImpl implements BookDao {
        
            private String databaseName; // 数据库名称
            private int connectionNum; // 数据库连接数量
            
            //setter注入需要提供要注入对象的set方法
            public void setConnectionNum(int connectionNum) {
                this.connectionNum = connectionNum;
            }
            //setter注入需要提供要注入对象的set方法
            public void setDatabaseName(String databaseName) {
                this.databaseName = databaseName;
            }
        }
        
        • 配置中使用property标签value属性注入简单类型数据
        <!--注入简单类型-->
            <!--对bookDao进行配置-->
            <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
                <!--property标签:设置注入属性-->
                <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
                <!--value属性:设置注入简单类型数据值-->
                <property name="connectionNum" value="100"/>
                <property name="databaseName" value="mysql"/>
            </bean>
        
      • 引用类型

        • 在bean中定义引用类型属性并提供可访问的set方法
        public class BookServiceImpl implements BookService{
            private BookDao bookDao;
            private UserDao userDao;
            
            //setter注入需要提供要注入对象的set方法
            public void setUserDao(UserDao userDao) {
                this.userDao = userDao;
            }
            //setter注入需要提供要注入对象的set方法
            public void setBookDao(BookDao bookDao) {
                this.bookDao = bookDao;
            }
        }
        
        • 配置中使用property标签ref属性注入引用类型对象
        <!--注入引用类型-->
            <!--对bookService进行配置-->
            <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
                <!--property标签:设置注入属性-->
                <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
                <!--ref属性:设置注入引用类型bean的id或name-->
                <property name="bookDao" ref="bookDao"/>
                <property name="userDao" ref="userDao"/>
            </bean>
        
    • 构造器注入

      • 简单类型
      • 引用类型

依赖自动装配

  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

  • 自动装配方式

    • 按类型(常用)
    • 按名称
    • 按构造方法
  • 配置中使用bean标签autowire属性设置自动装配的类型

<!--id在自动装配时可以省略不写-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <!--autowire属性:开启自动装配,通常使用按类型装配-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

一些细节需要注意

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时**(byType)**必须保障容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时**(byName)**必须保障容器中具有指定名称的bean,因为变量名与配置耦合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

容器

创建容器

  • 类路径加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  • 文件路径加载配置文件
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\Code\\java\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml");
  • 加载多个配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

获取bean

  • 使用bean名称获取
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
  • 使用bean名称获取并指定类型
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
  • 使用bean类型获取(容器中这个类型的bean只能有一个)
BookDao bookDao = ctx.getBean(BookDao.class);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程——Linux下常见的进程状态

前言&#xff1a;在进程学习这一块&#xff0c;我们主要学习的就是PCB这个进程控制块&#xff0c;而PBC就是用来描述进程的结构体&#xff0c;而进程状态就是PCB结构体中的一个变量。 本篇主要内容&#xff1a; 操作系统中的进程状态Linux下的进程状态 在开始之前&#xff0c;我…

Redis学习笔记(基础)

Redis学习笔记&#xff08;基础&#xff09; 一、Nosql概述1.1、为什么使用Nosql1.2、什么是Nosql1.3、阿里巴巴演进分析1.4、NoSQL的四大分类 二、 Redis入门2.1、概述2.2、Windows使用Redis2.3、linux安装2.4、redis-benchmark性能测试2.5、Redis基础知识 三、五大数据类型3.…

Linux专栏08:Linux基本指令之压缩解压缩指令

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux基本指令之压缩解压缩指令 编号&#xff1a;08 文章目录 Linu…

初始Java篇(JavaSE基础语法)(7)抽象类和接口(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 目录 抽象类 抽象类的概念&#xff1a; 抽象类语法 抽象类特性 抽象类的作用 接口 接口的概念&#xff1a; 语法规则 接口…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

Atlassian Jira 信息泄露漏洞(CVE-2019-3403) 排查思路

Atlassian Jira&#xff1a; 企业广泛使用的项目与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 简述&#xff1a; 近日发现多个内网IP触发的Atlassian Jira 信息泄露漏洞的告警。 告警的检测规…

C语言:内存操作函数memcpy、memmove、memset和memcpy的使用和模拟实现

一&#xff1a;memcpy的使用和模拟 memcpy使用时需要包含的头文件为#include<string.h> void* memcpy(void* destination,const void* source,size_t num) 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置&#xff08;特别注意的是…

Python | Leetcode Python题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

「C++ 内存管理篇 04」动态二维数组

目录 一. 使用calloc/free开辟和释放二维数组 二、 使用new/delete开辟和释放二维数组 一. 使用calloc/free开辟和释放二维数组 让一个二级指针变量存放动态开辟的一级指针数组的起始地址&#xff0c;然后让这些一级指针指向动态开辟的基本类型的数组&#xff1a; // 开辟一个大…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数浅拷贝深拷贝构造函数实现 析构函数赋值重载 迭代器begin & endrbegin & rend 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 总结 前言 模拟实现不是为了写得和库里面一样好。而是为了更好的了解底层…

一行代码将文件存储到本地或各种存储平台

一行代码将文件存储到本地或各种存储平台 这里我们介绍的是一个开源项目。 这个是他的官网 简介 (xuyanwu.cn) 下面来看他的一个介绍&#xff1a; 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS…

R语言学习—1—将数据框中某一列数据改成行名

将数据框中某一列数据改成行名 代码 结果

【大语言模型LLM】-基于大语言模型搭建客服助手(2)

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

408数据结构-树的基本概念与性质 自学知识点整理

树的定义 树是 n n n&#xff08; n ≥ 0 n≥0 n≥0&#xff09;个结点的有限集。当 n 0 n0 n0时&#xff0c;称为空树。 任意一棵非空树应具有以下特性&#xff1a; 有且仅有一个特定的被称为根的结点&#xff08;根结点&#xff09;。当 n &#xff1e; 1 n&#xff1e;1 …

【C语言】/*数据类型和变量*/

目录 前言 一、数据类型的介绍 二、内置数据类型的介绍 2.1 字符型 2.2 整型 2.3 浮点型 2.4 布尔类型 三、数据类型长度的计算 3.1 sizeof 操作符 3.2 数据类型的长度(VS2022) 3.3 sizeof中表达式不计算 四、signed 和 unsigned 五、数据类型的取值范围 六、变…

.360勒索病毒的威胁:如何恢复您的数据?

引言&#xff1a; 近年来&#xff0c;网络安全威胁层出不穷&#xff0c;其中.360勒索病毒以其独特的攻击方式和广泛的传播能力&#xff0c;成为了众多企业和个人面临的重大挑战。本文将对.360勒索病毒进行深入剖析&#xff0c;并探讨应对此类病毒的有效策略&#xff0c;以帮助…

UE5入门学习笔记(六)——编译低版本插件

对于有些低版本的插件&#xff0c;可以通过此方法自己编译到高版本而无需等待插件作者更新 使用工具&#xff1a;如图所示 步骤1&#xff1a;打开cmd&#xff0c;并使用cd命令切换到此目录 步骤2&#xff1a;输入如下指令 RunUAT.bat BuildPlugin -Plugin“路径1” -Package“…

Java中的进程和线程

进程定义 进程是正在运行的程序&#xff0c;是系统进行资源分配和调用的独立单位&#xff0c;每一个进程都有它自己的内存空间和系统资源 线程的定义 线程是进程中单个顺序控制流&#xff0c;是一种执行路径 单线程&#xff1a; 一个进程如果只有一条路径则被称为单线程 多…

python学习笔记----面向对象(十)

一、什么是类 类是一个抽象的模板&#xff0c;用于创建具体的实例。可以将类理解为一个蓝图&#xff0c;它定义了一系列对象共有的属性&#xff08;数据&#xff09;和方法&#xff08;函数&#xff09;。类是对一组具有相同属性和功能的对象的抽象。例如&#xff0c;你可以定…

数据结构——循环结构:for循环

今天是星期五&#xff0c;明天休息&#xff0c;后天补课&#xff0c;然后就是运动会&#xff0c;接着是放假。&#xff08;但这些都和我没关系啊&#xff0c;哭死&#xff01;&#xff09;今天脑袋难得清醒一会儿&#xff0c;主要是醒的比较早吧&#xff0c;早起学了一会&#…