day05 java_Spring IoC 和 DI

news2024/10/7 20:31:16

为什么使用spring框架

1.解耦代码(每次使用都要new一个对象)

2.解决事务繁琐问题(创建对象----初始化----调用方法===销毁对象)

3.使用第三方框架麻烦的问题

总结:spring是一个轻量级的Ioc,Di和AOP容器

轻量级:简洁,高效,低依赖

**容器:**创建对象并将对象存储对象,同时管理着对象 的生命周期

理解IOC,DI,和spring什么关系

IOC"控制反转",DI"注入" 一个思想,将创建对象的操作给spring来做

spring 是这个思想之一

使用ioc和di功能

根据需求编写类

<!--只有DateSource对象才会配置初始化方法和销毁方法-->
<bean id="唯一性" class="类的全限定名" [innit-method="方法名" destroy-methoe="方法名"] >
	<property name="属性名" value="属性值" |ref="容器中另外一个bean的id值"/>
    ......
</bean>
......

启动容器获取对象

​ 手动启动容器

​ 使用sprting测试启动容器

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(“/01_hello.xml”)//需要在名字前面加/,
public class SpringTest {

@Autowired //对Di做解释,注入属性
//Person   p1; 有多个对象的时候可以使用id的名字进行指定
Person person;
@Test//使用的spring中的test
public void test1(){
    person.dowork();
    System.out.println("执行spring单元测试");
}

Spring依赖版本

一般使用jdk8+5.x版本,不要随便更改spring的版本

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.8.RELEASE</version>
</dependency>

Ioc思想

“控制反转”,将手动创建对象和对象之间的关系的控制权交给spring容器来控制

Di思想

“依赖注入”,使用setter方法和调用构造函数实现依赖注入

避免了从对象中繁琐的找依赖关系

bean三种注入方式:

setter,构造器注入,注解注入

**构造器注入的弊端:**若里面的属性形成循环依赖,使用构造器注入就不能成功创建对象并注入

**解决方法:**给一个类创设置一个setter方法,只有先创建一个对象之后才能创建其他对象

创建spring的xml配置文件

1.添加pom.xml中的spring依赖

		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>

2.添加xml配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEdIaBzP-1684998216200)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230506114231381.png)]

<bean id="person" class="cn.wolfcode.Person"><!--Ioc创建对象并存储对象-->
    <property name="name" value="灰灰"/><!--Di,使用setter方法和调用构造函数实现注入-->
</bean>

id:作为bean的名字

class:用于反射得到bean的实例

innit-method:初始化方法

destory-method:销毁方法

bean的作用域scope

在xml文件中进行配置

<bean id="" class="" scope="作用域"/>

单例:默认的是单例singleton:new的都是同一个对象,一般就是不写的

多例:设置scope为prototype,每次new的对象不相同

bean的初始化和销毁

spring在使用bean的时候立即自动初始化这个对象

spring可以在使用了bean之后自动使用close()方法将对象进行销毁

单例和多例在spring中销毁的区别:

单例:容器关闭的时候spring会自动进行销毁,因为单例存在spring容器中,容器就可以有权进行销毁

多例:容器关闭的时候不会被自动销毁,因为多例不在spring容器的管辖范围内,多例是被jvm的GC回收器进行处理,

bean:被容器管理的对象

在初始化容器的时候就已经将对象创建好了

在这里插入图片描述

从容器中获取bean方式

方式1使用Application获取bean

当多个对象由同一个实体类进行创建的时候,需要使用名字+类型进行获取bean

@Test
    public void test3(){
    ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("01_hello.xml");
    //当有多个使用Person实体类创建对象时,使用按照名字和类型进行查找到具体的对象
    Person person = ca.getBean("p1",Person.class);
    System.out.println(person);
}

方式2,使用BeanFactory从容器获取对象

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = (MyBean) context.getBean("myBean"); // 通过名称获取
MyBean anotherBean = context.getBean("aliasOfMyBean", MyBean.class); // 通过别名获取

spring单元测试

执行顺序:jvm->junit->spring容器–>spring单元测试

spring中的单元测试会依赖于junit包

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>5.0.8.RELEASE</version>
	<scope>test</scope>
</dependency>

做测试需要贴的注解,启动容器

若不贴注解里面的值就是空的,会造成空指针异常

**作用:**减少了以前的做测试类的获取bean对象

启动容器:@RunWith(SpringJUnit4ClassRunner.class)

加载指定的配置文件:@ContextConfiguration(“xml配置文件”)

获取容器对象:@Autowired

测试方法:@Test

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/01_hello.xml")//需要在名字前面加/,
public class SpringTest {

    @Autowired //对Di做解释,注入属性
    //Person   p1; 有多个对象的时候可以使用id的名字进行指定
    Person person;
    @Test//使用的spring中的test
    public void test1(){
        person.dowork();
        System.out.println("执行spring单元测试");
    }

Di的注入

常量注入xml配置

可以使用的常量有:八大是基本类型,包装类,String,BigDecimal

使用里面的value属性进行常量注入

<property name="对象属性名称"  value="需要注入的值"/>
<bean id="employee" class="cn.wolfcode.Employee">
    <!--类型要和实体类中一一对应,底层可以对类型做转换-->
    <property name="name" value="灰灰"/>
    <property name="age" value="23"/>
    <property name="salary" value="3200"/>
</bean>

注入bean,使用的频率很高

给对象注入的值时另一个对象,使用ref属性

<property name="对象属性名称" ref="容器另外一个 bean 的 id 值"/>

示例代码,dao层和service层

<!--使用实现类来创建对象,dao层-->
<bean id="EmployeeDAO" class="cn.wolfcode.EmployeeDAO"/>

<!--使用实现类进行创建对象,service层,service层需要使用dao层的对象,就需要使用bean注入-->
<bean id="employeeService" class="cn.wolfcode.EmployeeService">
    <!--
	name:使用反射到service层去找这个属性名,属性的类型要和ref所对应的属性相同
	ref:容器中另一个bean的id值
	-->
<property name="EmployeeDAO" ref="EmployeeDAO"/>
</bean>

使用contex标签添加配置数据库的配置文件,此时需要添加该标签的依赖

 xmlns:context="http://www.springframework.org/schema/context"
 <context:property-placeholder location="/db.properties"/>

spring使用${}进行引用,配置文件中的key的名字需要不同

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <!--使用不同的用户名进行读取,保证不读到最大的那个用户名-->
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

总结

1.以后所有创建对象的操作全部交给spring的xml文件来做

2.使用bean注入的时候使用时property标签中的ref属性

3.spring创建对象的时候使用的实现类进行创建

4.创建对象的时候需要在类里面设置setter方法,spring才能使用反射进行属性的获取,并给这个对象赋值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbDLKqAF-1684998216203)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230506205513912.png)]

5.连接数据库的时候需要添加配置文件,给配置文件中的key设置名字,防止spring读取的时候读到最大的权限


### 总结



**1.以后所有创建对象的操作全部交给spring的xml文件来做**

**2.使用bean注入的时候使用时property标签中的ref属性**

**3.spring创建对象的时候使用的实现类进行创建**

**4.创建对象的时候需要在类里面设置setter方法,spring才能使用反射进行属性的获取,并给这个对象赋值**


5.连接数据库的时候需要添加配置文件,给配置文件中的key设置名字,防止spring读取的时候读到最大的权限

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

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

相关文章

高矿化度矿井水深度除氟装置CH-87技术解析

高矿化度矿井水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

性能测试计划不会写?我告诉你有模板你看不看

目录 1 简介 2 测试进入条件 3 测试退出条件 4 性能测试需求 5 测试风险 6 测试时机 7 测试策略 8 测试资源 9 测试进度 10 交付物 1 简介 1.1 目的 【描述性能测试计划的目的。】 1.2 背景 【描述项目或产品的背景。】 1.3范围 【描述性能测试的整体范围。】 2 测试进入条件 【…

Java如何配置环境变量

Java如何配置环境变量 0. 前言1. 下载Java2. 配置环境变量2.1新建 Java_Home2.2 编辑Path情况1情况2 3. 验证安装 0. 前言 本节记录如何配置Java环境变量&#xff0c;用自己重装过的系统实操 操作系统&#xff1a;Windows10 专业版 Java版本&#xff1a;jdk1.7.0_07 1. 下载…

全网最详细,Selenium自动化测试问题总结+解决,跟着大佬上高速...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Selenium4自动化测…

性能测试工程师必看——性能测试报告模板

目录 1. 测试概述 1.1 测试目标 1.2 指标和术语 2. 环境、工具 2.1 测试环境 2.2 测试工具 3. 测试方案 3.1 测试类型 3.2 业务模型 3.3 加密验签处理 3.4 压力梯度 4. 测试结果 4.1 聚合报告 4.2 系统吞吐量 4.3 资源占用率 5. 分析和建议 5.1 测试结论分析 …

Sqoop伪分布式配置

目录 一、Sqoop下载 二、解压 三、添加环境变量 四、复制sqoop-env-template.sh文件 五、编辑组件路径 六、拷贝Mysql与Hive驱动文件 七、验证 一、Sqoop下载 安装包下载地址&#xff1a;Sqoop 官网 二、解压 解压和重命名文件 tar -zxvf sqoop-1.4.7.bin__hadoop-2.…

006 - STM32学习笔记 - RCC时钟树

006 - STM32学习笔记 - RCC时钟树 本节内容一定要结合RCC时钟树和官方手册学习&#xff0c;如果看不明白的话&#xff0c;建议看一下野火官方的教程&#xff0c;火哥讲这节讲的很详细&#xff0c;看一遍基本就能理解了。 上节内容中分析了启动代码&#xff0c;在启动代码中看…

Redis - Redis16个常见使用场景

1、缓存 String类型 例如&#xff1a;热点数据缓存&#xff08;例如报表、明星出轨&#xff09;&#xff0c;对象缓存、全页缓存、可以提升热点数据的访问数据 作为Key-Value形态的内存数据库&#xff0c;Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数…

【面试题】操作系统面试实战

version&#xff1a;1.0 文章目录 操作系统进程管理&#x1f64e;‍♂️面试官&#xff1a;进程和线程的区别&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;进程有哪几种状态?&#x1f64e;‍♂️面试官&#xff1a;进程间的通信方式&#xff1f;&#x1f64e;‍♂️面试…

体验使用 InsCode AI 创作助手 来帮我完成一篇博客

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 InsCode AI 创作助手 它来啦回答不满意可以要求重新生成在输入 prompt 时&#…

Selenium2023最全攻略(元素操作,浏览器操作等)附完整代码!

一、元素操作方法 方法&#xff1a; 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法 注意&#xff1a;在输入方法之前一定要清空操作!! # 导包 from time import sleep from selenium import webdriver # 实例化浏览器 driver webdriver.Chrome(…

XDP入门--之eBPF sample内核示例代码的编译

Linux内核代码提供了很多eBPF的示例代码(以linux6.1版本内核代码为例)&#xff0c;我们可以在/Linux/samples/bpf目录下找到示例代码。 1、查看Linux内核版本 本文不讨论交叉编译的情况&#xff0c;因为eBPF还在快速发展中&#xff0c;不同版本的Linux内核的支持情况不太一至…

网络安全就业有什么要求?一般人还真不行

前言 网络安全工程师又叫信息安全工程师。随着互联网发展和 IT 技术的普及&#xff0c;网络和 IT 已经日渐深入到日常生活和工作当中&#xff0c;社会信息化和信息网络化&#xff0c;突破了应用信息在时间和空间上的障碍&#xff0c;使信息的价值不断提高。但是与此同时&#…

接口自动化框架(Pytest+request+Allure)

前言&#xff1a; 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 接口自动化包含2个部分&#xff0c;功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

程序员职业病之中医颈椎痛缓解办法

✨求关注~ &#x1f600;博客&#xff1a;www.protaos.com 治疗颈椎病的穴位按摩是一种传统中医疗法&#xff0c;可以缓解颈椎病引起的疼痛和不适。下面是关于五个常用穴位的介绍、取穴定位、按摩方法和功效主治的总结&#xff1a; 人体穴位图 穴位图 1. 揉捏风池穴&#xf…

Linux 备份要点

文章目录 Linux 备份要点确定备份的目录和文件备份的种类、频率与工具的选择完整备份增量备份差异备份镜像备份 定期备份远程备份的脚本使用rsync上传备份数据 Linux 备份要点 在Linux系统中&#xff0c;备份数据是非常重要的&#xff0c;特别是在生产环境中。以下是Linux备份…

【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法

&#x1f4af; 博客内容&#xff1a;【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&…

Hadoop HA(高可用)搭建

ZooKeeper配置 解压安装 添加ZK环境变量 分发文件 启动 安装配置 Hadoop 解压安装 修改hadoop-env.sh文件 修改Hadoop配置文件core-site.xml HDFS 配置文件hdfs-site.xml MapReduce 配置文件 mapred-site.xml YARN 配置文件yarn-site.xml 配置worekers 分发配…

Nginx配置文件

四.Nginx配置 1.位置 /usr/local/nginx/conf/nginx.conf2.内容 Nginx的主配置文件是nginx.conf&#xff0c;这个配置文件一共由三部分组成&#xff0c;分别为全局块、events块和http块。在http块中&#xff0c;又包含http全局块、多个server块。每个server块中&#xff0c;可…

基于3.0.0-cdh6.3.2版本编译Flink1.14.4

一、背景 异常描述 CDH-6.3.2环境下使用Flink-1.14.4的FlinkSQL的hive方言时出现如下异常 java.lang.Runtimelxception: java,lang.IllegalArgumentException: Unrecoonized Hadoop major version number: 3.0.0-cdh6.2.1 问题说明 开源社区hive 2.x的版本这种情况下是不支…