SSM【Spring SpringMVC Mybatis】—— Spring(一)

news2024/12/27 11:09:52

目录

1、初识Spring

1.1 Spring简介

1.2 搭建Spring框架步骤

1.3 Spring特性

1.5 bean标签详解

2、SpringIOC底层实现

2.1 BeanFactory与ApplicationContexet

2.2 图解IOC类的结构

3、Spring依赖注入数值问题【重点】

3.1 字面量数值

3.2 CDATA区

3.3 外部已声明bean及级联属性赋值

3.4 内部bean

3.5 集合

4、Spring依赖注入方式【基于XML】

4.1 set注入

4.2 构造器注入

4.3 p名称空间注入

5、Spring管理第三方bean

5.1 Spring管理druid步骤

6、Spring中FactoryBean

6.1 Spring中两种bean

6.2 FactoryBean使用步骤


1、初识Spring

1.1 Spring简介

Spring是一个为简化企业级开发而生的开源框架。

Spring是一个IOC(DI)和AOP容器框架。

IOC全称:Inversion of Control【控制反转】

将对象【万物皆对象】控制权交个Spring

DI全称:(Dependency Injection):依赖注入

AOP全称:Aspect-Oriented Programming,面向切面编程

官网:https://spring.io/

1.2 搭建Spring框架步骤

导入jar包


  <!--导入spring-context-->

  <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-context</artifactId>

      <version>5.3.1</version>

  </dependency>

  <!--导入junit4.12-->

  <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.12</version>

      <scope>test</scope>

  </dependency>

编写核心配置文件

配置文件名称:applicationContext.xml【beans.xml或spring.xml】

配置文件路径:src/main/resources

示例代码

   

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

   

        <!-- 将对象装配到IOC容器中-->

        <bean id="stuZhenzhong" class="com.atguigu.spring.pojo.Student">

            <property name="stuId" value="101"></property>

            <property name="stuName" value="zhenzhong"></property>

        </bean>

       

    </beans>

使用核心类库

 

@Test

  public void testSpring(){

          //使用Spring之前

  //        Student student = new Student();



          //使用Spring之后

          //创建容器对象

          ApplicationContext iocObj =

                  new ClassPathXmlApplicationContext("applicationContext.xml");

          //通过容器对象,获取需要对象

          Student stuZhenzhong = (Student)iocObj.getBean("stuZhenzhong");

          System.out.println("stuZhenzhong = " + stuZhenzhong);



      }

1.3 Spring特性

非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API。

容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期。

组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。

一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的JDBCTemplate)。

1.4 Spring中getBean()三种方式

getBean(String beanId):通过beanId获取对象

不足:需要强制类型转换,不灵活

getBean(Class clazz):通过Class方式获取对象

不足:容器中有多个相同类型bean的时候,会报如下错误:

expected single matching bean but found 2: stuZhenzhong,stuZhouxu

getBean(String beanId,Clazz clazz):通过beanId和Class获取对象

推荐使用

注意:框架默认都是通过无参构造器,帮助我们创建对象。

所以:如提供对象的构造器时,一定添加无参构造器

1.5 bean标签详解

属性

id:bean的唯一标识

class:定义bean的类型【class全类名】

子标签

property:为对象中属性赋值【set注入】

name属性:设置属性名称

value属性:设置属性数值

2、SpringIOC底层实现

IOC:将对象的控制器反转给Spring

2.1 BeanFactory与ApplicationContexet

BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,是面向Spring本身的,不是提供给开发人员使用的。

ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。

2.2 图解IOC类的结构

BeanFactory:Spring底层IOC实现【面向Spring框架】

ApplicationContext:面向程序员

ConfigurableApplicationContext:提供关闭或刷新容器对象方法

ClassPathXmlApplicationContext:基于类路径检索xml文件

AnnotationConfigApplicationContext:基于注解创建容器对象

FileSystemXmlApplicationContext:基于文件系统检索xml文件

3、Spring依赖注入数值问题【重点】

3.1 字面量数值

数据类型:基本数据类型及包装类、String

语法:value属性或value标签

3.2 CDATA区

语法:\<![CDATA[]]>

作用:在xml中定义特殊字符时,使用CDATA区

3.3 外部已声明bean及级联属性赋值

语法:ref

注意:级联属性更改数值会影响外部声明bean【ref赋值的是引用】

示例代码

 

 <bean id="dept1" class="com.atguigu.pojo.Dept">

      <property name="deptId" value="1"></property>

      <property name="deptName" value="研发部门"></property>

  </bean>



  <bean id="empChai" class="com.atguigu.pojo.Employee">

      <property name="id" value="101"></property>

      <property name="lastName" value="chai"></property>

      <property name="email" value="chai@163.com"></property>

      <property name="salary" value="50.5"></property>

      <property name="dept" ref="dept1"></property>

      <property name="dept.deptName" value="财务部门"></property>

  </bean>

3.4 内部bean

概述

内部类:在一个类中完整定义另一个类,当前类称之为内部类

内部bean:在一个bean中完整定义另一个bean,当前bean称之为内部bean

注意:内部bean不会直接装配到IOC容器中

示例代码

  <!--    测试内部bean-->

  <bean id="empXin" class="com.atguigu.pojo.Employee">

      <property name="id" value="102"></property>

      <property name="lastName" value="xx"></property>

      <property name="email" value="xx@163.com"></property>

      <property name="salary" value="51.5"></property>

      <property name="dept">

          <bean class="com.atguigu.pojo.Dept">

              <property name="deptId" value="2"></property>

              <property name="deptName" value="人事部门"></property>

          </bean>

      </property>

  </bean>

3.5 集合

List


  <!--    测试集合-->

      <bean id="dept3" class="com.atguigu.pojo.Dept">

          <property name="deptId" value="3"></property>

          <property name="deptName" value="程序员鼓励师"></property>

          <property name="empList">

              <list>

                  <ref bean="empChai"></ref>

                  <ref bean="empXin"></ref>

  <!--                <bean></bean>-->

              </list>

          </property>

      </bean>



      <!--    测试提取List-->

      <util:list id="empList">

          <ref bean="empChai"></ref>

          <ref bean="empXin"></ref>

      </util:list>

      <bean id="dept4" class="com.atguigu.pojo.Dept">

          <property name="deptId" value="4"></property>

          <property name="deptName" value="运营部门"></property>

          <property name="empList" ref="empList"></property>

      </bean>

Map

 

 <!--    测试Map-->

  <bean id="dept5" class="com.atguigu.pojo.Dept">

      <property name="deptId" value="5"></property>

      <property name="deptName" value="采购部门"></property>

      <property name="empMap">

          <map>

              <entry key="101" value-ref="empChai"></entry>

              <entry>

                  <key><value>103</value></key>

                  <ref bean="empChai"></ref>

              </entry>

              <entry>

                  <key><value>102</value></key>

                  <ref bean="empXin"></ref>

              </entry>

          </map>

      </property>

  </bean>



  <util:map id="empMap">

      <entry key="101" value-ref="empChai"></entry>

      <entry>

          <key><value>103</value></key>

          <ref bean="empChai"></ref>

      </entry>

      <entry>

          <key><value>102</value></key>

          <ref bean="empXin"></ref>

      </entry>

  </util:map>

  <bean id="dept6" class="com.atguigu.pojo.Dept">

      <property name="deptId" value="106"></property>

      <property name="deptName" value="后勤部门"></property>

      <property name="empMap" ref="empMap"></property>

  </bean>

 

4、Spring依赖注入方式【基于XML】

为属性赋值方式:

  1. 通过xxxset()方法:这是一种常见的方式,在类中提供了一系列的set方法,用于设置类的属性值。例如,如果有一个属性名为name,那么可能会有一个名为setName()的方法用于设置name属性的值。

  2. 通过构造器:另一种常见的方式是通过类的构造器来传递属性值。在构造对象时,通过构造器的参数列表将属性值传递给对象。这种方式可以在对象被创建时一次性地设置属性值,使得对象的状态在创建后就被确定下来。

  3. 反射:反射是一种高级的Java特性,允许在运行时检查类、获取类的信息以及动态调用类的方法和操作类的属性。通过反射,可以通过类的Field对象来设置对象的属性值,无论这些属性的可见性如何。

4.1 set注入

通过在XML配置文件中使用<property>标签来进行属性注入。在这种方式中,你可以指定属性的名称,并通过value属性或ref属性为属性赋值。如果是基本数据类型或字符串等简单类型,可以使用value属性直接赋值;如果是引用其他bean,可以使用ref属性指定引用的bean的id。

语法:\<property>

4.2 构造器注入

通过在XML配置文件中使用<constructor-arg>标签来进行构造器注入。与set注入类似,你可以在构造对象时指定构造器的参数,并通过value属性或ref属性为构造器参数赋值。这种方式适用于在创建对象时将属性值通过构造器传递给对象。

语法:\<constructor-arg>

4.3 p名称空间注入

导入名称空间:xmlns:p="http://www.springframework.org/schema/p"

语法:<bean p:xxx>

示例代码

  <bean id="stuZhouxu" class="com.atguigu.spring.pojo.Student">

      <property name="stuId" value="102"></property>

      <property name="stuName">

          <value><![CDATA[<<zhouxu>>]]></value>

      </property>

  </bean>



  <bean id="stuZhiFeng" class="com.atguigu.spring.pojo.Student">

      <constructor-arg name="stuId" value="103"></constructor-arg>

      <constructor-arg name="stuName" value="zhifeng"></constructor-arg>

  </bean>



  <bean id="stuXiaoxi"

        class="com.atguigu.spring.pojo.Student"

        p:stuId="104"

        p:stuName="xiaoxi"></bean>

5、Spring管理第三方bean

5.1 Spring管理druid步骤

导入jar包


  <!--导入druid的jar包-->

          <dependency>

              <groupId>com.alibaba</groupId>

              <artifactId>druid</artifactId>

              <version>1.1.10</version>

          </dependency>

          <!--导入mysql的jar包-->

          <dependency>

              <groupId>mysql</groupId>

              <artifactId>mysql-connector-java</artifactId>

              <version>5.1.37</version>

  <!--            <version>8.0.26</version>-->

          </dependency>

编写db.properties配置文件

properties

  #key=value

  db.driverClassName=com.mysql.jdbc.Driver

  db.url=jdbc:mysql://localhost:3306/db220106

  db.username=root

  db.password=root

编写applicationContext.xml相关代码

  <!--    加载外部属性文件db.properties-->

  <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>



  <!--    装配数据源-->

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

      <property name="driverClassName" value="${db.driverClassName}"></property>

      <property name="url" value="${db.url}"></property>

      <property name="username" value="${db.username}"></property>

      <property name="password" value="${db.password}"></property>

  </bean>

测试


  @Test

  public void testDruidDataSource() throws Exception{

      //获取容器对象

      ApplicationContext ioc =

              new ClassPathXmlApplicationContext("applicationContext_druid.xml");



      DruidDataSource dataSource = ioc.getBean("dataSource", DruidDataSource.class);

      System.out.println("dataSource = " + dataSource);



      DruidPooledConnection connection = dataSource.getConnection();

      System.out.println("connection = " + connection);



  }

6、Spring中FactoryBean

6.1 Spring中两种bean

一种是普通bean:

普通bean是指在Spring容器中以普通的方式配置和管理的bean。这些bean通常是通过在XML配置文件或Java配置类中定义并注册的,它们的创建和初始化由Spring容器负责。

另一种是工厂bean【FactoryBean】:

工厂bean是一种特殊的bean,它实现了org.springframework.beans.factory.FactoryBean接口。与普通bean不同,工厂bean负责创建其他bean实例,允许程序员在bean的创建过程中进行参数化或自定义。使用工厂bean可以更灵活地控制bean的创建逻辑和初始化过程。

作用:如需我们程序员参数到bean的创建时,使用FactoryBean

6.2 FactoryBean使用步骤

实现FactoryBean接口:创建一个类并实现FactoryBean接口,该接口要求实现getObject()方法来返回所创建的bean实例,并可选择实现getObjectType()方法来指定工厂bean所创建的对象类型。

重写方法【三个】:在实现FactoryBean接口的类中,需要重写getObject()方法来指定如何创建所需的bean实例。可选地,也可以重写getObjectType()方法来提供所创建的bean的类型。

装配工厂bean:将实现了FactoryBean接口的类配置到Spring容器中,可以通过XML配置文件或Java配置类进行装配。

测试

示例代码:

示例代码:

import org.springframework.beans.factory.FactoryBean;

// 实现FactoryBean接口
public class MyBeanFactory implements FactoryBean<MyBean> {

    // 重写getObject()方法,指定创建bean的逻辑
    @Override
    public MyBean getObject() throws Exception {
        // 这里可以根据需要进行一些自定义的逻辑,然后创建并返回所需的bean实例
        return new MyBean();
    }

    // 可选地重写getObjectType()方法,指定所创建的bean的类型
    @Override
    public Class<?> getObjectType() {
        return MyBean.class;
    }
}

在Spring配置文件中装配工厂bean:

<bean id="myBeanFactory" class="com.example.MyBeanFactory"/>

在测试代码中获取并使用工厂bean:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        // 获取工厂bean实例
        MyBean myBean = context.getBean("myBeanFactory", MyBean.class);
        
        // 使用工厂创建的bean实例
        myBean.doSomething();
    }
}

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

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

相关文章

地图涟漪效果

参考API echarts图表集 useEcharts.js import { onBeforeUnmount, onDeactivated } from "vue"; // import * as echarts from "echarts";/*** description 使用 Echarts (只是为了添加图表响应式)* param {Element} myChart Echarts实例 (必传)* param …

【IC前端虚拟项目】axi ddr/sram验证组件思路与编写

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 在完成了所有的utils包括apb_utils之后,就要进行验证环境的整体搭建,因此我们再把验证环境拿出来看一下: 按照由底至顶层的思路,接下主要有五大部分需要我们完成:ram_model、reference_model、env、…

软件体系结构总结

文章目录 一、软件体系结构概述1.1 基本概念1.1.1 背景1.1.2 定义1.1.3 系统1.1.3.1 定义1.1.3.2 特性1.1.3.3 系统的体系结构 1.1.4 软件设计的层次性1.1.5 体系结构的类别&#xff08;类型&#xff09;1.1.6 重要性&#xff08;意义&#xff09; 1.2 模块及其设计1.2.1 定义1…

值得收藏!!《软考信息处理技术员》必背100母题,轻松45+

距离软考考试的时间越来越近了&#xff0c;趁着这两周赶紧准备起来 今天给大家整理了——软考信息处理技术员100道经典母题&#xff0c;年年从里面抽&#xff0c;有PDF&#xff0c;可打印&#xff0c;每天刷几道。 第一章 电脑的基本操作 1、&#xff08; &#xff09;不是国产…

OC foudation框架(上)学习

foundation框架 文章目录 foundation框架字符串&#xff08;NSString && NSMutableString&#xff09;NSString的其他功能NSMutableString 日期与时间 &#xff08;NSDate&#xff09;2.1 日期与时间&#xff08;NSDate&#xff09;2.2日期格式器日历与日期组件定时器&…

文献速递:多模态深度学习在医疗中的应用--多模态深度学习用于阿尔茨海默病痴呆评估

Title 题目 Multimodal deep learning for Alzheimer’s disease dementia assessment 多模态深度学习用于阿尔茨海默病痴呆评估 01 文献速递介绍 全球每年新发痴呆症病例近1000万例&#xff0c;其中阿尔茨海默病&#xff08;AD&#xff09;最为常见。需要新的措施来改善因…

Linux(centos7)系统配置 ntpd服务设置时间同步

一 、应用场景 两台服务器,要求使他们时间同步,有人问为什么要时间同步?如果一个集群中,时间相差很大,那么会出现很多诡异的问题,你也不想在一个无法解决的问题上浪费几天时间吧!总之,设置服务器之间时间同步,为了避免很多问题的发生! ntpd(Network Time Protocol …

【ZYNQ】Vivado 封装自定义 IP

在 FPGA 开发设计中&#xff0c;IP 核的使用通常是不可缺少的。FPGA IP 核是指一些已经过验证的、可重用的模块或者组件&#xff0c;可以帮助构建更加复杂的系统。本文主要介绍如何使用 Vivado 创建与封装用户自定义 IP 核&#xff0c;并使用创建的 IP 核进行串口回环测试。 目…

[开发|安卓] Android Studio 开发环境配置

Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …

SpringBoot 3.2.5 + ElasticSearch 8.12.0 - SpringData 开发指南

目录 一、SpringData ElasticSearch 1.1、环境配置 1.2、创建实体类 1.3、ElasticSearchTemplate 的使用 1.3.1、创建索引库&#xff0c;设置映射 1.3.2、创建索引映射注意事项 1.3.3、简单的 CRUD 1.3.4、三种构建搜索条件的方式 1.3.5、NativeQuery 搜索实战 1.3.6…

使用socat做端口转发

最近买的云上mongo数据库但是数据库不支持外网访问&#xff0c;准备做iptables转发但是一直不成功&#xff0c;腾讯云官方给予的解释是受服务器内启动的docker影响 做iptables转发会冲突&#xff0c;所以只能另想办法&#xff0c;我发现使用socat做转发也很好用&#xff0c;所以…

01.基本概念

操作系统 为什么要有操作系统&#xff1f; 计算机时一个十分复杂的系统&#xff0c;又cpu、内存、磁盘、IO设备、网络接口等等复杂的硬件组成&#xff0c;人的精力是有限的&#xff0c;不可能了解所有的硬件接口&#xff0c;但是程序可以。 所以我们在计算机上安装了一层软件&…

网易云新玩法:教你赚取第一桶金!

在现今的音乐应用市场中&#xff0c;有几款软件备受广大用户的青睐。 其中&#xff0c;QQ音乐、酷狗音乐以及网易云音乐都是大家耳熟能详的名字。 这些平台不仅提供了丰富的音乐资源&#xff0c;还具备了许多便捷的功能&#xff0c;使得用户们能够享受到更为优质的音乐体验。…

五一 大项目

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

linux安装配置Docker保姆级教程

Docker到底是什么? Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相互之间…

【MySQL的内置函数】

文章目录 一、日期函数1.current_date()2.current_time()3.current_timestamp4. date_add 穿越未来5.date_sub 回到过去6.datediff案例 二、字符串函数2.1charset2.2 concat ——拼接字符串2.3 ucase——转化成大写2.4 lcase——转化成小写2.5 left&#xff08;&#xff09;2.6…

vue3 element plus el-date-picker组件在日期上做标识

1.先看效果图,带红点的就是我要做标识的日期 2.直接把代码拿出来就可以用 (1)html部分 <el-date-pickerv-model"startTime"type"datetime"placeholder"选择开始日期"format"YYYY-MM-DD HH:mm"value-format"YYYY-MM-DD HH:mm…

测试新人常问:如何开始自动化测试,必须知道的10点!

随着互联网技术的发展&#xff0c;无论哪个公司&#xff0c;哪个团队都在谈论自动化测试、动手实现自动化测试&#xff0c;从而让测试显得更加“高大上”。 那么是不是所有的业务都适合自动化&#xff1f;是不是自动化做的越多&#xff0c;效果越好呢&#xff1f;下面就自己一…

物联网平台之单体架构

介绍本文主要介绍平台的单体架构&#xff0c;包括各个组件之间的数据流描述以及所做的一些架构选择。在单体架构模式下&#xff0c;所有 ThingsKit 组件都在单个 Java 虚拟机 (JVM) 中启动&#xff0c;并共享相同的操作系统资源。由于 ThingsKit 是用 Java 编写的&#xff0c;因…

企业大文件传输之安全数据传输的重要性

企业数据安全性的维护直接关系到企业的市场竞争力乃至其生存的根基。数据的保护不仅涉及到保护企业的商业秘密&#xff0c;也关乎到客户隐私的保护&#xff0c;更触及到国家安全的敏感层面。因此&#xff0c;保障数据在传输过程中的安全&#xff0c;成为了每个企业和组织必须面…