Spring

article/2025/10/10 19:38:17

目录

1.spring介绍

spring中的两个核心概念

1.1 IoC

1.2 AoP

1.3 Spring的优点

1.4 Spring工程构建

1.4.1 Maven Spring 依赖

1.4.2 Spring核心配置文件编写

1.4.2.1 完成控制反转以及依赖注入

1.4.2.2 测试

1.4.2.3 Spring中的IOC 产生的对象是否是单例模式

1.5 Bean的三种实例化方式

1.5.1构造方法方式

1.5.2 静态工厂方式

1.5.3 实例工厂方式

1.6 Bean的生命周期

1.6.1 Bean的销毁时机



1.spring介绍

官网:https://spring.io 

Spring 是一个企业级应用框架。其中包含了大量的各种应用组件。 Spring 框架为现代基于 Java 的企业应用程序提供了一个全面的编程和配置模型,能够在任何类型的部署平台上进行部署。其核心是 IoC AOP

spring中的两个核心概念

1.1 IoC

1.IoC (inversion of Controller) 控制反转,将原来的我们完成的实例化过程,交给容器来完成

、将组件对象的控制权从 代码-->转移到外部容器上

2.组件化的思想 : 使用接口, 不在关注实现

3.DI   依赖注入(Dependency Injection)  依赖于某种媒介完成对某一个对象的初始化 或赋值。

1.2 AoP

2.AOP 面向切面编程(Aspect Oriented Programming)

1.3 Spring的优点

1.独立于各种应用服务器

2.依赖注入特性将组件关系透明化,降低了耦合度

3.面向切面编程的特性允许将通用任务进行 几种处理 --()

4.与第三方框架的良好整合

1.4 Spring工程构建

1.4.1 Maven Spring 依赖

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.22</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.9</version></dependency></dependencies>

1.4.2 Spring核心配置文件编写

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>

1.4.2.1 完成控制反转以及依赖注入

  beanid名称,在同一个配置文件下,是只能拥有一个,不能够出现重复的id 名称!
<bean id="gz" class="com.csi.domain.People"><constructor-arg index="0" value="gz"/><constructor-arg index="1" value="打鬼子"/></bean><bean id="rod" class="com.csi.domain.People"><constructor-arg index="0" value="rod"/><constructor-arg index="1" value="唱歌"/></bean>输出的结果就是:gz:打鬼子
rod:唱歌

1.4.2.2 测试

package com.csi.bean;import com.csi.domain.People;
import com.csi.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestPeople {@Testpublic void TestPeople() {//步骤1:需要先加载Spring核心配置文件ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//步骤2:需要获取到bean的id名称,也就是获取到由容器创建的对象People people = (People) ctx.getBean("gz");People people1 = (People) ctx.getBean("rod");System.out.println(people);System.out.println(people1);}}

1.4.2.3 Spring中的IOC 产生的对象是否是单例模式

1.经过测试 IOC产生的对象是单列模式 线程是安全的 但是也有特定的条件:

   1.1什么是单例模式?

    保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。

 

1.5 Bean的三种实例化方式

1.5.1构造方法方式

userServiceImpl的实现类:

package com.csi.service.impl;import com.csi.dao.UserDao;
import com.csi.domain.UserInfo;
import com.csi.mapper.UserMapper;
import com.csi.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public UserServiceImpl() {}public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}@Autowiredprivate UserMapper userMapper ;@Overridepublic void save() {this.userMapper.save();}@Overridepublic List<UserInfo> list() {return this.userMapper.list();}@Overridepublic void update() {this.userMapper.update();}
}

 applicationContext.xml的配置文件:

<bean id="userdao" class="com.csi.dao.impl.UserDaoImpl"/>    <bean id="userservice" class="com.csi.service.impl.UserServiceImpl"><property name="userDao" ref="userdao" />
</bean>

测试类:

package com.csi.bean;import com.csi.service.UserService;
import com.csi.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestUserServiceImpl {@Testpublic void TestUserService() {//步骤1:需要先加载Spring核心配置文件ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//步骤2:需要获取到bean的id名称,也就是获取到由容器创建的对象UserService userService = (UserService) ctx.getBean("userService");//步骤3:输出结果userService.save();}
}

1.5.2 静态工厂方式

1.创建了一个接口

package com.csi.dao;import java.util.List;public interface UserDao {void save() ;void update() ;void deleteById(int userId) ;void findById(int userId) ;List list() ;}

 2.UserDaoImpl  实现类

package com.csi.dao.impl;import com.csi.dao.UserDao;import java.util.List;public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("save方法被执行了...");}@Overridepublic void update() {System.out.println("update方法被执行了...");}@Overridepublic void deleteById(int userId) {}@Overridepublic void findById(int userId) {}@Overridepublic List list() {System.out.println("list方法被执行了...");return null;}
}

3.弄一个静态工厂类:

package com.csi.bean;import com.csi.dao.UserDao;
import com.csi.dao.impl.UserDaoImpl;public class ObjectStaticDaoFactory {public static UserDao getUserDao() {System.out.println("静态工厂创建了...准备创建对象...");return new UserDaoImpl() ;}}

4.配置信息:

    <bean id="userDao" class="com.csi.bean.ObjectStaticDaoFactory" factory-method="getUserDao"/>

5 .测试类

package com.csi.bean;import com.csi.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestUserDao {@Testpublic void test1(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao) ctx.getBean("userDao");userDao.save();System.out.println(userDao);}}

6.如果在配置信息中设置了 scope=“prototype”  ---原型 

则会产生两个不同的对象 

静态工厂

1.5.3 实例工厂方式

实例工厂与静态工厂的不同点有两点:

1.在写实例工厂的时候是没有 static的

2.在配置文件信息时是不同的

实例工厂的配置信息是: 它是先设置一个 bean是实例工厂的bean  类

然后在userDao中调用了 上面的 factoryBean 去实现  以及调用实例工厂类下的方法:

getUserDao

    <bean id="factoryBean" class="com.csi.bean.ObjectDaoFactory"/><bean id="userDao" factory-bean="factoryBean" factory-method="getUserDao"/>

 

1.6 Bean的生命周期

其定义为:从对象的创建到销毁的过程。而Spring中的一个Bean从开始到结束经历很多过程,但总体可以分为六个阶段Bean定义、实例化、属性赋值、初始化、生存期、销毁

简单来说,分为四步:

使用无参构造方法去创建了一个Bean

1.实例化(Instantiation)

2.属性设置 (populate)

3.初始化 (initialization)

4.销毁 (Destruction)

 

1.6.1 Bean的销毁时机

在容器关闭你之前触发bean 的销毁

关闭容器的方式:

  • 手工关闭:ConfigurableApplicationContext 接口 close() 操作
  • 注册关闭钩子,在虚拟机退出全先关闭容器在退出虚拟机:ConfigurableApplicationContext 接口 registerShutdownHook() 操作


 


  1.  


http://chatgpt.dhexx.cn/article/X0GfsrQD.shtml

相关文章

动静分离 与 热点缓存

动静分离 让系统“快”起来&#xff1a;1、提高单次请求的效率2、减少没必要的请求 “动静分离”就是瞄着这个大方向去的。所谓“动静分离”&#xff0c;其实就是把用户请求的数据&#xff08;如HTML页面&#xff09;划分为“动态数据”和“静态数据”。简单来说&#xff0c;“…

天猫浏览型应用的CDN静态化架构演变

转载自&#xff1a;http://zhu-zhiguo.iteye.com/blog/2145496 在天猫双11活动中&#xff0c;商品详情、店铺等浏览型系统&#xff0c;通常会承受超出日常数倍甚至数十倍的流量冲击。随着历年来双11流量的大幅增加&#xff0c; 每年这些浏览型系统都要面临容量评估、硬件扩容、…

java 确保线程安全_确保不安全感

java 确保线程安全 33岁的克雷格斯宾塞&#xff08;Craig Spencer&#xff09;在治疗埃博拉病毒患者后于10月17日从非洲返回美国。 几天后&#xff0c;他的埃博拉病毒呈阳性React。 每个人&#xff08;尤其是周围的人&#xff09;和纽约人都感到关切。 纽约市市长走到媒体前&am…

经验:一个秒杀系统的设计思考

前言 秒杀大家都不陌生。自2011年首次出现以来&#xff0c;无论是双十一购物还是 12306 抢票&#xff0c;秒杀场景已随处可见。简单来说&#xff0c;秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。 从架构视角来看&#xff0c;秒杀系统本质是一个高性能、高一…

Java调用C++/C

Java调用C/C有3中方式&#xff1a;JNI、JNA、JNative。 注&#xff1a;1、个人觉得还是JNA的方式最好。 2、Java和C/C交互的难点在于数据结构的对应 3、java不可以直接调用C#代码&#xff0c;C#代码需要托管 JNI &#xff08;Android调用&#xff0c;普通java类似&#xff09;…

kubernetes 静态存储与动态存储

静态存储 Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来&#xff0c;并且对其进一步细化。Kubernetes 将 Volume 分为持久化的 PersistentVolume 和非持久化的普通 Volume 两类。为了不与前面定义的 Volume 这个概念产生混淆&#xff0c;后面特指 Kubernetes …

Java多线程整理

目录 1. 进程与线程 1.1 进程 1.2 线程 1.3 并发与并行 2. 多线程 2.1 多线程的概念 2.2 多线程的好处 2.3 主线程 3. 线程的创建与启动 3.1 继承Thread类 3.2 实现Runnable接口 3.3 实现Callable接口 3.4 run方法调用和start调用的区别 4.线程的状态 4.1 线程状…

th和td标签的区别

th和td标签的区别 开发工具与关键技术&#xff1a; Dw HTML 作者&#xff1a;邹贺汗 撰写时间&#xff1a;2019年2月4日 在写这篇文章的时候我就知道虽然我发的不是第一个&#xff0c;但是说不定我写刚好给有需要的人看到了呢&#xff0c;所以我就写了这篇文章&#xff0c;下面…

html中th标签添加方法,HTML th 标签

HTML 标签 标签表示HTML表格的表头部分&#xff0c;该标签中的内容会以粗体显示&#xff0c;请参考下述示例&#xff1a; 实例 一个简单的 HTML 表格&#xff0c;带有两个表头单元格和两个数据单元格&#xff1a; MonthSavingsJanuary$100 尝试一下 (更多实例见页面底部) 浏览…

thymeleaf标签之th:href的使用

项目中使用springboot来进行开发&#xff0c;自然也就接触到了thymeleaf这套模板&#xff0c;如果你对c标签很熟悉的话&#xff0c;我觉得上手这个应该是很快的。 介绍下th:href在项目中的使用。 它的写法与th:src一样 一般写法为th:href"{值}" 如果是需要从model…

使用thymeleaf时,th:类标签失效的原因

问题出现&#xff1a; 最近学习后端&#xff0c;学到了thymeleaf这一块&#xff0c;学习中出现了一个问题我没有注意到&#xff0c;导致后面页面编写出现重大bug&#xff1a;项目中我使用了thymeleaf&#xff0c;配置的映射路由为&#xff1a;/index&#xff0c;访问首页的时候…

HTML——表头标签th的属性

<th>标签的属性和<td>标签的属性及语法格式非常的相似&#xff0c;用于设定表格中某一表头的属性。 <th>标签中常用的属性 标签描述align设置单元格内容的水平对齐方式valign设置单元格内容的垂直对齐方式bgcolor设置单元格的背景颜色background设置单元格的…

标签thead与th的区别

标签thead与th的区别 如图所示&#xff0c;thead 和 tbody标签在tr外层&#xff0c;具有更好的语义化&#xff0c;而th在 tr 之内&#xff0c;与td同级&#xff0c;起到文字加粗的效果

html中table标签、tr标签、th标签、td标签的基础知识

html中table标签、tr标签、th标签、td标签的基础知识 表格的结构表格的基本标签表格标签的基本属性table标签的基本属性tr标签的基本属性th和td标签的基本属性 表格高级样式设置相关概念外边框线样式属性frame内部边框样式属性rules 单元格合并水平方向单元格的合并垂直方向单元…

4、HTML——表格标签、表单标签

目录 一、表格标签&#xff1a;table—tr—td/th 1、合并单元格 1.1 合并同行不同列的单元格&#xff08;列合并&#xff09; 1.2 合并同列不同行的单元格&#xff08;行合并&#xff09; 二、表单标签&#xff1a;form 1、form标签 2、input输入标签 2.1 type属性…

html中的tr,td,th标签

tr是 table row 表格的行 HTML中 标签定义 HTML 表格中的行。tr 元素包含一个或多个 th 或 td 元素。 td是table data(表格数据) HTML中 标签定义 HTML 表格中的标准单元格。 元素中的文本通常是普通的左对齐文本。 th是table heading表格标题 &#xff0c;一般表格第一行的数…

javascript网页二次元3D小人详细教程

一.科班直接复制以下代码到vscode打开网页即可(小白请往下看教程) 二.小白详细教程(没有代码编译软件一样能做出来看到效果) 三.视频展示 一.科班直接复制以下代码到vscode打开网页即可(小白请往下看教程) javascript网页二次元小人(眼睛跟随鼠标移动) <!DOCTYPE html>…

web期末作业网页设计——JavaScript

目录 一.作品简介 二.网页效果 首页 花语 登录界面 注册界面 三.网页代码 首页 登录界面 注册界面 视频界面 一.作品简介 网站系统文件种类包含&#xff1a;html网页结构文件、css网页样式文件、js网页特效文件、images网页图片文件。 网页作品代码简单&#xff…

HTML+CSS+JavaScript网页特效源代码(复制代码保存即可使用)

以下下代码直接复制保存即可使用 特效一特效二特效三特效四特效五特效六特效七 特效一 方块运动演示 <html><head> <meta charset"utf-8"> <title>蓝盒子</title> <style>body { margin: 0; padding: 0;background: black…

JavaScript实现网页关灯效果

JavaScript实现网页关灯效果 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果 JavaScript实现一段时间之后关闭广告 JavaScript实现按键快速获取输入框…