spring
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。
spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
小结:Spring框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器,提供了功能强大IOC、AOP
pring Application Context
Spring application context能在任何环境下进行引导,包括:
JUnit系统测试
Web应用程序
独立的应用程序
引用依赖1 - 通过Autowired
引用依赖2 - 通过参数@configuration+@bean
loc(inversion of Control)
即控制反转,这是一种设计思想,对象创建的权利有Spring框架完成,由容器管理对象的生命周期
-
主动控制:有应用程序主动控制管理“对象组件”,适合管理创建简单的对象
-
控制反转:有外部容器环境(框架)创建管理“对象组件”交给应用程序使用,适合管理创建过程复杂的对象,从对象使用者的角度看是简单的
-
原来的对象的创建都是由用户自己手动创建,这个的方式耦合性,肯定高,如果类发生了变化,则代码都要修改,
-
现在所有的对象都交给Spring容器管理,用户无需关系对象是 如何实例化,容器负责对象的注入以后几乎不需要修改任何代码,降低了代码的耦合性
3.什么是IOC 由Spring容器管理对象的生命周期,降低代码耦合性
Spring容器
数据结构是Map集合,Map<key,value>是ConcurrentHashMap线程安全的
key=bean标签的"id"="user
value="通过反射的机制实例化的对象"
降低面向对象开发耦合性
说明: 反射机制在框架中 一般使用比较多,给定类型的路径就可以获取其中的对象.但是要求必须有无参构造. 否则程序运行必报异常.
三种方法:
1.xml配置文件管理对象
1)准备xxx.xml配置文件
2).准备bean标签
3)spring容器管理对象
ApplicationContext容器顶级接口
ClassPathXmlApplicationContext 加载配置文件的实现类对象
编译spring.xml配置文件
说明:由于我们需要使用spring的框架,需要要配bean
<?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="user" class="com.jt.demo1.User"></bean>
</beans>
知识点讲解:
1.bean 被spring容器管理的对象称之为bean,
2.id 全局唯一变量一般类型首字母小写,容器对象的唯一标识符,唯一
3.class class的全路径信息,需要写全名
-
java配置:显示配置
编译配置类,使用java类的形式当作配置文件则将该java类 称之为配置类.
@configuration注解
添加在类的声明之前,表示这个类是一个配置类
如果在AnnotationConfigAppliacationContext的构造方法参数中直接使用某个类,则这个类可以不添加@Configuration注解。
即使添加了也不会出错
虽然可以不添加,但是,只要雷士用于配置的,应该添加
@bean注解
在方法的声明之前。表示该方法是用于创建对象的
@bean方法定义在配置类中
@bean方法会在加载配置类是,有框架自动调用
@bean方法的访问权限一般是public
其实,可以使用任何权限,因为spring是通过反射来调用
从设计规范来看,应该使用public
@bean方法的名称将用于生成bean id
如果需要其他名称,可通过@bean注解的属性进行配置
@bean方法可以没有参数,也可以添加有spring管理的对象作为参数
@Configuration 将当前类标识为配置类
public class SpringConfig
@bean
public User user(){
return new User(); //相当于xml反射机制创建对象 }
注解形式
Map集合的结构 Map<方法名,方法的返回值>
@Bean 将方法的返回值,交给Spring容器管理
Test之间获取对象
1)准备配置类 @Configuration + @Bean
2)要求方法 必须有返回值
3)容器对象
ApplicationContext容器顶级接口
AnnotationConfigApplicationContext
万能语法: 根据当前spring的配置规则,实例化接口对象. 我一般不写这些代码,如果想看也可以
-
基于注解组件扫描功能:隐式配置
spring提供组件扫描注解,利用组件扫描注解和组件注解配合,可以自动扫描包空间创建bean对象,减少编码,提高编程效率
如果类名第一个字母是大写,第二个字母是小写,bean id会第一个字母小写
如果类名第一个字母是大写,第二个字母是大写,bean id就是类名不变
-
@Component 将当前的类,交给Spring容器管理, 对象的创建是由Spring通过反射机制自动创建对象.
-
@ComponentScan(“com.jt”) 指定扫描的包路径, 可以扫描它的子孙包,用在配置类中
工厂模式:
问题: 任意对象都可以通过new的关键字 实例化吗?
答案: 当然不是, 抽象类对象 不可以直接实例化.
将所有创建的代码封装在一个专门的方法或类中
用于创建对象的“工厂”
Spring的@Bean方法都是工厂方法
它们都是创建Spring Bean的
Spring中管理的对象,大部分可以通过new/反射进行对象的创建. 但是有些对象由于特殊的原因.不能直接new/实例化.这时需要考虑是否可以通过工厂模式实现.
例如: Calendar 该类是一个抽象类 所以不能直接实例化
@Component("calendar")
public class CalendarFactory implements FactoryBean<Calendar> {
public CalendarFactory(){
System.out.println("工厂模式的无参构造");
}
//现阶段 大家理解为主. 未来写结构设计的时候,作用很大!!!!!
//动态执行该方法,获取返回值对象
@Override
public Calendar getObject() throws Exception {
//利用calendar的工具API 实现对象的创建
return Calendar.getInstance();
}
@Override
public Class<?> getObjectType() {
//固定写法. 一般直接xxx.class即可
return Calendar.class;
}
}
FactoryBean是Spring提供的接口,spring自动完成调用.获取指定的对象
* 难点讲解:
* 1.@Component 标识类 则将该类交给Spring容器管理.
* 2.Spring中FactoryBean的讲解
* 如果spring加载的时候遇到FactoryBean接口
* 则会自动的执行重写的方法getObject/getObjectType
* 3.工厂模式说明:
* Map<Key:calendar,value=Calendar对象></>
*
* 核心功能:
* 1. key: 就是当前类型(如果自己编辑注解以注解为准)
* 2. value: 调用getObject获取的返回值对象
* 将上述的数据,交给Spring容器管理
* 该功能什么时候使用:
* 1. 某些对象不能直接实例化的.
* 2. 整合其它第三方框架对象时 经常使用.
*/
JAVA Bean
为了规范java类的定义,java提供java bean规范,
-
需要定义包package
-
有无参数构造器
-
需要实现序列化接口
-
包含使用getxxx setxxx声明bean属性
-
bean属性(bean property)就是值setxxx getxxx方法
-
对象属性(object field)是值对象的实例变量
Stereotype注解
组件扫描会检查自身就到有@component注解的那些注解,也就是所谓的stertype注解
Meta注解
可添加在其他注解上的注解,例如:所有业务bean都应该可以使用组件扫描进行配置,并且是事务性的
依赖注入(Dependency Injection,简称DI)
依赖注入的意思是给予调用方他所需要的事物,依赖是指可被方法调用的十五,依赖注入形式下,调用方不在直接值使用依赖,却而代之是注入,注入是值将依赖传递给调用方的过程,
依赖就是值一个业务功能执行期间所需要的前提,光头强砍依赖来与电锯
注入是指被依赖的前提对象获得方法,如果是直接去创建就是主动获得,如果是被动得到,就是注入得到,李老板将电锯注入给光头强,
Spring将应用程序配置与应用程序对象(bean)分离,
Spring管理你的应用程序对象
以正确的依赖项顺序的创建它们
确保它们在被使用之前已经全部初始化
每个bean都有一个唯一的id/名称
应反映出bean为客户端提供的服务或作用
Bean的id不应该包含实现的细节
@Autowired注解,
默认是必须的
使用required属性覆盖默认行为
说明:在对象中如果需要使用属性注入,一般使用@Autowired
功能:可以将Spring容易中的对象,自动注入到属性中
用法:
构造方法注入(推荐的做法)
方法注入
字段注入
注入方式:
-
默认按照类型注入,如果注入的属性是节口,则自动注入实现类
-
按照名称注入(key) @Qualifier(key)
@Resource注解
功能上:@Autowired + @Qualilfier()key
依赖注入有几种方式
-
构造器注入
-
setter注入
-
接口注入
bean的作用域
@scope(scopeName = singleton)
@scope(scopeName = peorotypr)
应用如那件中的队形有着不同的生存范围:飞机大战中的小飞机和天空
singleton(单例):是值在一个应用软件运行期间某个类型的对象始终只有一个对对象的现象,比如飞机大战中的天空就是单例的,spring中当一个对象作用域是单例时候,任何时候从springioc容器中获得的对象都是同一个。在程序关闭时候才与程序一起销毁,其作用范围非常长,
prototype(原型):是值应用软件执行期间有多个类型的对象存在,比如飞机大战中的小飞机对象,就是多个实例,当spring中一个对象作用域是原型时候,每次springioc容器获得的对象都是新对象。作用范围很短
spring中默认情况下bean组件作用域是单例,也就是说任何时候调用getbean方法获得的对象都是同一个实例,这么设计优点是一个bean可以被复用,提高了内存资源利用率
懒加载
说明:如果spring容器创建,对象立即创建则该加载方式为“立即加载” 容器启动创建
如果spring容器创建,对象在被使用的时候才创建,则称为懒加载用时才创建
注解:@Lazy添加表示改为懒加载
测试说明:主要测试对象中的无参构造什么时候执行
SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。
SpringMVC框架主要功能: 实现前后端的交互.
交互:
1. 前端通过http请求可以携带参数访问后端服务器. 请求
2. 后端服务器可以将结果通过响应交还给前端. 响应
经典MVc模式中,M是值业务模型,V是值用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使用一个程序可以使用不同的表现形式,其中,View的定义比较清晰,就是用户页面
M:model业务模型
V:view用户界面,视图,就是给用户呈现数据的页面
C:control控制层
历史说明:
JSP动态页面 html代码 + java代码 写到一起 xxx.jsp
不方便后期维护. 页面和业务执行紧紧的绑定在一起耦合性高.
小结:
1.MVC是一种设计思想,编码中降低代码的耦合性
2.前段专注于开发页面view
3.后端专注于开发后端model
4.2开发者通过control进行控制
层级代码结构
说明:MVC设计思想,实现了前段和后端的松耦合,但是根据实际的开发情况,很多的业务逻辑比较复杂,如果说所有的代码都写到同一个java类中,这样的代码很臃肿,为了很好的实现MVC设计思想,所以后端代码也应该分层
分层说明:
-
控制层Controller与前端页面交互的@Controller
-
业务层Service编辑业务逻辑@Service
-
持久层Mapper实现数据库的相关操作 @Repository(暂时)
在类的数量上mapper至少2个,Service至少两个 Controller一个实现类
AbstractAnnotationConfigDispatcherSerletInitialzer是springMVC提供的抽象基类,这个类已经将springMVC的dispatcherServlet等组件配置完成,只需要继承这个类就可以轻松的完成spring配置。
Servlet机制
servlet是java servlet的简称,称为小服务程序或者服务连接器,用java编写的服务器端程序,具有独立平台和协议的特性,主要功能在于交互是的浏览和生成数据,生成动态内容
总结:servlet是java实现前后端的数据交互的一种机制
在servlet组件作为项目的控制器中,如果有一些功能,用户注册等,都需要创建一个servler,数量过多,不易管理和维护,也会消耗较多的内存空间。
核心对象
-
request对象
-
response对象
重要组件
-
前端控制器 DispatcherServlet 实现请求的流转
-
处理器映射器 handlerMapping实现了请求路径与方法之间的映射.
-
处理器适配器 handlerAdapter处理器的管理器 内部有N个处理器. 针对不同的用户请求 调用不同的处理器完成任务
-
视图解析器 ViewResolver直线页面路径的拼接
-
controller,控制器,具体处理请求的组件
-
model and view,controller组件处理完请求后得到的结果,有数据与视图名称组成
接受客户端提交的请求参数
在软件中无论注册登录还是填写收获地址,都需要将在浏览器表单上的数据提交到服务器,最终存储起来,springmvc可以处理用户请求,也提供了处理用户提交数据到功能
-
使用控制器方法参数接受表单数据:封装表单数据,method对应请求方法,action对应url
-
使用javabean作为参数接收表单数据:封装数据到一个单独的类中
-
使用request对象接受数据,控制器注入request对象,这样就可以获取任何请求参数包含,请求头信息,ip等信息,由于request包含getPramater方法,也可以获取请求表示数据。
用户发起请求时,第一步经过前端控制器,
但是前端控制器 只负责请求的转发和响应.不做任何业务处理.将请求转发给处理器映射器.
处理器映射器接收到前端控制器的请求之后,查询自己维护的服务列表信息.
如果服务列表中没有这个URL的key. 该程序不能处理用户的请求,则返回特定数据,前端控制器接收之后响应用户404.
如果服务列表中有该URL key 则说明请求可以正常执行. 将该方法的对象返回给前端控制器.
前端控制器将返回的方法进行接收,但是由于前端控制器只负责转发和响应,不能直接执行该方法.所以交给处理器适配器执行.
处理器适配器根据方法的类型(xml配置文件/注解/其他方法),处理器适配器在自己的处理器库中挑选一个最为合适的处理器去执行该方法. 当处理器执行该方法时标识业务开始. 将最终的处理的结果通过ModelAndView对象进行包裹,返回给前端控制器.
ModelAndView: Model: 代表服务器返回的业务数据 View: 服务器端返回的页面的名称
视图解析器 将View中的数据进行解析 拼接一个完整的页面路径 前缀/hello后缀
视图渲染: 将数据与页面进行绑定. 这样用户就可以在页面中看到具体的数据.
由于现在流行前后端分离. 所以SpringMVC省略了视图解析和视图渲染.只有前5步. 核心注解: @ResponseBody 省略6-7步
springBoot
一个用于Spring项目的有主见的运行时
支持不同的项目类型,例如Web和Batch
帮你处理大多数低级的、可预测的设置
它不是
一个代码生成器
一个IDE插件
为什么使用Spring Boot?
为所有Spring开发提供更快、更广泛的入门体验
开始即有意见,但当需求开始偏离默认值时,应迅速退出
提供一系列项目的大类所共有的非功能性功能
嵌入式服务器、安全性、度量、运行状况检查和外部化配置等
定位:springBOOT框架是框架的框架,检查常规框架的配置的方法,只需要很少的代码,即可以实现大量的功能,体现开箱即用的思想
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者
依赖管理
现代Java应用程序需要大量的依赖项——如何确保它们兼容?
Spring Boot JARs,Spring JARs,常见的第三方JAR等
Spring Boot的父级或Starters来拯救这个问题
利用现有的依赖管理方案
建议使用现代的依赖管理工具进行精细的依赖管理
… 但并不需要
支持Maven、Gradle、Ivy
Spring Bootw父级POM
自动配置
通过@EnableAutoConfiguration启用自动配置
在Spring的Java配置类上使用@EnableAutoConfiguration注解
– Spring Boot会自动创建它认为你需要的Beans
Spring Initializr
生成初始Spring Boot应用程序项目的框架、API和默认实现
Spring的对外公开网站: https://start.spring.io
或构建你自己的:https://github.com/spring-io/initializr
它的价值
简化和策划依赖管理
支持Gradle或Maven
Java、Groovy或Kotlin
构建Spring Boot项目的起始模版
主要是文件夹结构、Maven/Gradle文件
在STS、IntelliJ IDE(仅限Ultimate版)中作为“新项目”向导 进行访问
开箱即用的原理说明
springBoot将繁琐的配置封装到某些jar包中,该jar包的文件已经完成了配置,引用即可使用,只需要少量的配置就可以获取器功能的方法,叫做开箱即用
启动项: spring-boot-starter-xxxx
说明: 包中已经将框架进行了整合.用户拿来就用
外部化属性:application.properties
开发人员通常将属性外置到文件中
可通过 @PropertySource 轻松完成
但开发人员对文件的命名/存储位置不同
Spring Boot查找 application.properties
以通常的方式提供给 Environment 和 @Value
将需要的任何属性放在这里
Boot会自动找到并加载它们
application.properties的位置
ring Boot会在这些位置查找application.properties (按照以下顺序)
– /config 工作文件夹的子级文件夹
– 工作文件夹
– config 在classpath中的config包
– classpath根目录
rewards.client.host=192.168.1.42
rewards.client.port=8080
rewards.client.logdir=/logs
rewards.client.timeout=2000
基于这些文件创建PropertySource
Profiles和application.properties
Spring Boot将根据application-{profile}.properties惯例查找Profile特定属性
Mybatis
官网地址: https://mybatis.org/mybatis-3/zh/index.html
介绍
-
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
-
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
-
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
-
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
-
2013年11月迁移到Github。
特点
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。 [2]
数据映射
持久层:
1.数据表: 用户的数据信息, 持久化到本地磁盘中
2.POJO: 程序通过对象封装数据信息.
映射关系: 一个POJO对象要求映射一张数据表
1.对象名称 映射数据表表名.
2. 对象的属性 映射数据表中的字段
Mybatis基本用法
知识1:别包名:在配置文件中指定包路径: 可以自动的实现包路径的拼接
resultType规则:
1. 首先根据别名包匹配.设定..
2. 如果匹配不成功,则按照路径匹配.
参数传递的规则:
1. 如果是单个参数,则使用#{key} 获取的参数的值
2. 如果是对象参数,则使用#{属性} 获取的是属性值
知识2:如果多个参数不方便使用 User对象封装时,应该使用万能的集合Map
知识3:如果传递的参数是Map, 则使用#{key}
xml转译字符:
1. > >
2. < <
3. & &
4. 万能转译字符
<![CDATA[ 转移内容 ]]>
知识点4: 利用注解实现数据的封装
原则:Mybatis只支持单值传参 将多值封装为单值
注解:@Param("key") int minAge(值)
作用:将数据封装为Map
知识点5:模糊查询 特别注意表名的大小写问题!!!!!
windows系统中: 不区分大小写
Linux系统中: 区分大小写问题.
语法: "%" 这样的方式
知识点6:说明: Sql语句中经常出现重复的数据.如果每次重复的内容都自己手写.则开发的效率低.
优化: 将公共的Sql进行抽取
优势: Sql标签可以节省代码
缺点: 可读性变差了, 如果是关联操作 则根据情况而定.
<sql id="tableColumn"> id,name,age,sex </sql>
知识点7:
关于Mybatis的遍历的写法
foreach:
1. collection 需要遍历的集合
1.1 数组 关键字: array/list
1.2 list集合 关键字: list/array
1.3 Map<key,array/list> 关键字:key
2. open/close 循环体的开始和结束 可以写到循环之外简化标签
3. item 当前遍历数据的变量名
4. separator 分割符
知识点8:
动态Sql: 根据对象中不为null的属性当作where条件
语法:
1.如果判断成立,则动态拼接条件
<if test="id !=null ">条件</if>
2.where标签 去除where后边多余的一个and/or
知识点9:多个条件同时查询
如果不想使用所有的条件可以使用choose 类似于java中的switch 语法:
如果name有值,则按照name查询,否则按照sex查询数据.