Java之Spring

article/2025/10/2 1:38:46

目录

  • 创建spring项目
  • 存储bean对象到容器(spring)中
  • 从spring中将bean取出
  • 更简单的读取存储对象
    • 存储bean对象
      • 前置准备
      • 添加注解存储 Bean 对象
    • 获取bean对象
  • bean作用域和生命周期
    • 定义
    • bean的6种作用域
    • bean生命周期

IOC优点:实现代码的解耦,对象(Bean)生命周期交给Ioc框架维护,作为程序员无需在关注了。
spring Ioc容器的最核心的功能:
(1)将Bean(对象)存储到spring(容器)中
(2)将Bean(对象)从spring(容器)中取出来

DI【依赖注入】和Ioc【控制反转】的区别
(1)Ioc是一种思想,而DI是一种实现
比如:想去吃饭,就是思想,而去吃了海底捞就是实现。

创建spring项目

(1)先创建一个maven项目
在这里插入图片描述
在这里插入图片描述

(2)添加spring框架支持(spring-context / spring-beans)
在pom.xml中添加如下代码

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency>
</dependencies>

设置国内源:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果此目录下没有相应的settings.xml文件,把相应的文件拷贝进来。

(3)创建一个启动类并添加main
在这里插入图片描述
创建一个类。类名可以任意取。
在这里插入图片描述

执行结果:
在这里插入图片描述

存储bean对象到容器(spring)中

(1)先在spring项目中添加配置文件,如果不是第一次配置,则此步骤可以省略。
在这里插入图片描述

<?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"></beans>

将上述代码片段放置到创建的xml中【配置文件的名字可以任意取,此处取的是spring-config.xml】

(2)创建bean对象
在Java中就是普通的对象。
创建一个User对象

package com.beans;public class User {public void sayHi(String name) {System.out.println("你好:"+name);}
}

(3)在配置文件中将需要保持到spring中的对象进行注册。
将bean通过配置文件注册到spring中。
在这里插入图片描述

从spring中将bean取出

(1)先得到spring上下文对象

 // 1. 得到spring上下文对象ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");

在这里插入图片描述

(2)通过上下文对象提供的getBean方法获取自己需要使用的bean对象

//2. 根据上下文对象提供的方法获取到beanUser user=(User) context.getBean("user");

在这里插入图片描述

(3)使用bean对象【可选步骤】

//3.使用beanuser.sayHi("李四");

除了 ApplicationContext 之外,我们还可以使⽤ BeanFactory 来作为 Spring 的上下⽂。

//另一种方法//1.得到bean工厂BeanFactory factory=new XmlBeanFactory(new ClassPathResource("spring-config.xml"));// 2. 获取beanUser user=(User) factory.getBean("user");//3.使用beanuser.sayHi("张三");

ApplicationContext和 BeanFactory的区别?
相同点:都可以实现从容器中获取bean,都提供了getBean的方法。
不同点:

  1. ApplicationContext属于BeanFactory的子类。BeanFactory只是提供了基础访问bean的方法,而 ApplicationContext除了拥有BeanFactory所有功能之外,还提供了更多的方法实现,比如对国际化的支持。
  2. 从性能方面来说二者是不同的,BeanFactory是按需加载bean,ApplicationContext是饿汉方式,在创建时会将所有的bean都加载起来,以备以后使用。

getBean的更多用法:
(1)使用bean name获取bean

User user=(User) context.getBean("user");

(2)根据bean type 获取bean

User user= context.getBean(User.class);

此方法写法简单,但容易出问题。当同一个类型被注入到spring中多次的时候,就会报错。

(3)根据bean name和类型获取bean

 User user=context.getBean("user",User.class);

更简单的读取存储对象

在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解。

存储bean对象

前置准备

在spring配置文件中设置bean扫描根路径
在resource下创建spring-config.xml,将下述代码写入spring-config.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"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package=""></content:component-scan>
</beans>

在这里插入图片描述

添加注解存储 Bean 对象

想要将对象存储在 Spring 中,有两种注解类型可以实现:

  1. 类注解:@Controller【控制器】、@Service【服务】、@Repository【仓库】、@Component【组件】、@Configuration【配置】。

为什么需要5大类注解?
让代码的可读性提高,让程序员能够直观的判断当前类的用途。
在这里插入图片描述
5大类注解之间有何关系
@Controller【控制器】、@Service【服务】、@Repository【仓库】、@Configuration都是基于@Component【组件】实现的,所以@Component【组件】可以认为是其他4个注解的父类。
在这里插入图片描述

关于bean name的规则:
如果类名是大驼峰,则bean name使用小驼峰,如果类名的第一个和第二个字母是大写的,则bean name是原类名。

  1. ⽅法注解:@Bean
    在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中
    在这里插入图片描述
@Component
public class UserBeans {@Bean//注:只使用一个bean注解是无法将对象存储到容器中public User user1(){User user=new User();user.setId(1);user.setName("张丹");return user;}}

bean命名规则:当没有设置name属性时,那么bean默认的名称就是方法名,当设置了那么属性后,只能通过重命名的name属性对应的值类获取,也就是说重命名之后,在使用方法名就获取不到bean对象。

获取bean对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。
对象装配(对象注⼊)的实现⽅法以下 3 种:

  1. 属性注⼊
@Controller
public class UserController2 {//对象注入方式1: 属性注入@Autowiredprivate UserService userService;public void sayHi() {userService.sayHi();}}
//属性注入UserController2 userController2=context.getBean(UserController2.class);userController2.sayHi();
  1. 构造⽅法注⼊
//使用构造方式实现bean注入(官方推荐)
@Controller
public class UserController3 {private  UserService userService;@Autowiredpublic UserController3(UserService userService) {this.userService=userService;}public  void sayHi(){userService.sayHi();}
}
//构造方法注入UserController3 userController3=context.getBean(UserController3.class);userController3.sayHi();
  1. Setter 注⼊
@Controller
public class UserController4 {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public  void sayHi() {userService.sayHi();}}
//setter注入UserController4 userController4=context.getBean(UserController4.class);userController4.sayHi();

属性注入、构造方法注入、setter注入的区别是什么?

  1. 属性注入特点:写法简单,但是通用性不好,它只能运行在Ioc容器下,如果是非Ioc容器就会出现问题。
  2. setter注入:早期spring版本推荐的写法。setter注入通用性没有构造方法注入通用。
  3. 构造方法注入:通用性更好。它能确保在使用注入对象之前,此注入对象一定初始化过了。当构造方法注入参数过多时,此时开发者就要检查自己写的代码是否符合单一设计原则的规范了,此注入 方式也是spring后期版本中推荐的注入方式。

另一种注入注解:@Resource
注:@Resource支持属性注入和setter注入,但不支持构造方法注入。

@Resource 和 @Autowired的区别?
都可以实现将对象注入到当前类当中。

  1. @Resource来自于JDK, @Autowired是spring框架提供的。
  2. 用法不同: @Autowired支持属性注入、构造方法注入和setter注入,而@Resource不支持构造方法注入。
  3. 支持的参数不同: @Resource支持更多的参数设置,比如name、type,而@Autowired只支持一种。

bean作用域和生命周期

定义

bean的作用域:bean在spring整个框架中的某种行为。

bean的6种作用域

  1. singleton:单例模式(默认)
  2. prototype:原型模式(多例模式)
  3. request:请求模式(适用于spring MVC)
  4. session:会话作用域(spring MVC)【一个会话共享一个对象】
  5. application:全局作用域(spring MVC)
  6. websocket:HTTP WebSocket作用域(spring WebSocket)

bean生命周期

  1. 实例化bean(为bean分配内存空间)
  2. 设置属性(对象注入)
  3. 初始化
    (1)执行各种通知
    (2)执行初始化前置方法
    (3)执行构造方法,有两种方式,一是执行@PostConstruct,另一种是init-method
    (4)执行初始化的后置方法
  4. 使用bean
  5. 销毁bean
    (1)@PreDestroy
    (2)重写DisposableBean接口方法
    (3)destroy-method

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

相关文章

Spring官方文档(中文版!!!)

https://docs.spring.io/spring/docs/5.2.5.BUILD-SNAPSHOT/spring-framework-reference/images/prototype.png本文档是对spring官方文档的解读&#xff0c;原文档参见Spring官方文档 &#xff0c;本人只是翻译和整理&#xff0c;由于水平有限&#xff0c;部分解读可能不正确&…

Spring入门第一讲——Spring框架的快速入门

Spring的概述 什么是Spring&#xff1f; 我们可以从度娘上看到这样有关Spring的介绍&#xff1a; 说得更加详细一点&#xff0c;Spring是一个开源框架&#xff0c;Spring是于2003年兴起的一个轻量级的Java开发框架&#xff0c;由Rod Johnson在其著作Expert One-On-One J2EE …

是Spring啊!

一.概念 spring概念 一个包含了众多工具方法的 IoC 容器 okk~~分析一下这句话意思,众多方法,IoC 是形容词,容器是名词 -> 众多方法:比如一个类里有许多方法, 容器:存储的东西 重点就是IoC是什么? Ioc 2.1解释 IoC -> Inversion of Control 控制反转 -> 对象的生命周…

Spring 是什么

Spring 是什么 Spring 是一个开源框架. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是一个 IOC(DI) 和 AOP 容器框架 具体描述 Spring: 轻量级&#xff1a;Spring 是非侵入性的 - 基于 Spring 开发的应…

如何理解Spring?

Spring 是包含了众多⼯具⽅法的 IoC 容器。 那何为容器呢&#xff1f;容器是用来容纳某种东西的装置。比如&#xff1a;List/Map 是数据存储容器&#xff0c;Tomcat 是Web 容器等等。Spring 也是⼀个容器&#xff0c;是⼀个 IoC 容器。 那何为IoC 呢&#xff1f;IoC Inversi…

【spring】spring是什么?详解它的特点与模块

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、spring介绍 二、spring的特点&#xff08;七点&#xff09; 1、简化开发 2、AOP的支持 3、声明式事务的支持 4、方便测试 5、…

Spring - 什么是spring?

好久没更新博客了&#xff0c;今天小更一波。 学习java已经有一段时间了&#xff0c;今天将接触Spring框架技术。 什么是Spring? spring 中文意思就是 春天&#xff0c;实际上spring 是真的给软件行业带来了春天。 使用spring的好处&#xff1f; spring可以解决企业级开发…

Spring和Spring Boot区别

spring和spring boot区别 二者主要区别是&#xff1a; 1、Spring Boot提供极其快速和简化的操作&#xff0c;让 Spring 开发者快速上手。 2、Spring Boot提供了 Spring 运行的默认配置。 3、Spring Boot为通用 Spring项目提供了很多非功能性特性。 一、Spring Boot和Sprin…

作为一个程序员,读不懂Spring就像读不懂对象的心?

???连读同事写的代码都费劲&#xff0c;还读Spring&#xff1f; 咋的&#xff0c;Spring 很难读&#xff01; 这个与我们码农朝夕相处的 Spring&#xff0c;就像睡在你身边的媳妇&#xff0c;你知道找她要吃、要喝、要零花钱、要买皮肤。但你不知道她的仓库共有多少存粮、也…

【Spring源码这样读】-怎么阅读源码

做开发要不要读源码&#xff1f;如果你天天996&#xff0c;真心的不建议你去读源码&#xff08;我是不介意做一个劝退师的&#xff09;。读源码确确实实是一个费时费力的活&#xff0c;如果你每天都很忙&#xff0c;偶尔看一眼&#xff0c;想了解其中的奥秘&#xff0c;这很难办…

CRUD搬砖两三年了,怎么阅读Spring源码?

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f468;‍&#x1f4bb;连读同事写的代码都费劲&#xff0c;还读Spring&#xff1f; 咋的&#xff0c;Spring 很难读&…

一、如何阅读Spring源码(全网最简单的方法)

学习Java最好最有效的方法是学习Spring&#xff0c;但是最笨最没效的方法也是学习Spring。 为什么这么说呢&#xff1f;道理其实很简单 A、Spring很庞大&#xff0c;很完善&#xff0c;也非常的底层&#xff0c;如果我们学会的Spring&#xff0c;那么也就掌握了很多的技术的核心…

【Spring】——Spring简单 读和取

前言 ❤️❤️❤️Spring专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring_冷兮雪的博客-CSDN博客 上期我们讲解了Spring的创建与使用&#xff0c;发现 将Bean 注册到容器 这一步中&#xff0c;如果Bean对象…

读取Spring配置文件的方法(Spring读取资源文件)

大厂必备&#xff01;读取spring配置文件的两种方法,需要的朋友可以参考下。 第一种&#xff1a; 1.spring配置文件 2.读取属性方法 第二种&#xff1a; 直接读取方式: 通过spring配置方式读取&#xff1a; spring bean配置: // 编辑不易&#xff0c;spring框架系列的快要更…

php如何将时间戳,PHP如何将时间戳转换日期

PHP如何将时间戳转换日期 在php中可以使用“date()”函数将时间戳转换日期&#xff0c;该函数用于格式化一个本地时间日期&#xff0c;其语法是“date($format,$timestamp)”&#xff0c;其参数format表示日期格式&#xff0c;参数timestamp表示要格式化的时间戳。 代码实例&am…

php 时间戳 24小时制,php如何将时间戳转换成小时制

php将时间戳转换成小时制的方法&#xff1a;【date("Y/m/d H:i:s",1446634507)】。date()函数可以把时间戳格式化为可读性更好的日期和时间。 php将时间戳转换称24小时制 (推荐教程&#xff1a;php视频教程)date("Y/m/d H:i:s",1446634507) //2015/11/04 1…

php时间戳转换日期24,php时间戳怎么转换回日期

在php中&#xff0c;可以使用date()函数来将时间戳转换回日期格式。date()函数可把时间戳格式化为可读性更好的日期和时间格式&#xff0c;语法“date (format,时间戳)”&#xff1b;format参数规定转换后的时间戳格式&#xff0c;例“Y-m-d H:i:s”。 本教程操作环境&#xff…

php里日期转为时间戳_php时间戳与日期的转换

php时间戳与日期的转换 大家也许对PHP时间戳已经有所了解&#xff0c;那么我们如何应用它来获取具体的日期呢&#xff1f;我们今天来为大家介绍一下PHP时间戳获取当前时期的具体方式。 实现功能&#xff1a;获取某个日期的时间戳&#xff0c;或获取某个时间的PHP时间戳。 strto…

html 时间戳转换年月日,时间戳与日期的转换方法

php怎么将指定日期转换为时间戳 date(Y-m-d H:i:s, 1156219870); UNIX时间戳转换为日期用函数: date() 一般形式:date(Y-m-d H:i:s, 1156219870); 日期转换为UNIX时间戳用函数:strtotime() 一般形式:strtotime(2010-03-24 08:15:42); js 中日期 转换成时间戳 例如2013-08-…

常用的计算机C语言,计算机c语言基础知识

计算机c语言基础知识 C语言程序设计是高效计算机专业学生必修的一门基础课程&#xff0c;那么你对计算机c语言了解多少呢?下面是小编整理的计算机c语言基础知识&#xff0c;欢迎大家阅读参考。 计算机c语言的特性 C语言是世界上最流行、使用最广泛的高级程序设计语言之一。在操…