day01-Spring基本介绍
Spring基本介绍
1.官方资料和下载
1.1Spring5下载
直接访问 https://repo.spring.io/ui/native/release/org/springframework/spring/,选择相应版本即可
进入官网 https://spring.io/
进入Spring5

进入Spring5 的github

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

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

点击Artifacts

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

在右边的窗口点击复制url

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

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

1.2Spring文档
在线文档
离线文档
解压缩后,在\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学习的核心内容
- Spring核心学习内容:IOC,AOP,JDBCTemplate
- IOC:控制反转,可以管理java对象
- AOP:切面编程
- JDBCTemplate:是Spring提供的一套访问数据库的技术,应用性强,相对好理解
- 声明式事务:基于ioc/aop实现事务管理
- 其中ioc,aop是重点以及难点

3.Spring几个重要概念
- Spring可以整合其他的框架(Spring是管理框架的框架)
- Spring有两个核心的概念:IOC 和 AOP
- IOC [Inversion Of Control 反转控制]:
传统的开发模式 [ JdbcUtils/反射 ]
程序------->环境 //程序读取环境配置,然后自己创建对象

传统的开发模式:(以连接到数据库为例说明)
程序员编写程序,在程序中读取数据库配置信息
创建对象(反射或者new)
各种对象,如:Connection,PreparedStatement,ResultSet等等
使用对象完成任务
IOC的开发模式
程序<------容器 //容器创建好对象,程序直接使用
如,现在有几个类:EmpAction EmpService EmpDao Emp
传统的方式是通过手动new创建对象,然后在程序中使用
现在,可以把要使用到的对象先配置到一个文件中(xml或者注解,这里以xml配置为例),这个文件可以理解成一个“容器文件”。配置好后,当spring启动以后,它就可以直接在程序中来获取容器创建好的对象,并进行使用:
Spring根据配置文件xml/注解,创建对象,并放入到容器中(类似ConcurrentHashMap),并且可以完成对象之间的依赖(对象之间的依赖关系也在xml配置或者注解中完成)
依赖:即对象间的引用关系。例如有A,B两个类。A类中的某个属性是B类,通过容器创建的两个类的对象a,b,它们之间的依赖/引用关系,将会自动完成(当然,也需要配置)
当需要使用某个对象实例时,直接从容器中获取即可
这样程序员可以更加专注于使用对象完成相应的业务
这样创建对象的方式就从 new ===> 注解/配置方式

DI(Dependency Injection 依赖注入),可以理解成是IOC的另外叫法
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完成步骤
下载spring 5 开发包
详见1.1.1spring5下载
创建Java工程
为了清晰spring5 的各个jar包的作用,这里使用Java工程
新建一个lib文件夹,引入开发spring5的基本包
commons-logging.jar包需要另外下载,不在spring5包中


4.3代码实现
创建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 + '\'' +
'}';
}
}
在src目录下创建配置文件:鼠标右击src目录--->new--->XML Configuration File--->Spring Config,我这里起名为beans.xml

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

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

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

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


在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>
创建测试类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基本介绍的更多相关文章
- Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍
1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...
- [翻译]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 ...
- Spring 的介绍和目标
1. Spring介绍 打开Spring 官网查看对 Spring 的介绍和目标 http://www.springsource.org/about We believe that: · J2EE s ...
- Spring的介绍与搭建
一.Spring的介绍 二.Spring的搭建 (1)导包 (2)创建一个对象 (3)书写配置注册对象到容器 (4)代码测试
- Spring Shell介绍
最近开发中在下遇到了spring-shell开发工具的项目,现在整理了相关文章,以供大家学习 本博客相关的文章均是在Spring Shell 1.2.0的基础上建立 Spring Shell介绍 ...
- Spring DevTools 介绍
Spring DevTools 介绍 Spring Boot包括一组额外的工具,可以使应用程序开发体验更加愉快. spring-boot-devtools模块可以包含在任何项目中,它可以节省大量的时间 ...
- 第1章—Spring之旅—Spring模块介绍
Spring模块介绍 Spring7大核心模块: 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.S ...
- Spring Security 介绍与Demo
一.Spring Security 介绍 Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型.我们仅需引入spring-boot-s ...
- [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务
微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST, ...
- Spring 框架介绍
Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – I ...
随机推荐
- 生成随机数的几种方法、Math.random()随机数的生成、Random()的使用
第一种方法使用:System.currentTimeMillis(); final long l = System.currentTimeMillis(); final int rs = (int) ...
- 使用doctest代码测试和Sphinx自动生成文档
python代码测试并自动生成文档 Tips:两大工具:doctest--单元测试.Sphinx--自动生成文档 1.doctest doctest是python自带的一个模块.doctest有两种使 ...
- BootStrap--selectpicker的使用
bootstrap-select,selectpicker 用法详细:通过官方文档翻译 用过selectpicker的都说好~但是网上中文的教程又找不到比较完整的用法,于是去官网看了下 顺便弄过来 ...
- linux 2021
常用安装 sudo apt install openssh-server # 安装ssh service ssh # 查看ssh服务的 基础 Debian 是Ubuntu的母板,有强大的包管理功能,使 ...
- chrome工具调试
项目调试的困境 程序开发总会遇到各种各样的问题,为什么实际结果和预期结果不一致? 这个时候如果能深入程序内部抽丝剥茧去一探究竟再好不过! 而chrome工具是前端开发的杀手锏,经常听到的一句话是: 出 ...
- 模块/collections/random/time/datetime
内容概要 模块--包的具体使用 编程思想介绍 软件开发--目录规范 常用模块介绍--collections模块 常用模块介绍--time.datetime 常用模块介绍--random 1.包的具体使 ...
- 聊聊如何让办公网络直连Kubernetes集群PodIP/ClusterIP/Service DNS等
想象一下,如果您日常使用的研发测试Kubernetes集群,能够有以下效果: 在办公网络下直接访问Pod IP 在办公网络下直接访问Service Cluster IP 在办公网络下直接访问集群内部域 ...
- NavBarControl 通过代码添加
看到网上很多都是直接在控件上面添加的 而我的是保存在数据库读取后添加的. 后来自己摸索了一下. 通过代码添加 navBarControl1.Groups.Add(new NavBarGroup( st ...
- Sql Server日期转汉字字符串
以下脚本转至互联网,增加了自己需要的功能并改成了函数的方式 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ================== ...
- 更换linux的开机启动图片, 启动主题
简述 之前就想更改开机的启动图片,但是后来简单查了一下,说要重新编译内核,听到编译我就望而却步了,今天发现只是个命令而已,注意这里我用的是 linux mint .这里更改不是 grub 主题, 是 ...