Java高效率复习-Spring[Spring]

news2024/10/7 8:20:21

前言

Spring的学习还是很简单的,到SpringMVC的时候则会比较复杂了,因为要创建Web项目以及一些Web因素等等。

Spring的简介

在这里插入图片描述
在这里插入图片描述

Spring入门案例

导入依赖

<packaging>jar</packaging>
    <dependencies>
        <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有的jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

在这里插入图片描述
在这里插入图片描述
对象在Spring中被称为Bean,现在先基于XML来管理Bean。
创建Spring的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">
    <bean id="hello" class="com.atguigu.spring.pojo.HelloWorld"/>
</beans>
@Test
    public void testSpring(){
        //获取IOC容器
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        //取出Bean对象实例
        HelloWorld hello = ioc.getBean("hello", HelloWorld.class);
        //调用对象实例方法
        hello.sayHello();
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一种是2个形参,传入了泛型参数,如果不传入就像②所示一样,需要进行强制类型转换,第三种方式是只传入了Bean的实际类型。

IOC容器创建对象的方式

IOC通过底层类型反射来默认使用无参构造器创建的对象,所以POJO对象一定要有无参构造。

获取bean的三种方式和注意事项

@Test
    public void test(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过bean的id获取的对象是Object,需要进行强制类型转换
        //Student studentOne = (Student) ioc.getBean("studentOne");
        //通过类型匹配则一定是获取的对应类型,如果有两个相同类型不同id的bean,则只能id+class来获取
        //Student student = ioc.getBean(Student.class);
        //若没有任何一个类型匹配的bean,则抛出异常:NoSuchBeanDefinitionException
        //若有多个类型匹配的bean,则抛出异常:NoUniqueBeanDefinitionException
        Student student = ioc.getBean("studentOne",Student.class);
        System.out.println(student);
        //在IOC中一个类型的bean配置一次就行了,因为默认是单列的
        //IOC中的bean不能是接口,普遍用法都是id是接口名,class是接口实现类
}

在这里插入图片描述

依赖注入

setter注入是指Spring利用setter方法来将A依赖的B对象赋值。
构造器注入是指Spring利用构造器来注入依赖,在保存到核心容器前,依赖就已经完成了。
在这里插入图片描述
该操作是用于基本类型或其包装类类型的注入,不过依赖注入大部分时候还是应用于实体类依赖的注入。
在这里插入图片描述
构造器注入更符合高内聚的规范。

null值

如果想要给一个属性设置null,是不能直接通过value="null"设置的,因为这样会被当成一个字面量,相当于是一个字符串null。
在这里插入图片描述

使用property的子元素标签null元素来完成赋值
<null />

在这里插入图片描述
value也算是一个元素,不过普遍还是将value作为属性来进行赋值。
在这里插入图片描述

依赖注入为类类型赋值

<bean id = "studentOne" class = "com.atguigu.spring.pojo.Student">
    <property name="class" ref="class"></property>
</bean>
<bean id = "class" class="Class"/>

这些详细的内容,在Spring基础使用的文章有很详细的描述。
级联方式赋值
在这里插入图片描述
该作用并没有什么实际意义,因为只有clazz先初始化才能这样操作,所以相当于覆盖了已经依赖注入好了的clazz的属性值。
内部bean
在这里插入图片描述
为数组类型赋值
在这里插入图片描述
如果数组里是类对象,则用ref即可。
为集合类型的属性赋值
在这里插入图片描述
在这里插入图片描述
map集合赋值
在这里插入图片描述
p命名空间
在这里插入图片描述
如果引用的属性是字面量则直接使用无ref的后缀属性即可。
在这里插入图片描述

Spring管理数据源和引入外部属性文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

bean的作用域

在这里插入图片描述

bean的声明周期

在这里插入图片描述

FactoryBean

在这里插入图片描述
在这里插入图片描述
是否单例是一个默认方法,默认返回true。
在这里插入图片描述
获取时直接传入user的class类型即可。

基于XML的自动装配

比如三层架构,Controller、Service、DAO,它们之间都是依次向下依赖的,控制层有服务层的实例,服务层有DAO的实例,它们在类中是硬编码的形式。
在这里插入图片描述
我们将三个组件交给Spring的IOC容器,添加依赖注入的setter和getter方法:
在这里插入图片描述
在这里插入图片描述
不使用自动装配的依赖注入
在这里插入图片描述
在这里插入图片描述
控制层调用服务层的方法,然后服务层的方法调用DAO层的方法。
所以在运行时只需要调用控制层即可。

基于xml的自动装配之byType

在这里插入图片描述
autowirte表示自动装配属性,no表示不装配,default就表示no,byType表示根据类型自动装配。
在这里插入图片描述
如果类型匹配搜索到两个同样的类型,但是id不同的情况,则编译就会直接报错。
在这里插入图片描述
在这里插入图片描述
一个类型的bean一般在IOC里只设置一次,因为一般都是单例。

基于xml的自动装配之byName

该设置用于处理如果有两个相同但id不同的bean对象时设置。
在这里插入图片描述

基于注解管理bean

在这里插入图片描述
在这里插入图片描述

基于注解管理bean之注解和扫描

在这里插入图片描述
四个注解功能一模一样,名称是给程序员看的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这两个都是接口,要把注解写到实现类上,控制层是一个正常的类。
在这里插入图片描述
完成上面三层架构的创建以及注解的标记后,在spring配置文件中添加扫描设置:

<!-- 扫描组件 context:上下文 component:组件 scan:扫描 base-package:包路径 -->
<!-- 想扫描其他的包可以在后面直接加逗号,不过三层构建都在spring包下,所以直接指定spring包就行了 -->
<context:component-scan base-package="com.atguigu.spring"></context:component-scan>

在这里插入图片描述
下面可以测试一下,不过此时如果有依赖对象,则是没有的,需要用注解的自动装配来标记一下,让Spring去扫描并自动装配依赖关系。

在这里插入图片描述

基于注解管理bean之扫描组件

当Spring和SpringMVC在一起的时候,可能会出现同一个组件扫描了两次的情况,为了避免这种情况,我们可以设置Spring扫描组件的配置:
在这里插入图片描述
排除扫描

 <context:exclude-filter type="" expression=""/><!-- 排除 -->

在type里有这两个比较常用的属性。
在这里插入图片描述
经过如下配置,Spring会排除对全类名所标识的类的扫描:

<context:component-scan base-package="com.atguigu.spring">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!-- 排除 -->
</context:component-scan>

在这里插入图片描述
经过扫描排除后,再次执行,框架会抛出没有找到组件的异常,虽然添加了控制层注解,但是因为排除扫描,所以最终并没有扫描到控制层组件。
在这里插入图片描述
扫描层的排除结果并不会影响其他两个组件的运行。
下面是类类型排除扫描的写法。

<context:exclude-filter type="assignable" expression="com.atguigu.spring.controller.UserController"/>

在这里插入图片描述

其实和注解排除差不多效果(第一个是排除了属于控制层注解的组件,第二个则只是单个类,此处肯定效果差不多,因为只有一个控制层)。这里的type的assignable表示根据类的类型排除,上面是根据注解排除,用的比较多的是第一种,在SSM整合时的场景,SpringMVC扫描控制层,Spring扫描控制层以外的组件。
包含扫描

在这里插入图片描述

<context:component-scan base-package="com.atguigu.spring" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

上面设置表示包含扫描,默认不全部扫描,只扫描include(包含)标签设置的组件。
在这里插入图片描述
因为设置了只扫描Controller组件,所以发生了其他组件的未找到异常。
因为排除本身就只是排除,所以全部扫描的设置是无需必须设置的。
在这里插入图片描述
第一种排除扫描是用的最多的,也是最实用的。
我们一般就是一句:

<context:component-scan base-package="com.atguigu.spring"></context:component-scan>

在这里插入图片描述
扫描全部组件,直接就完事了。

基于注解管理bean之bean的id

扫描组件后,Spring容器为扫描的bean组件自动设置了一个id,注解+扫描得到的bean组件的id默认为类的小驼峰:比如控制层的UserController,那么默认的id就是userController。
在这里插入图片描述
自定义组件id
我们可以看到,不论是哪个注解(上面的四个组件),它们都有一个String value的注解属性。
在这里插入图片描述
这个是让我们用来指定自定义的组件id的,默认是类名的小驼峰,如下程序示例了自定义注解扫描的id。
在这里插入图片描述
在这里插入图片描述
可以看到,我们在对@Controller传入了一个String参数时,原来的类名小驼峰就失效了,此时我们只有传入我们刚刚自定义的String参数才能再次获取到扫描组件实例对象。
在这里插入图片描述
一般获取bean对象都是通过类型获取,id获取比较少,所以一般都是默认id->类名小驼峰。

基于注解的自动装配之@Autowired注解能够标识的地方

前面只是说到了各个组件的bean扫描,还没有提到依赖注入的自动装配,下面通过@Autowired来完成依赖注入,不过先来看看该注解都可以标识在哪些地方。
setter方法上
在这里插入图片描述
成员变量上
在这里插入图片描述
成员变量的有参构造上
在这里插入图片描述
在这里插入图片描述

基于@AutoWirte自动装配的原理

在这里插入图片描述

该注解是指定某个bean的id,将这个bean为属性赋值。
在这里插入图片描述

自动装配@Autowired的注意事项

一般默认的byType就行了,我们根本不会设置两个同样类型的bean并且id还不和属性同名。
所以直接@Autowired就行了。
在这里插入图片描述
必须自动装配

在这里插入图片描述
如果没有bean进行装配就会报错,可以设置为false,那么如果没有可装配就不装配了,值是null。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[ 代码审计篇 ] Fortify 安装及使用详解(一)Fortify 下载安装并设置语言为中文导出中文报告

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

毕业5年,我买房了

持续坚持原创输出&#xff0c;点击蓝字关注我吧 都说人到30就觉得时间过的很快&#xff0c;这句话确实不假&#xff0c;2022年我已经毕业五年&#xff0c;今年下半年也终于在成都高新区购房了&#xff0c;在这里有了自己的家。 购房对于大多数人来说肯定是人生一件大事吧&…

【Maven基础】单一架构案例(三)

第六节 业务功能&#xff1a;登录 1、显示首页 1.1、流程图 1.2、创建 PortalServlet 1.2.1、创建 Java 类 public class PortalServlet extends ViewBaseServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletExceptio…

NetSuite Decode函数

昨天是平安夜&#xff0c;小家伙仍然为圣诞老人的到来准备了礼物&#xff0c;这是他的传统。每年为了感谢圣诞老人和驯鹿的到来&#xff0c;他都会准备上点心、水果。今年&#xff0c;他认为驯鹿可能需要电力&#xff0c;所以准备了电池给它们享用。 真希望天真一直伴随他的成长…

nestjs学习

某种原因开始学习nestjs&#xff0c;想用nestjs做后端&#xff0c;mongodb做数据库来实现一个微信小程序的后台&#xff0c;开始了哼哧哼哧的爬代码之路。 如果想使用自己写的js或ts工具库&#xff0c;需要使用require进行导入&#xff01;&#xff01;否则找不到文件&#xff…

平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等

平衡二叉树的插入&#xff08;在二叉排序树中插入新结点后&#xff0c;如何保持平衡&#xff09;1.平衡二叉树的定义2.平衡二叉树的插入&#xff08;调整最小不平衡子树A&#xff09;2.1LL&#xff08;在A的左孩子的左子树中插入导致不平衡&#xff09;2.2RR&#xff08;在A的右…

qt嵌入并运行外部exe

由于项目需要&#xff0c;要实现将一个外部exe运行在qt的窗口中。下面记录一下过程&#xff1a; 首先就是在qt中创建一个新项目 由于我这里没有用到画布&#xff0c;所以没有勾选Generate form 然后就会自动生成一个可运行的代码 然后将我下边的代码替换粘贴进去 #includ…

RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.5 死信队列

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级7 RabbitMQ 高级特性7.5 死信队列7.5.1 死信队列概述7.5.2 代码实现7.5.3 小结第二天 高级 7 RabbitMQ 高级特性 7.5 死信队列 7.5.1 死信队列概述 死信队列&am…

[LeetCode周赛复盘] 第 325 场周赛20221225

[LeetCode周赛复盘] 第 325 场周赛20221225 一、本周周赛总结二、 [Easy] 6269. 到目标字符串的最短距离1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6270. 每种字符至少取 K 个1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6271. 礼盒的最大甜蜜度1. 题目描述2. 思路分…

<Linux线程同步>——《Linux》

目录 1. Linux线程同步 1.1条件变量 1.2同步概念与竞态条件 1.3条件变量函数 1.4 为什么pthread_ cond_ wait 需要互斥量? 1.5 条件变量使用规范 后记&#xff1a;●由于作者水平有限&#xff0c;文章难免存在谬误之处&#xff0c;敬请读者斧正&#xff0c;俚语成篇&am…

论文阅读技巧

文献阅读思维 为什么你花了大量的时间来看文献却没有收获&#xff1f;那是因为你漫无目的的看文献&#xff0c;能有什么收获&#xff1f;所以我们要带着两个问题有目的的阅读文献。这个目的是什么&#xff1f;就是为了给自己找创新思路。同时在看摘要的时候你问自己第一个问题…

Mac (M1)搭建QGC地面站环境

之前朋友介绍了一个活&#xff0c;刚开始以为是针对树莓派进行二次开发。到了之后才发现&#xff0c;全新的领域&#xff0c;抱着试一试的想法就蛮答应了下来。后来在搭建环境的过程了一路受挫&#xff0c;不过就在写此文前几分钟&#xff0c;终于看到了成功的标志&#xff0c;…

2022年春秋杯网络安全联赛-冬季赛RE部分题解

easy_python python字节码 逻辑整理后就给flag flag [204, 141, 44, 236, 111, 140, 140, 76, 44, 172, 7, 7, 39, 165, 70, 7, 39, 166, 165, 134, 134, 140, 204, 165, 7, 39, 230, 140, 165, 70, 44, 172, 102, 6, 140, 204, 230, 230, 76, 198, 38, 175] for i in rang…

C++进阶(一)C++新特性:智能指针、右值引用、lambda、多线程操作、function和bind、可变模板参数

layout: post title: C进阶&#xff08;一&#xff09;C新特性&#xff1a;智能指针、右值引用、lambda、多线程操作、function和bind、可变模板参数 description: C进阶&#xff08;一&#xff09;C新特性&#xff1a;智能指针、右值引用、lambda、多线程操作、function和bind…

圣诞节来啦,快把这个动态爱心送个那个TA

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

_15LeetCode代码随想录算法训练营第十五天-C++二叉树

_15LeetCode代码随想录算法训练营第十五天-C二叉树 题目列表 110.平衡二叉树257.二叉树的所有路径404.左叶子之和 110.平衡二叉树 题目 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每…

雪花算法和uuid比较

1. 雪花算法 ​ 现在的服务基本是分布式、微服务形式的&#xff0c;而且大数据量也导致分库分表的产生&#xff0c;对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言&#xff0c;一个表中的主键 id 一般使用自增的方式&#xff0c;但是如果进行水平分表之后&…

结构体(10)

目录 1、结构体的声明 1、结构体的声明 2、结构体变量的定义和初始化 2、结构体成员的访问 3、结构体传参 1、结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1、结构体的声明 例如&#xff1a;描述一个学生 注…

KOOM线上APM监控最全剖析

APM&#xff0c;全称是Application Performance Management&#xff0c;也就是应用性能管理&#xff0c;这与我们平时写的业务可能并不相关&#xff0c;但是却承载着App线上稳定的责任。当一款App发布到线上之后&#xff0c;不同的用户有不同场景&#xff0c;一旦App出现了问题…

【云原生系列CKA备考】新建虚拟机安装Ubuntu20.04系统

目录一、环境准备二 、安装虚拟机设置网络其他操作手册&#xff1a;安装 kubeadm 一台兼容的 Linux 主机(或者云主机)。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。 每台机器 2 GB 或更多的 RAM&#xff08;如果…