1、Spring简介
1、spring是什么
spring是分层的轻量级框架,以IOC与AOP为核心
2、spring发展历程
3、spring优势
1、方便解耦,简化开发
2、AOP编程支持
3、声明式事务的支持
4、方便程序的测试
5、方便集成各种优势的框架
6、降低javaEE API的使用难度
7、java源码经典学习范例
4、spring的体系结构
2、Spring快速入门
1、spring程序开发
1、导入spring开发的基本包坐标
2、编写Dao接口和实现类
3、创建spring核心配置文件
4、在spring配置文件中配置UserDaoImpl
5、使用spring的api获得Bean实例
2、spring配置文件
Bean:把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了
1、Bean标签的基本配置
用于配置对象交由spring来创建
默认情况下他调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功
基本属性:
id:Bean实例在spring容器中的唯一标识
class:Bean的全限定名称
2、Bean标签的范围配置
scope:指对象的作用范围,取值如下:
singleton:默认值,单例的(单一对象)
prototype:多例的(多个对象)
(1)当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
对象创建:当应用加载时,创建容器时,对象就被创建了
对象运行:只要容器在,对象就一直活着
对象销毁:当应用卸载时,销毁容器时,对象就被销毁了
(2)当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时,实例化Bean
Bean的生命周期:
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被java的垃圾回收器回收
3、Bean生命周期配置
4、Bean实例化的三种方式
(1)无参构造方法实例化
(2)工厂静态方法实例化
(3)工厂实例方法实例化
7、Bean的依赖注入方式
怎么样将UserDao注入到UserService内部
构造方法
set方法
8、Bean的依赖注入的数据类型
上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入
(1)普通数据类型
(2)引用数据类型
(3)集合数据类型
9、引入其他配置文件(分模块开发)
实际开发中,spring的配置内容非常多,这就导致spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在spring主配置文件通过import标签进行加载
<import resource="applicationContext-user.xml"/>
<import resource="applicationContext-product.xml"/>
10、spring的重点配置
标签
id属性:在容器中Bean实例的唯一标识,不允许重复
class属性:要实例化的Bean的全限定名
scope属性:Bean的作用范围,常用是singleton和prototype
标签:属性注入
name属性:属性名称
value属性:注入的普通属性值
ref属性:注入的对象引用值
标签
标签
标签
标签:导入其他的spring的分文件
3、spring相关API
1、ApplicationContext的继承体系:接口类型,代表应用上下文,可以通过其实例获得spring容器中的Bean对象
2、ApplicationContext的实现类
(1)ClassPathXmlApplicationContext:
他是从类的根路径下加载配置文件,推荐使用这种
(2)FileSystemXmlXmlApplicationContext:
他是从磁盘路径加载配置文件,配置文件可以在磁盘的任意位置
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext app=new FileSystemXmlApplicationContext("D:\\IDEA\\test\\java02\\src\\main\\resources\\applicationContext.xml");
(3)AnnotationConfigApplicationContext:
当使用注解配置容器对象时,需要用此类来创建spring容器,它用来读取注解
3、getBean()方法使用
4、知识要点
spring的重点API
5、spring配置数据源
1、数据源(连接池)的作用
(1)提高程序性能
(2)事先实例化数据源,初始化部分连接资源
(3)使用连接资源时从数据源获取
(4)使用完毕后将连接资源归还给数据源
常见的数据源(连接池):DBCP,C3P0,BoneCP,Druid等
2、数据源的开发步骤
(1)导入数据源的坐标和数据库驱动坐标
(2)创建数据源对象
(3)设置数据源的基本连接数据
(4)使用数据源获取连接资源和归还连接资源
3、spring配置数据源
可以将dataSource的创建权交由spring容器去完成
6、spring注解开发
1、spring原始注解
spring是轻代码重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
spring原始注解主要是替代bean标签的配置
@Component:使用在类上用于实例化Bean
@Controller:使用在web层类上用于实例化Bean
@Service:使用在service层类上用于实例化Bean
@Repository:使用在Dao层类上用于实例化Bean
@Autowired:使用在字段上用于根据类型注入
@Qualifier:结合@Autowired一起使用用于根据名称进行依赖注入
@Resource:相当于@Autowired+@Qualifier,按照名称进行注入
@Value:注入普通属性
@Scope:标注Bean的作用范围
@PostConstruct:使用在方法上,标注此方法是Bean的初始化方法
@PreDestroy:使用在方法上,标注此方法是Bean的销毁方法
2、spring新注解
@Configuration:用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解
@ComponentScan:
用于指定spring在初始化容器时要扫描的包
作用和在spring的xml配置文件中的<context:component-scan base-package=“com.itheima”/> 一样
@Bean:使用在方法上,标注将该方法的返回值存储到spring容器中
@PropertySource:用于加载.properties文件中的配置
@Import:用于导入其他配置类
7、spring整合junit
1、spring集成junit步骤
(1)导入spring集成junit坐标
(2)使用@Runwith注解替换原来的运行期
(3)使用@ContextConfiguration指定配置文件或配置类
(4)使@Autowired注入需要测试的对象
(5)创建测试方法进行测试
4、spring集成web环境
1、spring集成web环境步骤
(1)配置ContextLoaderListener监听器(导包)
(2)使用WebApplicationContextUtils获得应用上下文
3、SpringMVC
1、概述
POJO:简单的java对象
1、springmvc的使用:
(1)导入springmvc包(使用前端控制器)
(2)配置servlet
(3)编写POJO(简单的java bean)(Controller)
(4)将Controller使用注解配置到spring容器中(@Controller)
(5)配置组件扫描
2、客户端与tomcat服务器的交互
1、tomcat引擎:
(1)接收客户端请求
(2)封装代表请求的req,代表响应的resp
(3)调用请求资源
2、springmvc的执行流程
(1)用户发送请求至前端控制器DispatcherServlet
(2)DispatcherServlet收到请求调用HandlerMapping处理器映射器
(3)处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器的对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
(4)DispatcherServlet调用HandlerAdapter处理器适配器
(5)HandlerAdapter经过适配器调用具体的处理器(Controller,也叫后端控制器)
(6)
(7)
(8)…
3、springmvc注解解析
@RequestMapping:
作用:用于建立请求URL和处理请求方法之间的对应关系
位置:
类上,请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录
方法上,请求URL的第二级访问目录,与类上的使用@RequestMapping标注的一级目录一起组成的虚拟路径属性
value:用于指定请求的url,他和path属性的作用是一样的
method:用于指定请求的方式
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置一样
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/user")
public class UserController {
//请求地址:http://localhost:8080/user/quick
@RequestMapping(value = "/quick",method = RequestMethod.GET,params= {"username"})//请求映射
public String save(){
System.out.println("Controller save running");
return "/success.jsp";
}
}
4、springmvc的相关组件
1、前端控制器:DispatcherServlet
2、处理器映射器:HandlerMapping
3、处理器适配器:HandlerAdapter
4、处理器:Handler
5、视图解析器:ViewResolver
6、视图:View
5、springmvc的注解和配置
请求映射注解:@RequestMapping
<!-- 配置内部资源视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图跳转时前面的东西prefix /jsp-->
<property name="prefix" value="/jsp/"></property>
<!-- 视图跳转时后面的东西suffix .jsp-->
<property name="suffix" value=".jsp"></property>
</bean>
2、springmvc的数据响应
1、页面跳转
1、返回字符串形式
直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转
2、返回ModeAndView对象
Mode:模型 作用封装数据
View:视图 作用展示数据
@RequestMapping(value = "/quick2")//请求映射
public ModelAndView save2(){
/**
* Model:模型 封装数据
* View:视图 展示数据
*/
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
return modelAndView;
}
2、回写数据
1、直接返回字符串
web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用
response.getWrite().print("hello world");
即可,那么在Controller中想直接返回字符串该怎样解决?
(1)通过springmvc框架注入的response对象,使用response.getWrite().print(“hello world”);回写数据,此时不需要视图跳转,业务方法返回值为void
@RequestMapping(value = "/quick6")//请求映射
public void save6(HttpServletResponse response) throws IOException {
response.getWriter().print("hello itcast");
}
@RequestMapping(value = "/quick7")//请求映射
@ResponseBody//告知springmvc框架,不进行视图跳转,直接进行数据响应
public void save7(HttpServletResponse response) throws IOException {
response.getWriter().print("hello itcast");
}
@RequestMapping(value = "/quick9")//请求映射
@ResponseBody//告知springmvc框架,不进行视图跳转,直接进行数据响应
public String save9() throws JsonProcessingException {
User user = new User();
user.setUsername("lisi");
user.setAge(30);
//使用json的转换工具,将对象转换为json格式字符串在返回
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString("user");
return json;
}
2、返回对象或集合
springmvc的配置文件,先把1下述内容写上
<!-- mvc的注解驱动-->
<mvc:annotation-driven/>
3、springmvc获得请求数据
1、获得请求参数
(1)基本类型
@RequestMapping(value = "/quick11")//请求映射
@ResponseBody//告知springmvc框架,不进行视图跳转,直接进行数据响应
public void save11(String username,int age) throws IOException {
System.out.println(username);
System.out.println(age);
}
(2)POJO类型参数
@RequestMapping(value = "/quick12")//请求映射
@ResponseBody//告知springmvc框架,不进行视图跳转,直接进行数据响应
public void save12(User user) throws IOException {
System.out.println(user);
}
(3)数组类型参数(使用较少)
@RequestMapping(value = "/quick13")//请求映射
@ResponseBody//告知springmvc框架,不进行视图跳转,直接进行数据响应
public void save13(String[] strs) throws IOException {
System.out.println(Arrays.asList(strs));
}
(4)集合类型参数
4、自定义类型转换器(使用较少)
1、自定义类型转换器的开发步骤
(1)定义类型转换器实现Converter接口
(2)在配置文件中声明转换器
(3)在中引用转换器
5、springmvc获得请求数据
1、获得请求头
1、@RequestHeader
使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeeader(name)
@RequestHeader注解的属性如下:
value:请求头的名称
required:是否必须携带此请求头
@RequestMapping(value = "/quick20")
@ResponseBody
public void save20(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
System.out.println(user_agent);
}
2、@CookieValue
使用@CookieValue可以获得指定的Cookie值
@CookieValue注解的属性如下:
value:指定cookie的名称
required:是否必须携带此cookie
2、文件上传
1、文件上传
(1)文件上传客户端三要素
表单项type=“file”
表单的提交方式是post
表单的enctype属性是多部分表单形式,及enctype=“。。。。。。”
(2)文件上传原理
(3)单文件上传实现
导入相关依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
配置文件上传解析器
<!-- 配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="500000"></property>
</bean>
编写文件上传代码
4、JdbcTemplate使用
1、jdbctemplate的使用
1、导入相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
2、测试连接数据库
package com.itheima.test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import java.beans.PropertyVetoException;
public class JdbcTemplateTest {
@Test
// 测试jdbctemplate开发步骤
public void test1() throws PropertyVetoException {
// 创建一个数据源对象
ComboPooledDataSource dataSource=new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/bjpowernode");
dataSource.setUser("root");
dataSource.setPassword("1234");
JdbcTemplate jdbcTemplate=new JdbcTemplate();
// 设置数据源对象,知道数据库1在哪
jdbcTemplate.setDataSource(dataSource);
// 执行操作
int row = jdbcTemplate.update("insert into account value(?,?)", "tom", 2000);
System.out.println(row);
}
}
2、spring产生模板对象分析
applicationContext配置
<!-- 0、加载外部的properties配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--1、配置数据源对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--2、配置jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
5、spring练习
1、spring环境搭建步骤
1、创建工程(Project&Module)
2、导入静态页面
3、导入需要坐标(pom.xml)
4、创建包结构(controller、service、dao、domain、utils)
5、导入数据库脚本
6、创建POJO类
7、创建配置文件(applicationContext.xml,spring-mvc.xml,jdbc.properties,log4j.properties)
6、springmvc异常处理
1、异常处理的思路
1、系统中异常包括两大类:预期异常和运行时异常
前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
系统的Dao、Service、Controller出现都通过throw Exception向上抛出,最后由SpringMvc前端控制器交给异常处理器进行异常处理
2、异常处理的两种方式
1、使用SpringMvc提供的简单异常处理器SimpleMappingExceptionResolver
2、使用spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
7、springAOP
1、springAOP简介
1、什么是AOP
AOP意思为“面向切面编程”,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容,是函数式编程的一种衍生泛型,利用AOP可以对业务逻辑的各个部分进行分离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率
2、AOP的作用及优势
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势:减少代码重复,提高开发效率,并且便于维护
3、AOP的底层实现
实际上,AOP的的底层是通过Spring提供的动态代理技术实现的。在运行期间,spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在调用目标对象的方法,从而完成功能的增强
4、AOP的动态代理技术
常用的动态代理技术:
JDK代理:基于接口的动态代理技术
cglib代理:基于父类的动态代理技术
5、JDK的动态代理
6、cglib的动态代理
7、AOP相关概念
Target(目标对象):代理的目标对象
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
JoinPoint(连接点)(指可以被增强的方法):所谓连接点是指那些被拦截到的点。在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点
Pointcut(切入点)(需要被增强的方法):所谓切入点是指我们要对哪些JoinPoint进行拦截的定义
Advice(通知/增强):
Aspect(切面):是切入点和通知的结合
Weaving(织入)
8、AOP开发明确的事项
1、需要编写的内容
2、AOP技术实现内容
3、AOP底层使用哪种代理方式
8、Mybatis
1、简介
1、原始jdbc存在的问题
(1)数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
(2)sql语句在代码中硬编码,造成代码不宜维护,实际应用sql变化的可能较大,sql变动需要改变java代码
(3)查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位符位置
解决方案:
(1)使用数据库连接池初始化连接资源
(2)将sql语句抽取到xml配置文件中
(3)使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
2、什么是Mybatis
(1)基于java的持久层框架,内部封装了jdbc;可以使开发者只需关注sql语句本身,不需关注加载驱动、创建连接等繁杂过程
(2)通过xml或注解方式将要执行的各种statement配置起来
(3)mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题