Spring之配置文件

2023-05-16

Spring简介

Spring是什么

  • Spring 自带 IoC(Inverse of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持RESTful Java 应用程序的开发。
  • Spring 最核心的思想就是不重新造轮子,开箱即用!
  • Spring 提供的核心功能主要是 IoC 和 AOP。学习 Spring ,一定要把 IoC 和 AOP 的核心思想搞懂!

Spring优势

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

Spring的体系结构

下图对应的是 Spring4.x 版本。目前最新的 5.x 版本中 Web 模块的 Portlet 组件已经被废弃掉,同时增加了用于异步响应式处理的 WebFlux 组件。
在这里插入图片描述
Spring Core
核心模块, Spring 其他所有的功能基本都需要依赖于该类库,主要提供 IoC 依赖注入功能的支持。

Spring Aspects
该模块为与 AspectJ 的集成提供支持。

Spring AOP
提供了面向切面的编程实现。

Spring Data Access/Integration :
Spring Data Access/Integration 由 5 个模块组成:

spring-jdbc : 提供了对数据库访问的抽象 JDBC。不同的数据库都有自己独立的 API 用于操作数据库,而 Java 程序只需要和 JDBC API 交互,这样就屏蔽了数据库的影响。
spring-tx : 提供对事务的支持。
spring-orm : 提供对 Hibernate 等 ORM 框架的支持。
spring-oxm : 提供对 Castor 等 OXM 框架的支持。
spring-jms : Java 消息服务。
Spring Web

Spring Web 由 4 个模块组成

spring-web :对 Web 功能的实现提供一些最基础的支持。
spring-webmvc : 提供对 Spring MVC 的实现。
spring-websocket : 提供了对 WebSocket 的支持,WebSocket 可以让客户端和服务端进行双向通信。
spring-webflux :提供对 WebFlux 的支持。WebFlux 是 Spring Framework 5.0 中引入的新的响应式框架。与 Spring MVC 不同,它不需要 Servlet API,是完全异步.
Spring Test

Spring 团队提倡测试驱动开发(TDD)。有了控制反转 (IoC)的帮助,单元测试和集成测试变得更简单。

Spring 的测试模块对 JUnit(单元测试框架)、TestNG(类似 JUnit)、Mockito(主要用来 Mock 对象)、PowerMock(解决 Mockito 的问题比如无法模拟 final, static, private 方法)等等常用的测试框架支持的都比较好。

Spring快速入门

Spring程序开发步骤

在这里插入图片描述

  • 导入 Spring 开发的基本包坐标,我们基于mevan开发所以需要导入meaven对应的jar/war包。
  • 因为我们需要获得UserDao对象,所以我们需要编写 Dao 接口和实现类。
  • 创建 Spring 核心配置文件。
  • 在 Spring 配置文件中配置 UserDaoImp。配置id标识及其对应的类路径。
  • 使用 Spring 的 API 获得 Bean 实例,通过id标识去获得对象而不是自己去创建一个对象。

导入Spring开发的基本包坐标

在这里插入图片描述
pom文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Spring</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.18</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

编写Dao接口和实现类

接口类

package com.peihj.dao;

public interface Usedao {
    public void save();
}

接口方法复写实现

package com.peihj.dao.impl;

import com.peihj.dao.Usedao;
import com.peihj.domain.User;

import java.util.List;
import java.util.Map;
import java.util.Properties;

public class UseDaoimpl implements Usedao {

    public UseDaoimpl() {
        System.out.println("UseDaoimpl_创建");
    }
    
    @Override
    public void save() {
        System.out.println(username+"的年龄是:"+age);
        System.out.println("save running......");
    }
}

创建Spring核心配置文件

在类路径下(resources)创建applicationContext.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">

</beans>

在Spring配置文件中配置UserDaoImpl

id是唯一标识,不可以重复

<?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="userDao" class="com.peihj.dao.impl.UseDaoimpl" ></bean>
</beans>

使用Spring的API获得Bean实例

package com.peihj.test;

import com.peihj.dao.Usedao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Springtest {
    @Test
    public void test(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        Usedao userDao1 = (Usedao) app.getBean("userDao");

        System.out.println(userDao1);

        userDao1.save();

    }

}

Spring配置文件

Bean标签基本配置

在这里插入图片描述

Bean标签范围配置

在这里插入图片描述
在这里插入图片描述
测试脚本如下:

package com.peihj.test;

import com.peihj.dao.Usedao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Springtest {
    @Test
    //测试scope属性
    public void test(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        Usedao userDao1 = (Usedao) app.getBean("userDao");
        Usedao userDao2 = (Usedao) app.getBean("userDao");

        System.out.println(userDao1);
        System.out.println(userDao2);
//        userDao1.save();

    }

}

测试singleton:
在这里插入图片描述
通过观察结果我们可以发现,结果的地址是没变的,即说明在Spring容器中的bean存在一个,
测试prototype:
在这里插入图片描述
地址不一样代表容器中的userdao不是一个,即有多个bean

bean生命周期配置

在这里插入图片描述
我们需要提前在dao包下的userdaoimpl,写init初始化方法与destory方法
在这里插入图片描述
然后我们进入applicationContext.xml(main包下的resource中Spring配置文件)

<bean id="userDao" class="com.peihj.dao.impl.UseDaoimpl" init-method="init" destroy-method="destory"></bean>

Bean实例化三种方式

在这里插入图片描述

在这里插入图片描述
singleton:无参构造器执行一次的时候应该是加载配置文件,创建Spring容器时候,就创建了。

prototype:每次getbean的时候创建一个。

在这里插入图片描述
因为这个是静态方法,所以xml配置文件直接调用即可

  1. 顾名思义,我们必须要有工厂,然后工厂还要有静态方法,因为类型是UserDao,所以我们需要返回一个对象;
  2. 第二部需要进入配置文件,配置id和class,这里是找工厂的无参构造器,显然不对,所以我们需要将其在添加一个factory-method,指定方法,通过静态工厂找到dao下面的UserDaoImpl实现类,从而达到对象的创建。

在这里插入图片描述
因为这个是动态方法,所以xml配置文件无法对其进行直接调用,需要先有工厂对象然后再调用方法,所以Spring对象先通过无参构造创建一个工厂对象,但是我们的目的不是为了创建工厂,我们需要在创建一个userdao对象,通过工厂的方法指向factorybean,然后获得对象

Bean的依赖注入入门

创建 UserService,UserService 内部在调用 UserDao的save() 方法

在这里插入图片描述

将 UserServiceImpl 的创建权交给 Spring

在这里插入图片描述

从 Spring 容器中获得 UserService 进行操作

在这里插入图片描述

Bean的依赖注入分析

因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在
Spring容器中,将UserDao设置到UserService内部。
在这里插入图片描述

Bean的依赖注入概念

依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。

在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。

IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

Bean的依赖注入方式

怎么将UserDao怎样注入到UserService内部呢?
在这里插入图片描述
set方法注入
在UserServiceImpl中添加setUserDao方法,我们不需要再去容器中获取userdao的值,因为容器已经将userdao通过set方法注入给我们了。所以userdao是有值的,我们可以通过容器中的userdao去调用save方法。
在这里插入图片描述
配置Spring容器调用set方法进行注入
在这里插入图片描述

简单注入方式:p命名空间注入:

P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:
首先,需要引入P命名空间:
在这里插入图片描述
其次,需要修改注入方式:
在这里插入图片描述
构造方法注入,创建有参构造:
在这里插入图片描述
构造方法注入,配置Spring容器调用有参构造时进行注入:
在这里插入图片描述

Bean的依赖注入的数据类型

上面的操作,都是注入的引用Bean,处了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。
在这里插入图片描述
其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入

普通数据类型的注入

在这里插入图片描述
普通数据类型的注入之Spring配置文件xml如何配置
在这里插入图片描述

集合数据类型(List)的注入

在这里插入图片描述集合数据类型(List)的注入之Spring中xml文件如何配置
在这里插入图片描述
集合数据类型(List)的注入
在这里插入图片描述
集合数据类型(List)的注入之配置文件的XML配置
在这里插入图片描述

集合数据类型( Map<String,User> )的注入

在这里插入图片描述
XML文件配置
在这里插入图片描述

集合数据类型(Properties)的注入

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

引入其他配置文件(分模块开发)

实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载
在这里插入图片描述

小结

Spring的重点配置:
在这里插入图片描述

Spring相关API

ApplicationContext的继承体系

applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象
在这里插入图片描述

ApplicationContext的实现类

在这里插入图片描述

getBean()方法使用

在这里插入图片描述
其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错。

在这里插入图片描述

小结

在这里插入图片描述

参考

https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=20&t=1.2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring之配置文件 的相关文章

随机推荐

  • python获取文件路径、文件夹内所有文件

    python获取文件路径 文件夹内所有文件名字 项目内相对路径 在test12 py内 想获取其所在文件夹的所有的表格文件 windows 第一种方案 34 34 34 获取路径 34 34 34 def list dir file dir
  • MySQL-常用内置函数(字符串、数值、日期、流程)

    字符串函数 xff1a 函数作用CONCAT str1 str2 拼接字符串 xff0c 返回拼接后的字符串LENGTH str 返回字符串字节长度 xff0c 注意是字节 xff0c 中文占3个LEFT str len 返回从最左边截取到
  • MySQL-基础语法DDL、DML、DQL、DCL

    DDL xff1a DDL Data Definition Language 数据库定义语言用来定义数据库对象 xff1a 数据库 xff0c 表 xff0c 列等 关键字 xff1a create drop alter 等 语法 DML语
  • VMware安装虚拟机Mac版

    VMware xff1a 1 不需要分区或重开机就能再同一台PC上使用多种操作系统 2 完全隔离并且保护不同操作系统的环境以及所有软件 资料 3 不同的操作系统之间还能互动操作 4 有复原功能 5 能够设置并且随时修改操作系统的操作环境 下
  • JSON转换工具

    JSON的处理 xff1a JSON JavaScript Object Notation xff1a 是一种轻量级的数据交换格式 它是基于 ECMAScript 规范的一个子集 xff0c 采用完全独立于编程语言的文本格式来存储和表示数据
  • MacOS Apple M1 安装ARM架构的JDK及动态切换版本

    JDK下载安装 xff1a 咱就是说 xff0c ARM版本的JDK就是一个字 xff0c 真特么快 xff0c 想变快吗 xff0c 赶紧下载叭 xff01 xff01 1 下载地址 xff1a https www azul com do
  • Go_详解TCP协议三次握手四次挥手

    三次握手 xff1a 三次握手表示建立通信阶段 xff0c 在TCP协议中 xff0c 在发送数据的准备阶段 xff0c 客户端与服务器之间的三次交互 xff0c 以保证连接的可靠 xff0c 由于这种面向连接的特性 xff0c TCP协议
  • Go_常量、iota(枚举)的使用

    常量 常量是在程序运行过程中 xff0c 其值不可以发生改变的数据 xff0c 常量无法被获取地址 常量中的数据类型能是布尔型 数字型 xff08 整型 浮点型和复数型 xff09 字符串 常量的定义是通过const关键字完成的 xff0c
  • Go_反射的使用

    反射可以在运行时动态地检查变量和类型 xff0c 并且可以调用变量和类型的方法 获取和修改变量的值和类型等 使用反射可以使程序更加灵活 xff0c 但也需要谨慎使用 基于反射的代码是极其脆弱的 xff0c 反射中的类型错误会在真正运行的时候
  • 登录注册页怎么做

    app常见页面 xff1a 引导页 xff1a 概念 xff1a 第一次安装App或者更新App后第一次打开App时所展示的可以滑动的页面 作用 xff1a 主要是用于展示产品本身的一些核心功能点或者特色 启动页 xff1a 概念 xff1
  • win10安装appx工具_如何在Windows 10上安装.Appx或.AppxBundle软件

    win10安装appx工具 Microsoft s new Universal Windows Platform applications use the Appx or AppxBundle file format They re nor
  • 本地mysql数据库开启远程访问

    本地mysql数据库开启远程访问 1 开启远程访问端口 3306端口 依次点击控制面板 系统和安全 windows防火墙 高级设置 入站规则 xff1b 设置端口为3306 一直点下一步 xff1b PS xff1a 入站 xff1a 别人
  • Go_String常用操作

    字符串操作 xff1a len xff1a 统计字符串的长度 span class token keyword func span span class token function main span span class token p
  • Arrarys常用的方法

    int newArrary 61 Arrays copyOf int original int newarrary length 拷贝数组 xff0c 可定义要拷贝的长度 Array copyOf 有进行复制的功能 xff0c 而且底层是调
  • Unity2019 打包Android报错 Android NDK not found

    打包报错 xff1a UnityException Android NDK not found Android NDK not found or invalid NDK配置报错 xff1a Edit gt Preferences gt Ex
  • 安装zabbix proxy

    Centos7搭建zabbix proxy5 0 概述安装创建数据库导入数据下载包安装 编译过程中的报错 概述 Zabbix 代理可以代表 Zabbix 服务器收集性能和可用性数据 这样 xff0c 代理可以自己承担一些收集数据的负载并卸载
  • Mac localhost无法访问

    Mac localhost无法访问 localhost 8080和127 0 0 1 8080可以访问nginx的文件 xff0c 但输入localhost和127 0 0 1都打不开了
  • 生产者与消费者问题(线程同步经典案例)

    生产者 xff08 producer xff09 和消费者 xff08 consumer xff09 问题是并发处理中最常见的一类问题 xff0c 是一个多线程同步问题的经典案例 可以这样描述这个问题 xff0c 有一个或者多个生产者产生某
  • Git忽略提交规则 & .gitignore配置总结

    Git忽略提交规则 xff06 gitignore配置总结 在使用Git的过程中 xff0c 我们喜欢有的文件比如日志 xff0c 临时文件 xff0c 编译的中间文件等不要提交到代码仓库 xff0c 这时就要设置相应的忽略规则 xff0c
  • Spring之配置文件

    Spring简介 Spring是什么 Spring 自带 IoC xff08 Inverse of Control 控制反转 xff09 和 AOP Aspect Oriented Programming 面向切面编程 可以很方便地对数据库