当前位置: 首页 > news >正文

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定义

在这里插入图片描述

相关文章:

  • Qt学生管理系统-- 数据库课程设计(付源码)
  • Anything in Any Scene:无缝融入任何场景,实现逼真视频对象插入技术
  • linux彻底卸载docker
  • Qt 实战(2)搭建开发环境 | 2.3、qmake详解
  • Java中线程启动:start()与run()方法的区别
  • 2024-07-12 Unity AI状态机1 —— 框架介绍
  • 案例|LabVIEW连接S7-1200PLC
  • pytorch说明
  • Java 实验三:数组操作以及Java中的方法
  • 解决方案架构师系列 - AWS - AWS Amplify 服务功能介绍
  • 【Linux取经之路】Linux常见指令
  • 关于windows下编译xLua插件的流程记录
  • 【Parallel SSH】Ubuntu系统配置pssh实现多主机并行执行Master分发的命令
  • 突破与创新:Vue.js 创始人 尤雨溪 2024 年度技术前瞻
  • Python - Word转TXT文本,或TXT文本转Word
  • ES6语法详解(一)
  • JAVA 学习IO流
  • Phpstorm怎样批量删除空行?
  • tab.js分享及浏览器兼容性问题汇总
  • Windows Containers 大冒险: 容器网络
  • 记录:CentOS7.2配置LNMP环境记录
  • 使用parted解决大于2T的磁盘分区
  • 新手搭建网站的主要流程
  • 译自由幺半群
  • gunicorn工作原理
  • 关于Android全面屏虚拟导航栏的适配总结
  • 说说我为什么看好Spring Cloud Alibaba
  • $refs 、$nextTic、动态组件、name的使用
  • (2)STM32单片机上位机
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Linux下编译安装log4cxx
  • (转)菜鸟学数据库(三)——存储过程
  • .gitattributes 文件
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET多线程执行函数
  • .NET开源项目介绍及资源推荐:数据持久层
  • @AutoConfigurationPackage的使用
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @EnableConfigurationProperties注解使用
  • @TableLogic注解说明,以及对增删改查的影响
  • @在php中起什么作用?
  • [ JavaScript ] JSON方法
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [BUUCTF 2018]Online Tool
  • [CF543A]/[CF544C]Writing Code
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [CTF夺旗赛] CTFshow Web1-12 详细过程保姆级教程~