Java阶段二Day15
Java阶段二Day15
文章目录
- Java阶段二Day15
- 复习前日知识点
- 对象数据类型注入
- 数组类型注入
- 集合类型的注入
- p命名空间
- 引入外部属性文件
- 基于XML管理bean
- bean的作用域
- bean的生命周期
- 代码演示生命周期
- 后置处理器处理展示
- 基于XML的自动装配
- 基于注解管理bean
- 开启组件扫描
- 使用注解定义Bean
- 属性值注入
- `@Autowired`注入
- `@Resource`注入
- Spring全注解开发
- 面试题
- 描述一下bean的生命周期
复习前日知识点
对象数据类型注入
-
引用外部bean,利用ref属性完成
<bean> <property name = "xxx" ref = "外部bean的id"/> </bean>
-
使用内部bean
<bean> <property name = "xxx"><bean></bean></property> </bean>
数组类型注入
使用<array>标签
实现
-
数组中存放普通变量
<property name = "xxx"><array><value>yyy</value><value>zzz</value></array> </property>
-
数组中存放对象
<property name = "xxx"><array><ref bean = "外部bean的id"/><ref bean = "外部bean的id"/></array> </property>
集合类型的注入
-
List集合:使用
<list>标签
实现<property name = "xxx"><list><value>zzz</value><ref bean = "外部bean的id"/></list> </property>
-
Map集合:使用
<map>标签
实现<property name = "xxx"><map><entry><key><value>key1</value></key><value>yyy</value></entry><entry><key><value>key2</value></key><ref bean = "外部bean的id"/></entry><entry key="" value=""/></map> </property>
-
引用集合类型bean
-
定义
util
的名称空间xmlns:util="http://www.springframework.org/schema/util"
-
定义相关的
util标签
<util:list id="aaa"><value>yyy</value><value>zzz</value> </util:list><util:map id="bbb"><entry><key><value>key1</value></key><value>yyy</value></entry><entry><key><value>key2</value></key><ref bean = "外部bean的id"/></entry><entry key="" value=""/> </util:map>
-
使用
ref属性
引用<property name = "xxx" ref = "aaa"></property> <property name = "xxx" ref = "bbb"></property>
-
p命名空间
-
定义
p
的名称空间xmlns:p="http://www.springframework.org/schema/p"
-
使用
p
的语法注入<bean id = "xxx" class = "xxx" p:naem = "zzz" p:courseList-ref = "外部id"></bean>
引入外部属性文件
-
定义
context
的名称空间xmlns:context="http://www.springframework.org/schema/context"
-
设置外部文件
xxx.properties
的路径<!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:xxx.properties"></context:property-placeholder>
-
使用
S{变量名}
获取数据并注入<property name="xxx" value="${外部文件中的变量名}"></property>
基于XML管理bean
bean的作用域
-
说明
bean的作用域,是指在交给spring创建bean对象时,可以指定是单实例还是多实例,通过bean标签中的scope属性来指定,默认是单实例。
-
单实例和多实例
-
单实例
单实例(Singleton)是指某个类只能创建唯一的一个实例对象,并且该类提供一个全局的访问点(静态方法)来让外界获取这个实例,常常用在那些只需要一个实例来处理所有任务的场景下,例如配置类或数据库连接池等。
-
多实例
多实例(Multiple Instance)则是指可以在同一个类的定义下,创建多个实例对象。每个对象都是相互独立的,有自己的状态和行为;常常用于需要同时处理多个任务的场景。
-
在Spring中可以通过配置bean标签的scope属性来之地那个bean的作用域范围,具体如下
取值 | 含义 | 创建对象时机 |
---|---|---|
singleton(默认) | 在IoC容器中,这个bean的对象为单实例 | IoC容器初始化时 |
prototype | 这个bean在IoC容器中有多个实例 | 获取bean,即getBEan()时 |
bean的生命周期
-
实例化阶段(bean对象创建)
在这个阶段中,容器会创建一个Bean的实例,并为其分配空间。这个过程可以通过构造方法完成。
-
属性赋值阶段
在实例化完Bean之后,容器会把Bean中的属性值注入到Bean中,这个过程可以通过set方法完成。
-
初始化阶段(bean对象初始化)
在属性注入完成后,容器会对Bean进行一些初始化操作;
- 初始化之前:bean的后置处理器可以接收到bean,此处可以对bean做相关操作。
- 初始化之后:bean的后置处理器可以接收到bean,此处可以对bean做相关操作。
-
使用阶段
初始化完成后,Bean就可以被容器使用了
-
销毁阶段
容器在关闭时会对所有的Bean进行销毁操作,释放资源。
代码演示生命周期
User.java
package com.liner.spring.life;
/**1. 让spring创建bean对象,并继续属性注入2. 演示生命周期2.1 实例化:构造方法打印2.2 属性赋值:set方法打印2.3 初始化:定义初始化方法2.4 使用阶段:getBean() 之后打印测试2.5 销毁:手动关闭loC容器后,打印测试*/
public class User {private String username;public User(){System.out.println("1-bean对象实例化,调用无参构造方法");}//初始化方法public void initMethod(){System.out.println("3-bean对象初始化,调用指定的初始化方法");}//销毁方法public void destoryMethod(){System.out.println("5-销毁bean对象,调用指定的销毁方法");}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +'}';}public String getUsername() {return username;}public void setUsername(String username) {System.out.println("2-通过set方法给bean对象属性赋值");this.username = username;}
}
UserTest.java
package com.liner.spring.life;import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserTest {@Testpublic void test(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-life.xml");User user = context.getBean("user", User.class);System.out.println("使用阶段----4-使用bean阶段");System.out.println("user = " + user);//销毁方法context.close();}
}
bean-life.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"><!-- init-method 初始化方法 destroy-method 销毁方法 --><bean id="user" class="com.liner.spring.life.User" init-method="initMethod" destroy-method="destoryMethod"><property name="username" value="张三"/></bean>
</beans>
演示结果如下
后置处理器处理展示
实现BeanPostProcessor
接口
MyBeanPost.java
package com.liner.spring.life;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPost implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("3之前,初始化之前执行");return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("3之后,初始化之后执行");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}
bean-life.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"><!-- init-method 初始化方法 destroy-method 销毁方法 --><bean id="user" class="com.liner.spring.life.User" init-method="initMethod" destroy-method="destoryMethod"><property name="username" value="张三"/></bean><!-- 将后置处理器操作交给 spring--><bean id="myBeanPost" class="com.liner.spring.life.MyBeanPost"/></beans>
演示结果如下
基于XML的自动装配
自动装配:根据指定的策略,在IoC容器中匹配某一个bean,自动为指定的bean中的所依赖的类类型或者接口类型属性赋值
使用bean标签
的autowire属性
设置自动装配效果
-
byType
:根据类型匹配IoC容器中的某个兼容类型的bean,为属性自动赋值- 如果在IoC中,没有任何一个兼容类型的bean能够为属性赋值,则该属性不装配,默认值为null
- 如果在IoC中,有多个兼容类型的bean能够为属性赋值,则抛出异常
NoUniqueBeanDefinitionException
-
byName
: -
将自动装配的属性名,作为bean的id在IoC容器中匹配相对应的bean进行赋值
基于注解管理bean
从Java5开始,Java增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息。
Spring从2.5版本开始提供了对注解技术的全面支持,我们可以使用注解来实现自动装配,简化Spring的xml配置。
Spring通过注解实现自动装配:
- 引入依赖
- 开启组件扫描
- 使用注解定义Bean
- 依赖注入
开启组件扫描
Spring默认不使用注解装配Bean,因此需要在Spring的xml配置中,通过context:component-scan
元素开启Spring Beans的自动扫描功能。开启此功能后,Spring会自动从扫描指定的包(base-package属性设置)及其子包下的所有类,如果类上使用了@Component
注解,就将该类装配到容器中。
<?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:context="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"><!-- 开启组件扫描 扫描路径当前路径包和其子包--><context:component-scan base-package="com.liner.spring"/></beans>
使用注解定义Bean
Spring提供了以下多个注解,这些注解可以直接标注在java类上,将它们定义成Spring Bean。
注解 | 说明 |
---|---|
@Component | 该注解用于描述Spring中的Bean,它是一个泛化的概念,仅仅标识容器中的一个组件(Bean),并且可以作用在任何层次,例如Service层、Dao层等,使用时只需将该注解标注在相应的类上即可。 |
@Respository | 该注解用于**数据访问层(Dao层)**的类标识为Spring中的Bean,功能与@Component相同。 |
@Service | 该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。 |
注意:以上四种注解本质上都是创建Java bean
对象,而且创建出来的对象没有区别,只是为了开发方便
属性值注入
@Autowired
注入
单独使用@Autowired注解,默认根据类型装配(byType)
@Autowired注解有一个required属性
,默认值是true,表示在注入的时候要求被注入的Bean必须存在,如果不存在则报错。如果required
属性设置为false,表示注入的Bean存在或者不存在都没关系,存在就注入,不存在也不报错。
package com.liner.spring.autowired.controller;import com.liner.spring.autowired.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController {//方式一:属性注入@Autowiredprivate UserService userService;//方式二:set方法注入@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}//方式三:构造方法注入@Autowiredpublic UserController(UserService userService) {this.userService = userService;}//方式四:形参注入 --很少使用public UserController(@Autowired UserService userService) {this.userService = userService;}//方式五:只有一个构造函数,可无注解public UserController(UserService userService) {this.userService = userService;}public void con(){System.out.println("controller正在运行...");userService.serv();}}
注意:@Autowired注解
根据byType
定位,所以如果一个接口有多个实现类时,会报错
可配合@Qualifier注解
一起使用,指定具体的实现类
@Resource
注入
@Resource注解
也可以完成属性注入,它和@Autowired注解
的区别如下:
@Resource注解
是JDK扩展包中的,也就是说属于JDK的一部分。所以该解释是标准注解,更加具有通用性,而@Autowired注解
是Spring框架自己的@Resource注解
默认根据名称装配byName
,未指定name时,使用属性名作为name,通过name找不到的话会自动启动通过类型byType
装配。而@Autowired注解
默认根据类型装配byType
,如果想根据名称匹配,需要配合@Qualifier注解
一起使用@Resource注解
用在属性上、setter方法上@Autowired注解
用在属性上、setter方法上、构造方法上、构造方法参数上
Spring全注解开发
全注解开发就是不再使用spring配置文件了,写一个配置类来代替配置文件,使用@Configuration注解
标记为配置类
SpringConfig.java
package com.liner.spring.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;//声明此类为配置类
@Configuration
//开启组件扫描
@ComponentScan("com.liner.spring")
public class SpringConfig {
}
面试题
描述一下bean的生命周期
- 第一步实例化,spring调用构造方法对bean实例化,分配出空间资源
- 第二步属性值的注入,调用setter方法对属性值进行注入
- 第三步初始化,可以调用指定的初始化方法进行前置操作,比如数据校验
- 第四步使用阶段,正常使用
- 第五步销毁,当应用程序停止时,Bean对象会销毁释放计算机资源,同时调用指定的销毁方法
- 后置处理器在对象初始化之前可拿到当前对象做一些操作处理,在初始化之后也可以做一些处理
相关文章:

Java阶段二Day15
Java阶段二Day15 文章目录 Java阶段二Day15复习前日知识点对象数据类型注入数组类型注入集合类型的注入p命名空间引入外部属性文件 基于XML管理beanbean的作用域bean的生命周期代码演示生命周期后置处理器处理展示基于XML的自动装配 基于注解管理bean开启组件扫描使用注解定义B…...

从月薪3000到月薪20000,自动化测试应该这样学...
绝大多数测试工程师都是从功能测试做起的,工作忙忙碌碌,每天在各种业务需求学习和点点中度过,过了好多年发现自己还只是一个功能测试工程师。 随着移动互联网的发展,从业人员能力的整体进步,软件测试需要具备的能力要…...

Python魔法方法 单例模式
前言 本文介绍一下python中常用的魔法方法以及面向对象中非常重要的单例模式。 魔法方法 python中一切皆对象,因为python是面向对象的编程语言。python给类和对象提供了大量的内置方法,这些内置方法也称魔法方法。这些魔法方法总是在某种条件下自动触…...

计算机网络基础知识(三)—— 什么是OSI七层模型?
文章目录 00 | 🛸发展史🛸01 | 🛸OSI七层参考模型🛸02 | 🛸OSI七层参考模型的信息流向🛸 OSI七层模型是Open Systems Interconnection Reference Model的缩写,是由国际标准化组织(IS…...

Python(符号计算常微分方程)谐振子牛顿运动方程
牛顿运动方程 牛顿运动方程可以写成以下形式 F d p d t m d v d t m d 2 r d t 2 \mathbf{F}\frac{d \mathbf{p}}{d t}m \frac{d \mathbf{v}}{d t}m \frac{d^2 \mathbf{r}}{d t^2} Fdtdpmdtdvmdt2d2r 恒力问题 具有恒定力的问题意味着恒定的加速度。 典型的例子是…...

OpenCL编程指南-1.2OpenCL基本概念
OpenCL概念基础 面向异构平台的应用都必须完成以下步骤: 1)发现构成异构系统的组件。 2)探查这些组件的特征,使软件能够适应不同硬件单元的特定特性。 3)创建将在平台上运行的指令块(内核)。 4)…...

使用 ChatGPT 辅助学习——为自己找一个老师
我们每个人都有许多标签,例如高中生、成绩中等、文科,根据这些标签我和其他拥有相同标签的人分配了相同的教程、班级和老师,这可以带来效率上的提升,因为同一份教程、老师就可以服务几十上百人,而无须为每个人定制&…...

MySQL基础(二十一)用户与权限管理
1. 用户管理 1.1 登录MySQL服务器 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"-h参数后面接主机名或者主机IP,…...

程序员的下一个风口
面对近一年的裁员潮,以及 GPT 出现带来的 AI 颠覆潮流,各种话题出现:「前端已死」、「后端已死」、「Copy/Paste 程序员将被 AI 取代」。程序员行业是否还有发展空间? 这一两年的就业机会是因为经济衰落周期内造成的,不…...

Android 自定义View 之 简易输入框
简易输入框 前言正文① 构造方法② XML样式③ 测量④ 绘制1. 绘制方框2. 绘制文字 ⑤ 输入1. 键盘布局2. 键盘接口3. 键盘弹窗4. 显示键盘5. 相关API 四、使用自定义View五、源码 前言 在日常工作开发中,我们时长会遇到各种各样的需求,不部分需求是可以通…...

SpringMVC的基础知识
创建SpringMVC项目 SpringMVC项目其实和SpingBoot项目差不多,就多引入了一个SpringWeb项目而已拉 可以看这篇博客,创建的就是一个SpringMVC项目--创建项目の博客 SpringMVC是啥 Spring是啥相信大家都了解 啥是MVC呢?MVC是Model View Controller的缩写 我们分开看这三个词Model…...

OpenPCDet系列 | 4.2 DataAugmentor点云数据增强模块解析
文章目录 DataAugmentor模块解析1. gt_sampling2. random_world_flip3. random_world_rotation4. random_world_scaling5. limit_period DataAugmentor模块解析 在pointpillars算法中,具体的数据增强方法配置是在yaml中的DATA_CONFIG.DATA_AUGMENTOR进行配置&#…...

精准测试之过程与实践 | 京东云技术团队
作者:京东工业 宛煜昕 一、怎样的技术 •百度百科: 精准测试是一套计算机测试辅助分析系统。 精准测试的核心组件包含的软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统…...
类ChatGPT逐行代码解读(1/2):从零实现Transformer、ChatGLM-6B
前言 最近一直在做类ChatGPT项目的部署 微调,关注比较多的是两个:一个LLaMA,一个ChatGLM,会发现有不少模型是基于这两个模型去做微调的,说到微调,那具体怎么微调呢,因此又详细了解了一下微调代…...

车道线检测
前言 目前,车道线检测技术已经相当成熟,主要应用在自动驾驶、智能交通等领域。下面列举一些当下最流行的车道线检测方法: 基于图像处理的车道线检测方法。该方法是通过图像处理技术从摄像头传回的图像中提取车道线信息的一种方法,…...

云渲染靠谱吗,使用云渲染会不会被盗作品?
云渲染靠谱吗、安全吗?如果使用 云渲染会不会被盗作品......Renderbus瑞云渲染作为一个正经的云渲染平台,也时不时会收到这类疑问,首先,瑞云渲染是肯定靠谱的,各位可以放心使用。另外小编也将在本篇教你如何辨别云渲染平台是否安全…...

什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C
什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C FPGA基础知识:FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器…...

有什么好用的云渲染?
在CG制作流程中,离线渲染一直是必要且耗时的环节。你的场景越复杂,渲染出现问题的可能性就越大,尤其是当你独自工作,没有人给你建议的时候,灯光、模型、场景任何一个环节渲染时出现问题都可能让你焦头烂额,…...

什么是医学影像PACS系统?PACS系统功能有哪些?作用有哪些?对接哪些设备?业务流程是什么?
一、什么是医学影像PACS系统 PACS:为Picture Archive and CommunicationSystem的缩写,是图象归档和通讯系统。PACS系统应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声…...

分布式缓存:什么是它以及为什么需要它?
前言 随着网络的快速发展,分布式应用变得越来越普遍。这种类型的应用程序需要访问多个组件和服务,而这些组件可能分散在不同的物理位置上。在这种情况下,由于网络通信的高延迟和低带宽,性能问题变得尤为明显。为解决这一问题&…...

MySQL基础(二十二)逻辑架构
1.逻辑架构剖析 1.1 第1层:连接层 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码不对&#…...

《Kubernetes证书篇:使用TLS bootstrapping简化kubelet证书制作》
一、背景 Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。 …...

vue+elementui+nodejs机票航空飞机航班查询与推荐
语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode )本系统主要是为旅客提供更为便利的机票预定方式,同时提高民航的预定机票的工作效率。通过网络平台实现信息化和网络化&am…...

将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器?
我已经将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器? 即使将ssh公钥添加到服务器的授权密钥中,您也可能无法通过SSH登录到服务器,这有几个原因: 1.服务器的authorized_keys文件的权限不正确…...

LeetCode——子串能表示从 1 到 N 数字的二进制串
1016. 子串能表示从 1 到 N 数字的二进制串 - 力扣(Leetcode) 目录 一、题目 二、题目解读 三、代码 一、题目 给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 &…...

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案
接上篇,以短视频优质项目为例,火山引擎DataLeap平台治理团队会去对每天发布的这种挂购物车车短视频打上标签,识别这些短视频它是优质的还是低质的,以及具体原因。一个视频经过这个模型识别之后,会给到奖惩中心去做相应…...

MySQL笔记-多表查询
本文标签 : 多表查询 事务四大特性 并发事务问题 事务隔离级别 文章目录 目录 文章目录 一、多表查询 1.多表关系 2.多表查询概念 3.多表查询的分类 4.内连接 5.外连接 6.自连接 7.联合查询 8.子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 9.多表查询案例练习 二…...

如何用100天时间,让CSDN的粉丝数从0狂飙到10000
2022年10月7日,正式开通了CSDN账号。但因为工作忙的原因,一直没有时间写博客文章,也没有投入精力在CSDN上。理所当然的,我的粉丝数量很稳定,一直保持着0的记录。 2023年春节假期过后,有点空闲时间了&#x…...

各种同质图神经网络模型的理论和节点表征学习任务的集合包rgb_experiment
诸神缄默不语-个人CSDN博文目录 最近更新时间:2023.5.10 最早更新时间:2023.5.10 本文仅考虑同质图setting下的模型。 对于异质图场景,可以参考我写的另一篇博文:异质图神经网络(持续更新ing…) node2ve…...

【C++进阶之路】类和对象(中)
文章目录 前言六大默认成员函数 一.构造函数性质默认构造函数构造函数(需要传参) 二.析构函数性质默认析构函数练习 三.拷贝构造函数基本性质:形参必须是引用默认拷贝构造浅拷贝深拷贝自定义类型 四.赋值运算符重载函数基本特征全局的运算符重载函数局部的运算符重载…...