Spring基本介绍

1.官方资料和下载

1.1Spring5下载

直接访问 https://repo.spring.io/ui/native/release/org/springframework/spring/,选择相应版本即可

  1. 进入官网 https://spring.io/

  2. 进入Spring5

  3. 进入Spring5 的github

    也可以直接访问 https://github.com/spring-projects/spring-framework

  4. 在github仓库README.md文件往下拉,看到Access to Binaries,点击里面的链接

  5. 在新页面往下拉,看到如下标题,点击链接

  6. 点击Artifacts

  7. 在左边的弹窗中依次点击release-->org-->springframework-->spring

  8. 在右边的窗口点击复制url

  9. 在浏览器新页面访问该地址,在页面中即可选择你想要下载的版本,我这里选择下载5.3.8版本

  10. 点击对应版本,在新页面中选择第一个,点击即可下载

1.2Spring文档

  • 在线文档

    Spring Framework Documentation

  • 离线文档

    解压缩后,在\spring-framework-5.3.8\docs\reference目录下分别提供了spring介绍文档的html和pdf版本

  • 离线API

    在\spring-framework-5.3.8\docs\javadoc-api\index.html中可以查看Spring的API

2.Spring学习的核心内容

  1. Spring核心学习内容:IOC,AOP,JDBCTemplate
  2. IOC:控制反转,可以管理java对象
  3. AOP:切面编程
  4. JDBCTemplate:是Spring提供的一套访问数据库的技术,应用性强,相对好理解
  5. 声明式事务:基于ioc/aop实现事务管理
  6. 其中ioc,aop是重点以及难点

3.Spring几个重要概念

  1. Spring可以整合其他的框架(Spring是管理框架的框架)
  2. Spring有两个核心的概念:IOC 和 AOP

  1. IOC [Inversion Of Control 反转控制]
  • 传统的开发模式 [ JdbcUtils/反射 ]

    程序------->环境 //程序读取环境配置,然后自己创建对象

    传统的开发模式:(以连接到数据库为例说明)

    1. 程序员编写程序,在程序中读取数据库配置信息

    2. 创建对象(反射或者new)

      各种对象,如:Connection,PreparedStatement,ResultSet等等

    3. 使用对象完成任务

  • IOC的开发模式

    程序<------容器 //容器创建好对象,程序直接使用

    如,现在有几个类:EmpAction EmpService EmpDao Emp

    传统的方式是通过手动new创建对象,然后在程序中使用

    现在,可以把要使用到的对象先配置到一个文件中(xml或者注解,这里以xml配置为例),这个文件可以理解成一个“容器文件”。配置好后,当spring启动以后,它就可以直接在程序中来获取容器创建好的对象,并进行使用:

    1. Spring根据配置文件xml/注解,创建对象,并放入到容器中(类似ConcurrentHashMap),并且可以完成对象之间的依赖(对象之间的依赖关系也在xml配置或者注解中完成)

      依赖:即对象间的引用关系。例如有A,B两个类。A类中的某个属性是B类,通过容器创建的两个类的对象a,b,它们之间的依赖/引用关系,将会自动完成(当然,也需要配置)

    2. 当需要使用某个对象实例时,直接从容器中获取即可

    3. 这样程序员可以更加专注于使用对象完成相应的业务

      这样创建对象的方式就从 new ===> 注解/配置方式


  1. DI(Dependency Injection 依赖注入),可以理解成是IOC的另外叫法

  2. Spring最大的价值:通过配置,给程序员提供需要使用的 web层[Servlet(Action/Controller)]/Service/Dao/JavaBean等对象。这是Spring的核心价值所在,也是ioc的具体体现,实现解耦

    • 原先的开发模式,Servlet是tomcat创建的,然后Servlet中如果你要用什么对象实例(如Service),就new一个,在Service中你要使用什么实例(如Dao),也同样是通过new的方式来创建实例……以此类推

    • 当使用Spring以后,web层的Servlet,Service层,Dao层,Javabean[entity]中的所有对象,我们都可以在配置文件中配置(或者通过注解指定),并且指定好对象间的依赖关系,放入到容器中。当这个流程结束后,我们想在程序中使用哪个对象,都可以直接在容器中直接获取。

4.Spring快速入门

4.1需求说明

通过Spring的方式[配置文件],获取JavaBean:Monster的对象,并给该对象的属性赋值,输出该对象信息

4.2完成步骤

  1. 下载spring 5 开发包

    详见1.1.1spring5下载

  2. 创建Java工程

    为了清晰spring5 的各个jar包的作用,这里使用Java工程

  3. 新建一个lib文件夹,引入开发spring5的基本包

    commons-logging.jar包需要另外下载,不在spring5包中


4.3代码实现

  1. 创建Javabean:Monster.java

    package com.li.bean;
    
    /**
    * @author 李
    * @version 1.0]
    * Javabean / Entity
    */
    public class Monster {
    private Integer monsterId;
    private String name;
    private String skill; //无参构造器一定要有,spring底层反射创建对象时需要使用
    public Monster() {
    } public Monster(Integer monsterId, String name, String skill) {
    this.monsterId = monsterId;
    this.name = name;
    this.skill = skill;
    } public Integer getMonsterId() {
    return monsterId;
    } public void setMonsterId(Integer monsterId) {
    this.monsterId = monsterId;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public String getSkill() {
    return skill;
    } public void setSkill(String skill) {
    this.skill = skill;
    } @Override
    public String toString() {
    return "Monster{" +
    "monsterId=" + monsterId +
    ", name='" + name + '\'' +
    ", skill='" + skill + '\'' +
    '}';
    }
    }
  2. 在src目录下创建配置文件:鼠标右击src目录--->new--->XML Configuration File--->Spring Config,我这里起名为beans.xml

  3. 创建好配置文件后,文件上方显示"Applilcation context not configured for this file",点击右边的Create Spring facet

    在弹出的窗口中直接点击右下方的ok

    然后重新点击文件的Create Spring facet

    在新窗口选中beans.xml文件,然后点击ok,之后文件就不再提示了。

  4. 在beans.xml文件中配置monster对象

    <?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">
    <!--
    1. 配置monster对象/javabean
    2. 在 beans标签中可以配置多个bean
    3. 一个bean就是一个Javabean对象
    4. class属性用于指定类的全路径->spring底层反射要用
    5. id属性表示该java对象在spring容器中的id(将来在程序中通过id在容器中获取相应对象,因此id是唯一的)
    6. <property name="monsterId" value="100"/> 用于给该对象的属性赋值,没有的话就是默认值
    -->
    <bean class="com.li.bean.Monster" id="monster01">
    <property name="monsterId" value="100"/>
    <property name="name" value="牛魔王"/>
    <property name="skill" value="芭蕉扇"/>
    </bean> </beans>
  5. 创建测试类SpringBeanTest

    package com.li.test;
    
    import com.li.bean.Monster;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.testng.annotations.Test; /**
    * @author 李
    * @version 1.0
    */
    public class SpringBeanTest { @Test
    public void getMonster() {
    // 1.创建容器 ApplicationContext // 2.这个容器是和配置文件关联的。也就是说,将来可能会有多个容器,因为配置文件可能会有多个
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); // 3.通过getBean获取对应的对象
    // 默认返回的是Object类型(编译类型),但是运行类型是Monster
    // Object monster01 = ioc.getBean("monster01");
    Monster monster01 = (Monster) ioc.getBean("monster01");//这样就可以在编译时获取对象属性 //4.输出
    System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());
    System.out.println("monster01.id=" + monster01.getMonsterId() +
    " monster01.name=" + monster01.getName() +
    " monster01.skill=" + monster01.getSkill()); //5.相比于强转,也可以直接在获取的时候指定Class类型
    Monster monster011 = ioc.getBean("monster01", Monster.class);
    System.out.println("monster011=" + monster011);
    System.out.println("monster011.name=" + monster011.getName()); System.out.println("ok~~~"); }
    }

4.4注意事项和细节

4.4.1类加载路径

一个问题:为什么下面可以读取到beans.xml文件?或者说,读取的文件是src目录下的beans.xml吗?

ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");

我们可以在测试类中输出一下路径:

//验证类加载路径
@Test
public void classPath() {
File file = new File(this.getClass().getResource("/").getPath());
System.out.println("file=" + file);
}

可以看到类的加载路径并不在src目录,而是在一个out目录下:

可以看到在out\production\spring目录下有一个beans.xml文件:

当运行后,会将src目录下编译好的class文件放到out目录下。同时,将资源文件(这里指beans.xml)也放到out目录,读取的时候是按照out目录来读取的。

因此运行时,真正读取的配置文件不是在src目录下的beans.xml,而是在out目录下的beans.xml,只是两个文件是一样的。(类的加载路径)


回到之前的问题,为什么下面的语句,我们直接写“beans.xml”?

ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");

因为默认读取的是.....\out\production\spring目录,而一旦运行过后,在src目录下的beans.xml文件会被直接放在.....\out\production\spring目录下,因此可以直接读取到。

假如beans.xml文件是放到src下面的某个子文件夹,那么在语句中就要根据子文件夹的结构来进行修改。

4.4.2spring容器的结构/机制

注意配置debugger,通过配置指定哪一些数据在debug的时候会展示,哪一些不展示

1.如下,打上断点,点击debug

2.如下,beanFactory的beanDefinitionMap属性的类型是ConcurrentHashMap集合,保存beans.xml中的bean节点配置的bean对象的信息

因为在我们的配置文件中,通常会有很多的java对象信息,spring会把这些java对象的信息保存下来,以便将来spring创建对象时使用

3.展开beanDefinitionMap对象,可以看到一个table数组(ConcurrentHashMap类型),初始的大小为512。Spring会将java对象的信息放到table中。

4.index=127位置以ConcurrentHashMap$Node类型保存Monster01对象信息

其中key=“monster01”就是beans.xml中配置的bean的id

value存放了很多数据,例如:monster01对象的信息(属性,属性值,类信息,是否懒加载)

propertyValues就是记录beans.xml中配置的monster01对象的属性名和属性值


5.此外beanFactory还有一个重要属性singletonObjects,singletonObjects也是一个ConcurrentHashMap集合

....未完

day01-Spring基本介绍的更多相关文章

  1. Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍

    1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...

  2. [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续

    英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...

  3. Spring 的介绍和目标

    1. Spring介绍 打开Spring 官网查看对 Spring 的介绍和目标 http://www.springsource.org/about We believe that: · J2EE s ...

  4. Spring的介绍与搭建

    一.Spring的介绍 二.Spring的搭建 (1)导包 (2)创建一个对象 (3)书写配置注册对象到容器 (4)代码测试

  5. Spring Shell介绍

    最近开发中在下遇到了spring-shell开发工具的项目,现在整理了相关文章,以供大家学习 本博客相关的文章均是在Spring Shell 1.2.0的基础上建立   Spring Shell介绍 ...

  6. Spring DevTools 介绍

    Spring DevTools 介绍 Spring Boot包括一组额外的工具,可以使应用程序开发体验更加愉快. spring-boot-devtools模块可以包含在任何项目中,它可以节省大量的时间 ...

  7. 第1章—Spring之旅—Spring模块介绍

    Spring模块介绍 Spring7大核心模块: 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.S ...

  8. Spring Security 介绍与Demo

    一.Spring Security 介绍 Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型.我们仅需引入spring-boot-s ...

  9. [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST,  ...

  10. Spring 框架介绍

    Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – I ...

随机推荐

  1. 浅谈API和SDK的区别

    首先了解一下他们的定义 API:application program interface 应用程序接口 通常表示一些事先定义好的函数,为了向外部提供一组功能的实现,实现和其他软件的交互 SDK:so ...

  2. N32G4系列——复用功能重映射(USART为例)

    开发测试环境:SDK,N32G455x系列芯片 在国民MCU中G系列IO口有第二复用功能,这时需要用到重映射功能. 一.系列芯片手册定义 1.1.芯片IO口默认功能查看 如图,在该系列芯片的数据手册中 ...

  3. 基于FPGA的AES加解密IP

    Programmable AES Encryption/ Decryption IP 可编程AES加解密IP 可编程AES加解密IP提供了加解密算法功能,兼容美国国家标准与技术研究院(NIST)发布的 ...

  4. 2022-11-01 Acwing每日一题

    第k个数 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数(所有整数均在 1 ...

  5. uniapp 微信小程序 配置分享朋友和朋友圈

    uniapp 微信小程序 配置分享朋友和朋友圈 首先在小程序中配置微信分享,和微信朋友圈, onShareAppMessage, onShareTimeline 这两个API 和 onLoad 同级目 ...

  6. MVC开发单元测试小工具 —— 搜寻还没写单元测试的方法

    方法比较笨,有更好的建议可以提. 写这个工具呢,因为要写单元测试,保证代码质量,方便修改维护.一切为了自己方便.当然这个算是个人开发的项目 1.MVC中控制器建立个基类(这个光明正大的抄袭的),控制往 ...

  7. Referenced file contains errors (http://mybatis.org/dtd/mybatis-3-config.dtd). For more information, right click on the message in the Problems View and select "Show Details..."

    mybatis配置文件报错Referenced file contains errors mybatis的配置文件报错 The errors below were detected when vali ...

  8. 喜欢用Map却从未遭遇内存泄露的Java程序员上辈子都是神仙

    前言 点进来这篇文章的大概有两种人,一种是喜欢用Map的想看看自己是不是有可能也会踩雷,一种是不喜欢用Map的想进来看看那些喜欢用的人是怎么踩雷的. 那你要失望了,我只是单纯把公司最近代码审查时一个关 ...

  9. C++使用ODBC连接数据库遇到的问题

    C++使用ODBC连接数据库遇到的问题 1.SQL语句中包含中文无法正常执行的问题 2.字符与宽字符相互转化的问题 C++使用ODBC连接数据库遇到的问题 1.SQL语句中包含中文无法正常执行的问题 ...

  10. ArcObjects SDK开发 013 MapFrame

    1.如何获取MapFrame 打开一个Mxd文件,可能包含一个或多个Map,每个Map都会放到一个MapFrame中,加载到PageLayout上.我们可以通过PageLayout继承的IGraphi ...