对Spring核心思想的理解(一)

news/2024/5/17 12:59:08/文章来源:https://blog.csdn.net/weixin_62226624/article/details/132698689

Spring有两大核心思想:

        1.控制反转(IOC)依赖注入(DI)

        2.面向切面编程(AOP)

        先说Spring的第一大核心思想,“控制反转 依赖注入”,这八个字究竟是什么意思呢?

        控制反转是指将创建对象的权力交由Spring容器来管理,依赖注入则是指应用程序运行时,每一个Bean对象都依赖Ioc容器注入当前Bean对象所需要的另一个Bean对象。

        该思想很大程度上使降低了项目组件之间的耦合关系,实现了解耦。

        Spring IOC容器就是利用控制反转-依赖注入的思想来创建并管理Bean。这里的管理是指根据bean与bean之间的关系来完成相应的注入。

        依赖注入有3种实现方式:

                1.Set注入(通过set方法注入)

                2.构造注入(通过构造方法注入)

                3.属性注入(通过参数注入,不推荐

  利用三层架构来举例Set注入和构造注入。

1.Set注入

        控制层:

//利用三层架构实现调用:控制层==》业务层==》数据访问层
public class IUserControllerImpl implements IUserController {//依赖注入时有接口调用接口注入,没有接口再通过实现类注入private IUserService service = null;//通过DI依赖注入的方式注入业务层//set方法public void setService(IUserService service) {this.service = service;}public void save() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {System.out.println("====控制访问层===");service.save();}

业务层

public class IUserServiceImpl implements IUserService {//业务层接口private IUserDao dao = null;//set方法public void setDao(IUserDao dao) {this.dao = dao;}public void save() {System.out.println("=====业务访问层====");dao.save();}
}

数据访问层:

public class IUserDaoImpl implements IUserDao {public void save() {System.out.println("====数据访问层===");}
}

在applicationContext.xml中完成bean对象之间的注入:

 <!--set注入对象--><bean id="controller" class="com.xun.controller.IUserControllerImpl"><!--将业务层通过set方法注入数据访问层--><property name="service" ref="service"></property></bean><!--配置业务层--><bean id="service" class="com.xun.service.IUserServiceImpl"><!--将数据访问层注入业务层--><property name="dao" ref="dao"></property></bean><!--配置数据访问层--><bean id="dao" class="com.xun.dao.IUserDaoImpl"></bean>

测试类:

public class Test01 {public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {//通过SpringApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//注入对象(控制层)IUserControllerImpl controller = (IUserControllerImpl) applicationContext.getBean("controller");controller.save();
}

观察结果:

说明利用set注入成功,并完成了各个对象之间的调用(即依赖关系的注入)。

2.构造注入

控制层:

public class UserControllerImp implements IUserController {//业务类IUserSerivce serivce;//构造注入(构造方法的重载)public UserControllerImp(IUserSerivce serivce) {this.serivce = serivce;}public UserControllerImp() {//无参构造}@Overridepublic void save() {System.out.println("===controller控制访问层===");serivce.save();}
}

业务层:

public class UserSerivceImp implements IUserSerivce {//数据访问层IUserDao dao;//构造注入public UserSerivceImp(IUserDao dao) {this.dao = dao;}public UserSerivceImp() {//无参构造}@Overridepublic void save() {System.out.println("===service业务访问层===");dao.save();}
}

数据访问层:

public class UserDaoImp implements IUserDao {@Overridepublic void save() {System.out.println("===dao数据访问层===");}
}

在applicationContext.xml中完成bean对象之间的注入:

 <!--构造注入对象--><!--先注入数据访问层,以便业务层的引用--><bean id="daoImp" class="com.apesource.dao.UserDaoImp"></bean><!--业务层--><bean id="serivceImp" class="com.apesource.service.UserSerivceImp"><constructor-arg name="dao" ref="daoImp"></constructor-arg></bean><!--控制层--><bean id="controllerImp" class="com.apesource.controller.UserControllerImp"><constructor-arg name="serivce" ref="serivceImp"></constructor-arg></bean>

测试类:

public class Test01 {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//拿到控制器对象IUserController controller = (IUserController) applicationContext.getBean("controllerImp");controller.save();}
}

结果:

说明利用构造注入成功,并完成了各个对象之间的调用(即依赖关系的注入)。

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

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

相关文章

悲观锁和乐观锁、缓存

悲观锁&#xff1a; 悲观锁的实现通常依赖于数据库提供的机制&#xff0c;在整个处理的过程中数据处于锁定状态&#xff0c;session的load方法有一个重载方法&#xff0c;该重载方法的第三个参数可以设置锁模式&#xff0c;load(object.class , int id,LockMode.?)&#xff0…

RabbitMQ 知识点解读

1、AMQP 协议 1.1、AMQP 生产者的流转过程 当客户端与Broker 建立连接的时候&#xff0c;会调用factory .newConnection 方法&#xff0c;这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker &#xff0c;以此通知Broker 本次交互采用的是AMQPO-9-1 协议&…

Windows定时任务实现开机自启动

Windows定时任务实现S11开机自启动 Windows键加 r 键打开运行窗口&#xff0c;然后输入control打开控制面板。

WebStorm2023新版设置多个窗口,支持同时显示多个项目工程

调整设置 Appearance & Behavior -> System Settings> Project open project in New window&#xff1a;

私有gitlab的搭建和配置教程

文章目录 1. 说明2. 安装操作2.1 依赖项2.2 gitlab-ce2.3 简要配置2.4 网页操作2.5 中文配置2.6 其他操作 3. 配置https3.1 配置证书3.2 url配置3.3 网页访问3.4 认证错误 4. ssh操作4.1 生成文件4.2 web配置4.3 额外操作 1. 说明 此教程基于Ubuntu22.04进行阐述&#xff0c;只…

分库分表实战

数据分片与分片算法 分库分表的第一性原理&#xff0c;那就是&#xff1a;存储容量和性能容量。只有对核心业务表才会精心进行分库分表的设计。 首先我们了解一下数据分片是什么意思&#xff1f; 本质上的分库分表不就是数据分片吗&#xff1f;定义就是&#xff1a;按照某个…

软件设计师(十二)多媒体基础

一、多媒体技术的基本概念 1、音频相关概念 PC处理的音频信号主要是人耳能听得到的音频信号 (audio) &#xff0c;它的频率范围是20Hz ~ 20kHz。 可听声包括&#xff1a;话音 (也称语言)&#xff1a;人的说话声&#xff0c;频率范围通常为300 ~ 3400Hz。 音乐&#xff1a;由乐…

使用Jsmooth打包JavaFx程序为EXE文件

配置IDEA 第一步&#xff1a; 第二步&#xff1a; MANIFEST.MF的文件路径&#xff0c;必须在resources文件夹中&#xff0c;如果没有&#xff0c;就创建一个。 第三步&#xff1a;配置项目所需jar包的相对路径 最后&#xff1a; 点击确定后&#xff0c;编译Jar 配置Jsmooth …

数控程序传输DNC服务、数控刀补服务(发那科fanuc、西门子、三菱、广数、新代、华中、宝元、马扎克、大畏Okuma)等数据采集服务

行业现状&#xff1a; 最近听到很多做MES、ERP这一行的叫苦&#xff0c; 客户对项目的要求越来越严格&#xff0c;做到数字化工厂都伴随着ERP、MES的项目要求必须一起做下去 然而很对MES、ERP对设备协议不懂&#xff0c;买了协议自己还要开发&#xff0c;考虑线程的问题、断…

学信息系统项目管理师第4版系列06_项目管理概论

1. 项目基础 1.1. 项目是为创造独特的产品、服务或成果而进行的临时性工作 1.1.1. 独特的产品、服务或成果 1.1.2. 临时性工作 1.1.2.1. 项目有明确的起点和终点 1.1.2.2. 不一定意味着项目的持续时间短 1.1.2.3. 临时性是项目的特点&#xff0c;不是项目目标的特点 1.1…

NV12数据格式转H265编码格式实现过程

一、需求 在视频处理和传输应用中&#xff0c;将视频数据编码为高效的格式是非常重要的。H.265&#xff08;也称为HEVC&#xff09;是一种先进的视频编码标准&#xff0c;具有更好的压缩性能和图像质量&#xff0c;相比于传统的编码标准&#xff08;如H.264&#xff09;&#…

Java设计模式-结构性设计模式(代理设计模式)

简介 为其他对象提供⼀种代理以控制对这个对象的访问&#xff0c;属于结构型模式。客户端并不直接调⽤实际的对象&#xff0c;⽽是通过调⽤代理&#xff0c;来间接的调⽤实际的对象应用场景 各⼤数码专营店&#xff0c;代理⼚商进⾏销售对应的产品&#xff0c;代理商持有真正的…

字符串逆序(不使用库函数并用递归实现)

文章目录 前言一、题目要求二、解题步骤1.大概框架2.如何反向排列&#xff1f;3.模拟实现strlen4.实现反向排列5.递归实现反向排列 总结 前言 嗨&#xff0c;亲爱的读者们&#xff01;我是艾老虎尤&#xff0c;。今天&#xff0c;我们将带着好奇心&#xff0c;探索一个题目&am…

SpringBoot实例类-@Data

1.配置pom.xml 说明&#xff1a;添加lombok依赖 <!-- lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 2.刷新maven 说明&#xff1a;一般修改xml文件就需要刷…

基于Java+SpringBoot+Vue前后端分离个人博客系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

CRC原理介绍及STM32 CRC外设的使用

1. CRC简介 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;简称CRC&#xff09;&#xff0c;由 W. Wesley Peterson 于 1961 年首次提出的一种纠错码理论。 CRC是一种数据纠错方法&#xff0c;主要应用于数据通信或者数据存储的场合&#xff…

算法-分治算法

文章来源&#xff1a; https://blog.csdn.net/weixin_45630258/article/details/126425400 欢迎各位大佬指点、三连 一、分治 1、定义&#xff1a;分治&#xff0c;也就是分而治之。 它的一般步骤是&#xff1a; ① 将原问题分解成若干个规模较小的子问题&#xff08;子问题…

UMA 2 - Unity Multipurpose Avatar☀️五.如何使用别人的Recipe和创建自己的服饰Recipe

文章目录 🟥 使用别人的Recipe1️⃣ 导入UMA资源效果展示2️⃣ 更新Library3️⃣ 试一下吧🟧 创建自己的服饰Recipe1️⃣ 创建自己的服饰Recipe2️⃣ 选择应用到的Base Recipe3️⃣ 指定显示名 / 佩戴位置 / 隐藏部位4️⃣ 给该服饰Recipe指定Slot / Overlay🚩 赋予Slot�…

javaScript:DOM元素的获取(静态/动态获取)

目录 一.dom元素获取的意义与使用场景 使用场景&#xff08;绝大多数js操作都需要dom操作&#xff09; 总结/疑问解答&#xff01; 二.DOM元素获取的常用方法&#xff08;重点&#xff09; 获取dom元素&#xff08;动态&#xff09; document.gerElementbyId() docume…

Hadoop分布式模式配置

hadoop环境准备&#xff1a; hadoop下载地址&#xff1a;http://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz hadoop集群的安装配置大致分为以下六个步骤&#xff1a; 选定一台机器作为master 在master节点上创建hadoop用户、安装ssh服务端、配…