day05 java_Spring IoC 和 DI

2023-11-17

为什么使用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读取的时候读到最大的权限

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

day05 java_Spring IoC 和 DI 的相关文章

  • Java - 红、绿、蓝获取RGB

    通过致电getRGB int x int y with a BufferedImage对象 得到一个负数 如何将三个不同的值 红色 绿色和蓝色 转换为这个单个负数 使用颜色类 new Color r g b getRGB
  • 在此代码中,Runnable 未实例化。为什么?

    Runnable cannot instantiate public class Thread4 public static void main String args Thread t1 new Thread new Runnable R
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 为什么 @RunWith(SpringJUnit4ClassRunner.class) 不起作用?

    我正在尝试使用 Spring 框架使用 JUnit 测试 CRUD 方法 下面的代码完美运行 Transactional public class TestJdbcDaoImpl SuppressWarnings deprecation B
  • 为什么这个动作不抽象? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我很难理解为什么一个类中的一个操作是抽象的 而另一个类中的操作不是 源代码1 编译时出错 https gyazo com cd3c
  • javax.persistence.TransactionRequiredException:没有可用于当前线程的实际事务的 EntityManager

    我使用 Hibernate 创建了我的第一个 Spring MVC 项目 我的 DAO 层使用 JPA EntityManager 与数据库交互 GenericDao java Repository public abstract clas
  • Java时间转正常格式

    我有 Java 时间1380822000000 我想转换为我可以阅读的内容 import java util Date object Ws1 val a new Date 1380822000000 toString 导致异常 warnin
  • 外部实体更改后索引不更新

    我目前正在开发一个项目 使用 JPA 2 1 保存数据并使用 hibernate search 4 5 0 final 搜索实体 映射类和索引后 搜索工作正常 但是 当我更改值时描述B 类从 someStr 到 anotherStr 数据库
  • 为本地@ExceptionHandler编写JUnit测试

    我有以下控制器 class Controller ResponseStatus HttpStatus OK RequestMapping value verifyCert method RequestMethod GET public vo
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • 如何构建和使用 TimeSeriesCollections

    我想在图表的 X 轴上显示一些日期 并且here https stackoverflow com questions 5118684 jfreechart histogram with dates据说我必须使用 TimeSeriesColl
  • 单元测试、集成测试还是设计中的问题?

    我编写了我的第一个单元测试 我认为它过于依赖其他模块 我不确定是否是因为 这是一个复杂的测试 我实际上已经编写了集成测试或 我的设计有问题 我首先要说的是 虽然我有大约 4 年的开发经验 但我从未学过 也没有人教过自动化测试 我刚刚使用 H
  • Java8 项目上的 SonarQube 给出 jacoco-Exception

    我刚刚下载了最新版本 SonarQube 4 3 然后尝试使用以下命令构建 java 8 项目 mvn clean install mvn sonar sonar 这给了我下面的例外 谷歌搜索 我的印象是这是一个早期的问题 应该已经解决 h
  • 如何在 Java 中创建一个带有连字符的值的静态枚举?

    如何创建如下所示的静态枚举 static enum Test employee id employeeCode 截至目前 我遇到了错误 这对于 Java 来说是不可能的 因为每个项目都必须是有效的标识符 并且有效的 Java 标识符可能不包
  • 使用 Commons 或 Guava 将文本文件转换为 Java Set

    我想将文件中的每一行加载到 HashSet 集合中 有没有一种简单的方法可以做到这一点 怎么样 Sets newHashSet Files readLines file charSet 使用番石榴 参考 文件 readLines http
  • Javac 版本 1.7 无法为目标 1.7 构建

    我试图在 Linux Mint 系统上使用 Sun Java JDK 1 7 0 17 编译 Java 代码 但遇到了这个问题 javac version target 1 7 javac 1 7 0 17 javac invalid ta
  • Spring Redis删除不删除key

    我正在尝试删除一个 Redis 键 但由于某种原因它没有删除 但也没有抛出异常 这是我要删除的代码 import com example service CustomerService import com example model Cu
  • 如何在apache POI中读取excel文件的准确单元格内容

    当我读取单元格的内容时 例如如果它是日期格式 它会转换为另一个值 例如 12 31 2099 gt 46052 和 50 00 gt 50 和 50 00 gt 0 5 但我想要的是获取每个单元格的确切字符串值 我的代码是这样的 cell

随机推荐

  • 用python将结果存进csv文件中

    def writeCsv File species row File species out open data test csv a newline csv writer csv writer out dialect excel csv
  • 代码走查和代码审查_这是经过1000多次代码审查后我学到的东西

    代码走查和代码审查 这个故事最初发表在我的博客上 如果您对这种内容感兴趣 请随时签出并订阅 在过去的三年中 我已经审查了1000多个请求 合并 请求 在那段时间里 我学到了很多东西 主要是关于如何不审阅代码 如何减轻过程的痛苦 使高质量的代
  • python字典中的值只能是字符串类型_python字典key不能是可以是啥类型

    python中字典的key不能是可变类型 字典可存储任意类型对象 其中值可以取任何数据类型 但键必须是不可变的 如字符串 数字或元组 语法格式 d key1 value1 key2 value2 字典是另一种可变容器模型 且可存储任意类型对
  • 神经搜索有多能?

    原文 Alex C G 译文 Piper Hu 本文阅读时长约为5分钟 神经搜索 是数据处理上非常新颖的一个话题 也是Jina AI目前着重关注的方向 可是到底神经搜索是什么 它能解决什么问题 与现在开发者们使用的搜索系统搭建又有什么不一样
  • javaScript节流与防抖

    一 节流 throttle 用来实现阻止在短时间内重复多次触发同一个函数 主要用途 防止使用脚本循环触发网络请求的函数的恶意行为 确保请求的真实性 当然也包括其他阻止高频触发行为的应用 实现原理图 代码实现 1 节流函数 2 functio
  • python中xpath解析网页html文档

    1 首先安装xpath解析工具第三方库 pip install i https pypi tuna tsinghua edu cn simple lxml 2 选取节点 选取未知节点 选取若干路径 举例说明 谓语用来查找某个特定的节点或者包
  • 三子棋(人机对战)

    目录 整体思路 头文件如下 为什么要使用头文件呢 头文件的使用 游戏主函数如下 功能实现如下 注意 整体思路 1 创建一个二维数组 2 初始化二维数组 3 打印棋盘 4 玩家下棋且打印棋盘 5 电脑下棋且打印棋盘 6 判断输赢 头文件如下
  • 智能合约概述——以太坊虚拟机

    以太坊虚拟机 概述 以太坊虚拟机 EVM 是智能合约的运行环境 它不仅是沙盒封装的 而且是完全隔离的 也就是说在 EVM 中运行代码是无法访问网络 文件系统和其他进程的 甚至智能合约之间的访问也是受限的 账户 以太坊中有两类账户 它们共用同
  • springmvc 项目本地开发正常,war 上了 wins下的tomcat,web 页面中文乱码

    前言 今天打包 springmvc 项目 war 包 windows 下 tomcat 运行 浏览器访问乱码 解决方案 tomcat bin 目录下 catalina bat 文件中添加 set JAVA OPTS Dfile encodi
  • 区块链之元宇宙

    区块链之元宇宙 元宇宙概念 元宇宙 Metaverse 是利用科技手段进行链接与创造的 与现实世界映射和交互的虚拟世界 具备新型社会体系的数字生活空间 元宇宙本质上是对现实世界的虚拟化 数字化过程 需要对内容生产 经济系统 用户体验以及实体
  • 智能教育装备法则

    二十一世纪 在互联网 大数据 智慧教育等新科技的带动下 我国教育信息化教育信息化产业规模将以每年平15 的速度增长 格物斯坦表示 有越来越多智能教育装备的后起之秀企业开启了他们的研发软件和硬件的能力 教育的信息化首先是教育装备的信息化和智慧
  • 浅析瀑布流布局及其原理

    一 什么是瀑布流 瀑布流 又被称作为瀑布流式布局 是一种比较流行的网站页面布局方式 视觉表现为参差不齐的多栏布局 随着页面滚动条向下滚动 这种布局还会不断加载数据块并附加至当前尾部 这种布局方式常见于一些图片为主的网站 为什么要使用瀑布流
  • 关于QT5.12.0在VS2019上使用的细节

    关于QT5 12 0在VS2019上的使用细节 博主使用的版本 QT5 12 0 VS2019 其他Qt版本同样适用 1 添加Qt的环境变量 在Win10下 编辑系统环境变量 环境变量 Path 新建添加Qt的bin目录路径 D QT 12
  • Burpsuite Professional 2023.6.2 最新版安装教程

    更新时间 2023年07月23日11 47 48 本文以mac为例 Windows上方法是类似的 1 缘由 因为我用的Burpsuite版本有点老 导致有时候给人培训的时候 面对新版Burpsuite一脸懵逼 很多操作都不太一样 所以这次直
  • 从零开始 verilog 以太网交换机(七)总结与展望

    从零开始 verilog 以太网交换机 七 总结与展望 声明 博主主页 王 嘻嘻的CSDN主页 从零开始 verilog 以太网交换机系列专栏 点击这里 未经作者允许 禁止转载 侵权必删 关注本专题的朋友们可以收获一个经典交换机设计的全流程
  • Trinitycore学习之在vscode查看远端服务器上源码配置

    1 安装vscode 去官网下载 这里下载windows版本安装包 zip https code visualstudio com Download 2 安装后 安装扩展chinese 使用中文设置 需要重启vscode 3 安装ssh相关
  • 报错:‘wget‘ 不是内部或外部命令,也不是可运行的程序

    在jupyter lab下使用wegt 导入需要用到的数据集 wget https tianchi media oss cn beijing aliyuncs com DSW 7XGBoost train csv wget 不是内部或外部命
  • 终端zsh_只需七个步骤,即可使您的“ ZSH”终端站起来—直观指南

    终端zsh by rajaraodv 通过rajaraodv 只需七个步骤 即可使您的 ZSH 终端站起来 直观指南 Jazz Up Your ZSH Terminal In Seven Steps A Visual Guide In th
  • 设置PHP的fpm的系统性能参数pm.max_children

    1 介绍 PHP从Apache module换成了Fpm 跑了几天突然发现网站打不开了 页面显示超时 检查MySQL Redis一众服务都正常 进入Fpm容器查看日志 发现了如下的错误信息 server reached pm max chi
  • day05 java_Spring IoC 和 DI

    为什么使用spring框架 1 解耦代码 每次使用都要new一个对象 2 解决事务繁琐问题 创建对象 初始化 调用方法 销毁对象 3 使用第三方框架麻烦的问题 总结 spring是一个轻量级的Ioc Di和AOP容器 轻量级 简洁 高效 低