Java EE框架整合开发入门到实战——Spring+Spring MVC+MyBatis微课版_陈恒 楼偶郡 张立杰_清华大学出版社_ISBN:9787302502968
Spring Core Container(Spring核心容器)是其他模块建立的基础,由Spring-core、Spring-beans、Spring-context、Spring-context-support、Spring-expression构成。
见基本概念:1. Spring Core Container(Spring核心容器)
控制反转Ioc是一个抽象的概念,是用来消减计算机程序的耦合问题。
依赖注入(Dependency Injection DI)是IoC的另一种说法,是从不同的角度描述相同的概念。
BeanFactory提供了完整的IoC服务支持,是一个管理Bean的工厂,主要负责初始化各种Bean。
依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(列如属性值)注入Bean组件中。
Spring框架的依赖注入实现方式:
<bean id="testDIService" class="service.TestDIServiceImpl">
<constructor-arg index="0" ref="myTestDIDao" />
bean>
<bean id="testDIService" class="service.TestDIServiceImpl">
<property name="testDIDao" ref="myTestDIDao" />
bean>
使用属性的setter方法注入方法:
控制反转和依赖注入见基本概念1. Spring IoC的基本概念
优点:
Spring框架实例化Bean有3种方式:
Spring框架中,Spring容器调用Bean对应类中的无参构造方法来实例化Bean。
构造方法实例化方法:
<bean id="constructorInstance" class="instance.BeanClass" />
// 初始化Spring容器ApplicationContext,价值配置文件
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
// 测试构造方法实例化Bean
BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance");
使用静态工厂实例化Bean时要求开发者在工厂类中创建一个静态方法来创建Bean的实例。
配置Bean时:
静态工厂实例化方法:
<bean id="staticFactoryInstance" class="instance.BeanStaticFactory" factory-method="createInstance" />
使用实例工厂实例化Bean时要求开发者在工厂类中创建一个实例方法来创建Bean的实例。
配置Bean时:
实例工厂实例化方法:
<bean id="instanceFactoryInstance" factory-bean="instance.BeanInstanceFactory" factory-method="createInstance" />
作用域名称 | 描述 |
---|---|
singleton | 默认方式,单例模式 |
prototype | 原型模式 |
使用scope属性指定作用域
<bean id="test" class="instance.BeanClass" scope="prototype" />
Bean的装配方式即Bean的依赖注入方式。
Bean的装配方式有:
Spring提供了两种基于XML配置的装配方式:
基于XML配置的装配:
<bean id="user" class="User">
<constructor-arg index="0" value="focus" />
<constructor-arg index="1">
<list>
<value>听歌value>
<value>睡觉value>
list>
constructor-arg>
bean>
<bean id="user" class="User">
<property name="userName" value="focus" />
<property name="hobbyList">
<list>
<value>听歌value>
<value>睡觉value>
list>
property>
bean>
// 初始化Spring容器ApplicationContext,价值配置文件
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
// 测试构造方法实例化Bean
User u1 = (User)appCon.getBean("user");
该注解是一个泛化的概念,表示一个组件对象(Bean)。可以作用在任何层次上。
该注解用于将数据访问层(DAO)的类标识为Bean。功能与@Component相同。
该注解用于将业务逻辑组件类(Service层)标识为Bean。功能与@Component相同。
该注解用于将控制器类(Controller层)标识为Bean。功能与@Component相同。
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配。
@Autowired默认按照Bean的类型进行装配,如果想按照名称装配,需要和@Qualifier注解一起使用。效果等同于@Resource
该注解与@Autowired功能相同,区别在于该注解按照名称来装载注入。
使用注解的方式:
<context:component-scan base-package="annotation" />
@Controller
public class TestController {
...
}
AOP即面向切面编程,与OOP相辅相成。
在OOP中以类作为程序的基本单元。
在AOP中以Aspect(切面)作为基本单元。
AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,在程序编译或运行阶段将抽取的代码应用在需要执行的地方。
切面是指封装横切到系统功能(事务处理)的类。
连接点是指程序运行中的一些时间点,例如方法的调用或异常的抛出。
切入点指需要处理的连接点。在Spring AOP中,所有方法的执行都是连接点。通过切入点确定哪些连接点需要被处理。
通知是由切面添加到特定的连接点的一段代码,即在定义好的切入点处所要执行的程序代码。
引入允许在现有的实现类中添加自定义的方法和属性。
目标对象即所有被通知的对象。
如果AOP框架使用运行时代理(动态AOP)来实现切面,那么通知的对象总是一个代理对象。
代理是通知应用到目标对象之后被动态创建的对象。
织入是将切面代码插入到目标对象上,生成代理对象的过程。
AOP织入的方式:
常用AOP框架实现织入方式:
在Spring中默认使用JDK动态代理实现AOP编程。ProxyFactoryBean创建代理是Spring AOP实现的最基本方式。
环绕通知是在目标方法执行前和执行后实施增强,可应用于日志记录、事务处理等功能。
前置通知是在目标方法执行前实施增强,可应用于权限管理等功能。
后置返回通知是在目标方法成功执行后实施增强,可应用于关闭流、删除临时文件等功能。
后置通知是在目标方法执行实施增强,于后置返回通知不同的是,后置通知不管是否发生异常都要执行该通知,该通知可应用于释放资源。
异常通知在方法抛出异常后实施增强,可应用于处理异常、记录日志等功能。
引入通知是在目标类中添加一些新的方法和属性,可应用于修改目标类(增强类)。
元素名称 | 用途 |
---|---|
AspectJ的顶层配置元素 | |
- - 配置一个切面 - 属性ref指定切面的定义 |
|
- - 配置切入点 - 属性expression指定增强哪些方法 |
|
- - 配置环绕通知 - 属性method指定环绕通知方法 - 属性pointcut-ref指定关联的切入点 |
|
- - 配置前置通知 - 属性method指定前置通知方法 - 属性pointcut-ref指定关联的切入点 |
|
- - 配置后置返回通知 - 属性method指定后置返回通知方法 - 属性pointcut-ref指定关联的切入点 |
|
- - 配置后置(最终)通知 - 属性method指定后置通知方法 - 属性pointcut-ref指定关联的切入点 |
|
- - 配置异常通知 - 属性method指定异常通知方法 - 属性pointcut-ref指定关联的切入点 - 没有异常发生时不执行 |
|
通知引入新的接口,增强功能 |
<bean id="myAspect" class="MyAspect" />
<aop:config>
<aop:aspect ref="myAspect">
<aop:poincut expression="execution(* dynamic.jdk.*.*(..))" id="myPointCut" />
<aop:before method="before" pointcut-ref="myPointCut" />
aop:aspect>
aop:config>
expression = "execution({{returnType}} {{packageName}}.{{className}}.{{methodName}}({{param}}))"
什么是AOP:见基本概念1. AOP(Aspect-Oriented Programming)的基本概念
AOP有哪些术语:见基本概念2. AOP的术语
为什么要学习AOP编程:AOP和OOP相辅相成,AOP实现采用横向抽取机制,将分散在各个方法的重复代码抽取处理,然后在程序编译或运行阶段将抽取出来的代码应用到需要执行的地方。这种横向抽取机制采用传统的OOP无法实现,所以采用AOP对OOP进行补充,以更加方便的实现业务功能如日志记录、性能统计、安全控制等
基于底层API的编程式事务管理就是根据:
几个核心接口,通过编程方式进行事务管理
在代码中显示调用与事务处理相关的方法,这就是编程式事务管理。当只要少数事务操作时,编程式事务管理才比较合适。
Spring的声明式事务管理是通过AOP技术实现的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或加入一个事务,在执行完目标方法之后根据情况提交或回滚事务。
MyBatis核心配置文件:mybatis-config.xml(MyBatis全局配置文件,配置MyBatis的运行环境等信息,如数据库连接信息。)
通过与Spring整合,在Spring配置文件中配置MyBatis配置信息
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverclassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="maxTotal" value="30" />
<property name="maxIdle" value="10" />
<property name="initialSize" value="5" />
bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml" />
bean>
见基本概念:1. MyBatis的工作原理
<configuration>
<properties/>
<settings>
<setting name="" value="" />
settings>
<typeAliases/>
<typeHandlers/>
<objectFactory type="" />
<plugins>
<plugin interceptor="">plugin>
plugins>
<environments default="">
<environment id="">
<transactionManager type="" />
<dataSource type="" />
environment>
environments>
<databaseIdProvider type="" />
<mappers>
<mapper resource="com/mybatis/UserMapper.xml" />
mappers>
configuration>
元素名称 | 描述 |
---|---|
select | 查询语句,最常用 |
insert | 插入语句 |
update | 更新语句 |
delete | 删除语句 |
sql | 定义一部分SQL,可以在多个位置被引用 |
resultMap | 描述从数据库结果集中来加载对象 |
级联查询时数据库实体的概念,有3种级联关系:
级联的优点:
级联的缺点:
MyBatis不提供多对多级联,可以通过两个一对多实现多对多级联
主要用在in条件中,在SQL语句中迭代一个集合。
主要属性:
MVC时Model、View、Controller的缩写:
MVC的优点:
Spring MVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成。
Spring MVC工作流程如下:
在SSM中,除web.xml是默认配置文件,其他都不是默认文件,包括Spring、MyBatis配置文件。
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>/WEB-INF/spring-config/springmvc-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
见基本概念3. 在web.xml文件中部署DispatcherServlet
Spring MVC配置文件:命名规则:servletName-servlet.xml,创建在WEB-INF目录下
见基本概念2. Spring MVC工作原理
在RequestMapping注解语句中,注解的value属性将请求的URI映射到方法,value属性是RequestMapping注解的默认属性,如果只有一个value属性,可省略该属性。
@RequestMapping注解有以下两个类型:
在springmvc配置文件 springmvc-servlet.xml中配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolve" id="internalResourceViewResolve">
<property name="prefiex" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
bean>
见基本概念3. Controller接收请求参数的常见方式
数据绑定是将用户参数输入值绑定到领域模式的一种特性。
数据绑定的优点:
JSP中使用Spring表单标签库时,必须在JSP页面开头处生命taglib指令,指令代码如下:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
在表单标签库有:
其中,可以绑定集合的元素有:
拦截器主要用于拦截用户请求并做相应的处理,通常用于权限验证、记录请求信息日志、判断是否登录。
定义拦截器有两种方法:
HandlerInterceptor接口定义的3个方法:
<mvc:interceptors>
<bean class="拦截器路径" />
<mvc:interceptor>
<mvc:mapping path="作用路径" />
<bean class="拦截器路径" />
mvc:interceptor>
mvc:interceptors>
文件上传需要将表单的enctype配置为multipart/form-data,请求方法设置为post,使用标签上传文件。
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" />
...
form>
EL(Expression Language,表达式语言),基本语法为${表达式}
,通过page指令的isELIgnored属性说明是否支持EL语言,为true时,不支持;为false,支持,默认为false
常用隐含对象:
与作用范围有关的隐含对象
与请求参数有关的隐含对象:
JSP标准标签库(Java Server Pages Standard Tag Library,JSTL)。
ArrayList<String> dogNames = new ArrayList<String>();
dogNames.add("goodDog");
request.setAttribute("dog", dogNames);
可以使用${dogs[0]}
正确地使用EL取得数组中的值。