SSM核心容器部分

IOC:Inversion of control控制反转-使用对象时由程序中主动new对象转为外部提供对象。

        此过程中对象创建控制权由程序内部转为外部,此思想称为控制反转。

Spring技术对IOC思想提供了实现:

        Spring提供一个容器,称为IOC容器,用来充当IOC思想的“外部”

        IOC容器负责对象的创建、初始化等工作,被创建的对象在IOC容器中被称为Bean

适合交给容器管理的对象:表现层对象、业务层对象、数据层对象、工具对象

不适合交给容器管理的对象:封装实体的域对象

<!-- 1.pom文件中导入Spring对应的坐标spring-context,对应的版本是5.3.21-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.21</version>
</dependency>
<!-- 2.配置bean-->
<bean id="bookDao" class="com.kxg.exercise.dao.impel.BookDaoImpel" name="bookDao1,bokDao2" scope="prototype"/>

bean标签属性介绍:

        id属性:给bean起名字

        class属性:表示给bean定义类型

        name属性:给bean起别名。可以定义多个,是用逗号、分号、空格分隔

        scope属性:定义bean的作用范围。singleton:单例(默认) prototype:非单例

程序内部获取bean可以通过id或name,如果两个都没有得到将抛出异常NoSuchBeanDefinition

// 3.在程序中获取容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");// 可以使用文件系统配置路径:new ClassPathXmlApplicationContext("绝对路径")// 一次获取多个容器:new ClassPathXmlApplicationContext("a.xml","b.xml");
// 4.获取容器中的bean// 方法一:按照bean名称获取
BookDao bookDao1 = (BookDao)ctx.getBean("bookDao");// 方法二:按照bean类型获取(类型唯一)
BookDao bookDao2 = ctx.getBean("BookDao.class");// 方法三:使用bean名称获取指定类型
BookDao bookDao3 = ctx.getBean("bookDao", BookDao.class);

经过上面几步,对象的创建成功由程序内部转为程序外部

DI:Dependency Injection-依赖注入

        在容器中建立bean与bean之间的依赖关系的整个过程,成为依赖注入

<!-- 在spring文件中配置类与类之间的关系:service与dao-->
<bean id="bookService" class="com.kxg.exercise.service.impel.BookServiceImpel"><property name="bookDao" ref="bookDao"/>
</bean>

property标签:表示配置当前bean的属性

        name:表示配置哪一个具体的属性

        ref:表示参照哪一个bean(两个类的绑定)

依赖注入的目的:充分解耦

通过控制反转、依赖注入,对象可以直接从外部获取,并且获取到的bean已经绑定了所有的依赖

这样虽然实现了解耦但是同时也出现了很多新问题:

        bean类中的成员变量怎样实现初始化???

        bean是怎样进行实例化的???

        bean的生命周期???

        外部bean怎样进行管理???

因此Spring也提供了很多解决方案。

依赖注入的方式:setter注入、构造器注入

setter注入:

        简单数据类型:在bean类中设置set方法;xml文件中使用property标签value属性注入

        引用数据类型:在bean类中设置set方法;xml文件中使用property标签ref属性注入建立关系

<property name="connectNumber" value="10"/>
<property name="bookDao" ref="bookDao"/>

构造器注入:

        简单类型:bean类中提供构造方法;xml文件中<constructor-atg>标签中name、value属性

        引用类型:bean类中提供构造方法;xml文件中<constructor-atg>标签中name、ref属性

<!-- 引用类型 -->
<constructor-arg name="bookDao" ref="bookDao"/> 
<!-- 简单数据类型 --><!-- 通过参数名称匹配:没有达到程序解耦的问题 -->
<constructor-arg name="connectNumber" value="55"/>
<constructor-arg name="databaseName" value="mysql"/><!-- 通过参数值类型进行匹配,试图实现解耦问题 -->
<constructor-arg type="int" value="55"/>
<constructor-arg type="java.lang.String" value="mysql"/><!-- 通过参数前后位置匹配,试图实现解耦问题 -->
<constructor-arg index="1" value="55"/>
<constructor-arg index="2" value="mysql"/>

通过依赖注入的不同方式,第一个问题得到了解决

bean的实例化:

构造方法:调用类中的无参构造创建实例对象

静态工厂:调用工厂类中的静态方法实例化对象

        1.添加factory-method属性创建类,不能仅配工厂名。否则仅仅创建的是工厂类不是bean对象

        2.factory工厂类中方法添加static才能创建对象

// 静态工厂-static
public static BookDao getBookDao() {System.out.println("factory setup...");return new BookDaoImpel();
}
<bean id="bookDaoFactory" class="com.kxg.exercise.factory.BookDaoFactory" factory-method="getBookDao"/>

实例工厂:调用静态类中的非静态方法

        容器中配置工厂类

        容器中factory-bean找到相应的工厂类,factory-method找到对应的方法

// 非静态工厂
public BookDao getBookDao_() {System.out.println("factory2 setup...");return new BookDaoImpel();
}
<!--非静态工厂-->
<bean id="bookDaoFactory1" class="com.kxg.exercise.factory.BookDaoFactory"/>
<bean id="bookDao1" factory-method="getBookDao_" factory-bean="bookDaoFactory1"/>

使用FactoryBean实例化

        创建相关FactoryBean类实现FactoryBean接口,实现相关的创建方法getObject

        容器中加载FactoryBean类

public class bookDaoFactoryBean implements FactoryBean<BookDao> {// 得到bean实例:代替原始实例工厂中创建对象的方法@Overridepublic BookDao getObject() throws Exception {System.out.println("FactoryBean...");return new BookDaoImpel();}
}
<!-- FactoryBean-->
<bean id="bookDao2" class="com.kxg.exercise.factory.bookDaoFactoryBean"/>
BookDao bookDao5 = (BookDao) ctx.getBean("bookDao2");
System.out.println(bookDao5);   
   

bean生命周期:

bean生命周期控制:从bean创建后到销毁前做的一些事情

        1.类中提供生命周期的控制方法,xml文件中配置生命周期的方法

        2.类实现InitializingBean、DisposableBean接口

初始化容器:创建对象(内存分配);执行构造方法;执行属性注入(set);执行bean初始化方法

使用bean:执行业务操作

关闭/销毁容器:执行bean销毁方法

bean销毁时机:容器关闭前触发bean的销毁

        关闭容器的方法:

                1.手动关闭容器:ConfigurableApplicationContext接口close()操作

                2.注册关闭钩子,在虚拟机退出前先关闭容器在退出虚拟机:ConfigurableApplicationContext接口registerShutdownHook()

接下来就到了最后一个问题:外部bean怎样管理?

以数据源对象为例:

1.spring中开启context命名空间xmlns:context="http://www.springframework.org/schema/context"

 2.在context空间中加载properties文件  

         system-properties-mode="NEVER":不加载系统属性          location="jdbc1.properties,jdbc2.properties:加载多个properties文件          location="classpath:*.properties:加载路径下的所有properties文件标准格式         location="classpath*:*.properties:从类路径或jar包中搜索并加载properties文件   

3.使用属性占位符${}读取properties文件中的属性

<context:property-placeholder location="classpath:*.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean>
// 创建数据源对象
DataSource dataSource1 = (DataSource) ctx.getBean("dataSource1");
System.out.println(dataSource1);

此外spring还提供了依赖自动装配:直接在bean标签中使用autowire属性

按类型:autowire="byType"

        使用类型装配时,必须保障容器中相同类型的bean唯一

按名称:autowire="byName"

        使用名称自动装配时,必须保障容器中具有指定名称的bean

1.自动装配用于引用类型注入,不适用于简单类型

2.自动装配优先级低于setter注入与构造器注入,同时出现时自动装配失效

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

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

相关文章

能力认证!时代新威荣获《数据安全服务能力评定资格证书》

2024年1月17日&#xff0c;时代新威受邀出席中国计算机行业协会数据安全专业委员会&#xff08;以下简称“数专委”&#xff09;年度工作总结会。此次会议旨在聚集行业企业&#xff0c;搭建数据安全产业企业交流平台&#xff0c;共建产业发展“朋友圈”。 会上&#xff0c;数专…

windows | linux | SSH 密钥验证

SSH密钥登陆过程 客户端通过ssh-keygen生成自己的公钥和私钥。手动将客户端的公钥放入远程服务器的指定位置。客户端向服务器发起 SSH 登录的请求。服务器收到用户 SSH 登录的请求&#xff0c;发送一些随机数据给用户&#xff0c;要求用户证明自己的身份。客户端收到服务器发来…

初阶数据结构:链表相关题目练习(补充)

目录 1. 单链表相关练习题1.1 移除链表元素1.2 反转链表1.3 链表的中间结点1.4 链表的倒数第k个结点1.5 合并两个有序链表1.6 链表分割1.7 链表的回文结构1.8 相交链表1.9 判断一个链表中是否有环1.10 寻找环状链表相遇点1.11 链表的深度拷贝 1. 单链表相关练习题 注&#xff1…

IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知

一、背景 兔年末投了一篇TIE&#xff0c;手稿初次提交的注意事项也整理成了博客IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知&#xff0c;获得了许多点赞和收藏。最近也收到了审稿结果&#xff0c;给的意见是大修major revision&#xff0c;总之只要不…

基于springboot+vue的线上辅导班系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

吸猫毛空气净化器哪个好?推荐除猫毛好的宠物空气净化器品牌

如今&#xff0c;越来越多的家庭选择养宠物&#xff01;虽然家里变得更加温馨&#xff0c;但养宠可能会带来异味和空气中的毛发增多可能会引发健康问题&#xff0c;这也是一个大问题。 但我不想家里到处都是异味&#xff0c;尤其是便便的味道&#xff0c;所以很需要一款能够处…

QML中表格中数据获取

1.在生成的动态表格中获取某格数据的内容 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableMod…

数据分析-Pandas数据如何图示规律

数据分析-Pandas数据如何图示规律 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

VS2015报错:error MSB8020和MSB8036的解决方案

VS2015编译报错&#xff1a;error MSB8020 提示信息&#xff1a;error MSB8020: The build tools for v141 (Platform Toolset ‘v141’) cannot be found. To build using the v141 build tools, please install v141 build tools. Alternatively, you may upgrade to the c…

小程序框架接口-getApp

框架接口-getApp getApp() 用于获取小程序全局唯一的 App 实例&#xff0c;通过小程序应用实例可实现数据或方法的共享 &#x1f4cc; 注意事项&#xff1a; 1.不要在 App() 方法中使用 getApp() &#xff0c;使用 this 就可以拿到 app 实例通过 getApp() 获取实例之后&#x…

Android13 Audio框架

一、Android 13音频代码结构 1、framework: android/frameworks/base 1.AudioManager.java &#xff1a;音频管理器&#xff0c;音量调节、音量UI、设置和获取参数等控制流的对外API 2.AudioService.java &#xff1a;音频系统服务&#xff08;java层&#xff09;&#xff0c…

多模态论文阅读-LLaVA

Visual Instruction Tuning Abstract1. Introduction2. Related Work3. GPT-assisted Visual Instruction Data Generation4. Visual Instruction Tuning4.1 Architecture4.2 Training 5 Experiments5.1 Multimodal Chatchot5.2 ScienceQA 6 Conclusion Abstract 使用机器生成…

JS中判断是否存在逗号,如果存在给去掉

.includes() 方法判断是否存在 split("需要去掉的字符串").join(" ") 去重的方法 去重复 划分后拼接

网络——DHCP服务器、DNS服务器实验

网络——DHCP服务器、DNS服务器实验 一、DHCP服务器实验 DHCP——动态主机配置协议,用来管理ip地址的分配。网络中的每台计算机都有至少一个ip地址。在Windows网络连接对话框中可以设置成自动获取ip地址,这样主机作为DHCP client就可以自动从DHCP server获取ip地址了。 DHC…

live555学习 - 环境准备

环境&#xff1a;Ubuntu 16.04.7 ffmpeg-6.1 1 代码下载 最新版本&#xff1a; http://www.live555.com/liveMedia/public/ 历史版本下载 https://download.videolan.org/pub/contrib/live555/ 选择版本live.2023.01.19.tar.gz ps&#xff1a;没有选择新版本是新版本在…

数据库优化建议

尽量控制单表数据量的大小&#xff0c;建议控制在 500 万以内 500 万并不是 MySQL 数据库的限制&#xff0c;过大会造成修改表结构&#xff0c;备份&#xff0c;恢复都会有很大的问题。可以用历史数据归档&#xff08;应用于日志数据&#xff09;&#xff0c;分库分表&#xf…

阿里开源的Java诊断利器Arthas

一.什么是Arthas 1.为什么需要Arthas 通常&#xff0c;本地开发环境无法访问生产环境。如果在生产环境中遇到问题&#xff0c;则无法使用 IDE 远程调试。更糟糕的是&#xff0c;在生产环境中调试是不可接受的&#xff0c;因为它会暂停所有线程&#xff0c;导致服务暂停。 开…

探索Apple Vision Pro:创新技术带来的多彩应用世界

Apple Vision Pro是一款具有前沿技术的设备,可以与现实世界进行交互,让用户在虚拟世界中享受各种应用。以下是一些值得注意的Vision Pro应用: AR演示环境:Vision Pro上的AR应用主要是基于AR的演示环境,这些应用可以让用户在现实世界中体验虚拟世界。游戏:Vision Pro上有一…

c语言统计字符

本题要求编写程序&#xff0c;输入10个字符&#xff0c;统计其中英文字母、空格或回车、数字字符和其他字符的个数。 输入格式: 输入为10个字符。最后一个回车表示输入结束&#xff0c;不算在内。 输出格式: 在一行内按照 letter 英文字母个数, blank 空格或回车个数, d…

鸿蒙Harmony应用开发—ArkTS声明式开发(鼠标事件)

在鼠标的单个动作触发多个事件时&#xff0c;事件的顺序是固定的&#xff0c;鼠标事件默认透传。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。目前仅支持通过外接鼠标触发。 onHover onHover(event: …