Spring-Spring、IoC、DI、注解开发

1、Spring是什么

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
Spring整体架构
在这里插入图片描述
Spring优点:

  • Spring属于低侵入设计。
  • IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合,实现各个层之间的解耦,让我们更专注于业务逻辑。
  • 提供面向切面编程
  • 对各种主流插件提供很好的集成支持。
  • 对事务支持的很好,只要配置即可,无须手动控制

缺点:

  • 依赖反射,影响性能

以前所有东西都是由程序去进行控制创建,耦合性太高(模块与模块之间的依赖性太强,需求改一个模块,实际需要改好几个模块),而现在是由我们自行控制创建对象 , 把主动权交给了调用者。程序不用去管怎么创建,怎么实现了。它只负责提供一个接口
问题:耦合度高
解决办法:使用对象时,在程序中不要主动使用new产生对象,转换由外部提供对象

2、IOC

控制反转IoC(Inversion of Control),是一种设计思想(对象的产生控制权由程序转移到外部)

控制:谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring(core containner)来创建的
反转:程序本身不创建对象 , 而变成被动的接收对象

Spring对IoC思想进行了实现

  • Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部
  • IoC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
  • 如果两个bean之间有关系,进行DI(依赖注入)

2.1、使用IoC

  • 在resources路径下创建applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="stu" class="com.zyh.pojo.Student"></bean>
</beans>

  • IOC容器通过读取配置文件,加载配置bean标签来创建对象(在核心容器中创建好bean对象后,就放在核心容器中,需要使用的时候再拿出去用)
  • 读取配置文件
//读取配置文件
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student stu = applicationContext.getBean("stu", Student.class);
        System.out.println(stu);

2.2、IoC容器创建bean(实例化bean)的三种方法

  • 无参构造函数:构造方法(常用),无参构造方法如果不存在,将抛出异常BeanCreationException
<bean id="bookDao" class="com.src.dao.impl.BookDaoImpl"/>
  • 静态工厂
<bean id="bookDao" class="com.src.factory.OrderDaoFactory" factory-metod="getOrderDao"/>
  • 实例工厂:先造出工程实例对象
<bean id="userFactory" class="com.src.factory.userDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory">

2.3、Bean生命周期

  • 初始化容器

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

  • 使用bean

    1.执行业务操作

  • 关闭/销毁容器

    1.执行bean销毁方法

3、DI

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

  • setter注入
    在bean中定义引用类型属性并提供可访问的set方法
public class BookSeviceImpl implements BookService{
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao){
		this.bookDao = bookDao;
	}
}

配置中使用property标签ref属性注入引用类型对象
配置中使用property标签value属性注入简单类型对象

<bean id = "bookService" class="com.org.example.service.impl.serviceImpl">
	<property name = "bookDao" ref = "bookDao"/>
</bean>
<bean id = "bookDao" class="com.org.example.dao.impl.BookDaoImpl">
  • 构造器注入
    配置中使用constructor-arg标签ref属性注入引用类型对象
public class BookSeviceImpl implements BookService{
	private BookDao bookDao;
	public BookServiceImpl(BookDao bookDao){//构造方法
		this.bookDao = bookDao;
	}
}
<bean id = "bookService" class="com.org.example.service.impl.serviceImpl">
	<constructor-arg name = "bookDao" ref = "bookDao"/>
</bean>
<bean id = "bookDao" class="com.org.example.dao.impl.BookDaoImpl">

3.1 自动装配

IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
1、自动装配用于引用类型注入,不能对简单类型进行操作
2、使用按类型装配(byType)必须保障容器中相同类型的bean唯一,推荐使用
3、使用按名称装配(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐
4、自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
在这里插入图片描述

在这里插入图片描述

4、注解开发

在类上加上@Component就相当于对这个类定义为bean了
需要在配置文件中加上<context : compontent-scan base-package="com.org.example">
Spring提供@Component注解的三个衍生注解

  • @Controller:用于表现层bean定义
  • @Service:用于业务层bean定义
  • @Repository:用于数据层bean定义

在这里插入图片描述

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

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

相关文章

【python】基于随机森林和决策树的鸢尾花分类

目录 引言 决策树&#xff08;Decision Tree&#xff09; 随机森林&#xff08;Random Forest&#xff09; 数据集 结果 代码实现 引言 随机森林&#xff08;Random Forest&#xff09;和决策树&#xff08;Decision Tree&#xff09;是两种在机器学习中广泛使用的分类和…

红色文化3D虚拟数字展馆搭建意义深远

在房地产与土地市场的浪潮中&#xff0c;无论是新城规划、乡村振兴&#xff0c;还是商圈建设&#xff0c;借助VR全景制作、虚拟现实和web3d开发技术打造的全链条无缝VR看房新体验。不仅极大提升了带看与成交的转化率&#xff0c;更让购房者足不出户&#xff0c;即可享受身临其境…

【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误

1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后&#xff0c;残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3&#xff0c;发现以前的套路已经失效了。反复重装PHP8.3失败后&#xf…

Sentinel 学习笔记

Sentinel 学习笔记 作者&#xff1a;王珂 邮箱&#xff1a;49186456qq.com 文章目录 Sentinel 学习笔记[TOC] 前言一、基础概念二、Sentinel控制台2.1 安装控制台2.2 簇点链路2.3 请求限流2.4 线程隔离2.5 服务降级2.6 服务熔断 三、Sentinel客户端3.1 原始Jar包客户端3.2 Sp…

python条件

条件语句 if语句 if...else语句 if...elif...else语句 嵌套 is is 是一个身份运算符&#xff0c;用于比较两个对象的身份&#xff0c;即它们在内存中的地址是否相同。这与比较两个对象是否相等的 运算符不同。 运算符比较的是两个对象的值是否相等。 比较对象 比较基本数据…

2024-07-12 Unity AI状态机1 —— 框架介绍

文章目录 1 有限状态机2 状态机实现框架2.1 StateMachine2.2 BaseState2.3 ...State2.4 IAIObject 3 框架类图 本文章参考 B 站唐老狮 2023 年直播内容。点击前往唐老狮 B 站主页。 1 有限状态机 ​ 有限状态机&#xff08;Finite - State Machine&#xff0c;FSM&#xff09…

linux的学习(四):磁盘,进程,定时,软件包的相关命令

简介 关于磁盘管理&#xff0c;进程管理&#xff0c;定时任务&#xff0c;软件包管理的命令的使用 磁盘管理类命令 du du 目录名&#xff1a; 查看文件和目录占用的磁盘空间 参数&#xff1a; -h&#xff1a;可以看到大小的单位&#xff0c;g,mb-a&#xff1a;还可以看到文…

日前光伏功率曲线预测

《利用 2DG&#xff32;A&#xff0d;BiLSTM 模型的日前光伏功率曲线预测方法》 利用2DGRA实现最佳历史相似日数据的获取&#xff0c;根据日功率曲线的波动性将总数据分为3类&#xff08;晴空条件、轻度非晴空条件和重度非晴空条件&#xff09;&#xff0c;根据3种分类&#x…

SpringCloud架构师面试

一、微服务是什么 1、基本概念 微服务是一种架构风格&#xff08;区别于单体架构、垂直架构、分布式架构、SOA架构&#xff09;&#xff0c;应用程序被划分为更小的、流程驱动的服务。 2、微服务的特征 轻量化&#xff1a;将复杂的系统或者服务进行纵向拆分&#xff0c;每个…

【自然语言处理】面向新冠肺炎的社会计算应用

面向新冠肺炎的社会计算应用 1 任务目标 1.1 案例简介 新冠肺炎疫情牵动着我们每一个人的心&#xff0c;在这个案例中&#xff0c;我们将尝试用社会计算的方法对疫情相关的新闻和谣言进行分析&#xff0c;助力疫情信息研究。本次作业为开放性作业&#xff0c;我们提供了疫情…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务&#xff0c;支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远&#xff0c;需要考虑的因素增多&#xff0c; 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护&#xff0c;并向全社会…

Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决办法

在Spring配置数据源时&#xff0c;当使用Spring容器加载druid.properties数据库连接池配置文件时&#xff0c;容易碰到create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/mydbs, errorCode 1045, state 28000 java.sql.SQLException: Access denied for user …

在JavaScript中,什么是解构赋值(destructuring assignment)?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介在JavaScript中&#xff0c;什么是解构赋值&#xff08;destructuring assignment&#xff09;&#xff1f;1. 引言2. 解构赋值的概念3. 数组解构赋值3.1 基本语法3.2 跳过元素3.3 默认值3.4 交换变量值 4. 对象解构赋值4.1 基本语…

springboot系列教程(一):简介与入门案例(含源码)

一、SpringBoot简介 SpringBoot继承了Spring优秀的基因&#xff0c;上手难度小简化配置&#xff0c;提供各种默认配置来简化项目配置内嵌式容器简化Web项目&#xff0c;简化编码 Spring Boot 则会帮助开发着快速启动一个 web 容器&#xff0c;在 Spring Boot 中&#xff0c;只…

React学习笔记03-----手动创建和运行

一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录&#xff0c;提供可以供外部直接访问的文件&#xff0c;存放不需要webpack打包的文件&#xff0c;比如静态图片、CSS、JS src存放源码 &#xff08;1&#xff09…

QT多线程下,信号槽分别在什么线程中执行,如何控制?

可以通过connect的第五个参数进行控制信号槽执行时所在的线程 connect有几种连接方式&#xff0c;直接连接、队列连接和 自动连接 直接连接&#xff08;Qt::DirectConnection&#xff09;&#xff1a;信号槽在信号发出者所在的线程中执行 队列连接&#xff08;Qt::QueuedConn…

whereis命令是 Linux 和类 Unix 系统中的一个命令行工具,用于定位二进制程序、源代码和手册页(man pages)的位置

文章目录 1、whereis2、实例 1、whereis whereis 命令是 Linux 和类 Unix 系统中的一个命令行工具&#xff0c;用于定位二进制程序、源代码和手册页&#xff08;man pages&#xff09;的位置。当你想要快速找到某个程序或命令的安装位置时&#xff0c;whereis 命令会非常有用。…

关于无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上 解决方法

文章目录 1. ERNEL32.dll 下载2. 解决方法 &#x1f44d; 个人网站:【 洛秋小站】 1. ERNEL32.dll 下载 Windows 7 在安装postman时报错缺少动态链接库,提示缺少.NET Framework,这是因为本地缺少相应的dll文件导致的&#xff0c;这时就需要下载ERNEL32.dll文件&#xff0c;在解…

MySQl高级篇-查询优化篇

SQL性能分析 SQL性能下降原因&#xff1a; 查询语句写的烂索引失效&#xff08;数据变更&#xff09;关联查询太多join&#xff08;设计缺陷或不得已的需求&#xff09;服务器调优及各个参数设置&#xff08;缓冲、线程数等&#xff09; SQL调优过程&#xff1a; 观察&…

【大语言模型】私有化搭建-企业知识库-知识问答系统

下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU&#xff0c;算力和效果较差) 2.GPU模式&#xff08;需要有NVIDIA显卡支持&#xff09; Ollama网络配置 Ollama前…