目录
JAVA准备
《如何安装和配置java环境,让电脑支持java运行》
https://jingyan.baidu.com/article/e75aca85b29c3b142edac6a8.html
安装 Java IDE: IntelliJ IDEA
《如何使用IntelliJ IDEA 配置Maven》
https://blog.youkuaiyun.com/westos_linux/article/details/78968012
《idea怎么创建maven项目》
https://jingyan.baidu.com/article/0bc808fc37499e1bd485b90d.html
整个课程目录
http://www.imooc.com/course/programdetail/pid/59
Spring Bean 创建
pom.xml 中导入依赖关系;
如何用Idea进行Junit单元测试:
https://jingyan.baidu.com/article/f7ff0bfccd661d2e26bb131a.html
xml定义好bean后,可以利用ClassPathXmlApplicationContext加载配置后创建bean;
使用Junit前需要标记test位测试类;
Spring Bean 配置
通过xml配置
可配置项包括id, class, scope ,constructor arguments, properties, autowiring mode, lazy-initialization mode, initialization/destruction method,其中class是必须项;
注入:可以利用xml给成员变量赋初值,有设置注入和构造器注入两种方式;
作用域:singleton-每个容器只有一个实例,prototype-每次申请请求(getBean)都是新的实例;
可以利用hashcode区分实例;
在bean的生命周期执行顺序:
default-init-method→default-destroy-method
InitializingBean→init-method→DisposableBean→ destroy-method;
实现Aware接口的bean在初始化之后可以获取并操作资源:
ApplicationContextAware获取并操作applicationContext
BeanNameAware获取并操作beanName
自动装配有三种方式:
byName:根据bean的id和属性名自动装配;
事实上是通过bean的id寻找具有对应方法名称的set方法,使用该方法注入;
byType:根据bean的class和属性类型自动装配。如果属性对应多个类型的bean,则抛出异常;
事实上是通过bean的class寻找具有相同参数类型的set方法,使用该方法注入;
byConstructor:类似byType,但是寻找构造器而不是set方法;
Resource接口:关于资源文件的统一接口,包括UrlResource, ClassPathResource, FileSystemResource;
ResourceLoader:用于获取资源。ApplicationContext实现 ResourceLoader接口;
ResourceLoader前缀包括:classpath, file, http, 无前缀(依赖于加载器,默认前缀为classpath)。
通过注解配置
可以自动发现并注册@Component, @Repository, @Service, @Controller注解的类,或者使用使用Component的自定义注解;
开启使用注解的配置, context:component-scan;
@Componen等注解的值为bean的id,默认为首字母小写的类名;
可以在name-generator属性中自定义命名策略,需要实现BeanNameGenerator 接口;
@Scope默认为singleton;
可以在scope-resolver属性中自定义scope策略,需要实现 ScopeMetadataResolver 接口;
@Autowired注解,可以使用在传统的setter方法、构造器、成员变量上;
可以对集合参数使用@Autowired注解;
list放入bean的实例,map放入bean的id和实例;
如果需要数组有序,可以使bean实现 Ordered 接口,或者使用@Order注解;排序只对类型list的数据结构有效,值越小优先级越高,相当于定义了一个比较器;
自动装配可能出现多个bean实例时,可以用@Qualifier注解缩小范围;
@Bean可以标识一个用于配置和初始化由IOC容器管理的新对象的方法,类似标签,也可以自定义name、配置init和destroy方法;
通常在@Configuration标识的类中使用@Bean;
@ImportResource注解的值为spring xml文件路径,引入对应的配置文件;
如果xml配置文件中引入properties文件,可以使用@Value和全局变量给类的属性赋值,这相当于配置property属性;
JSR支持:
@Resource @Inject 类似 @Autowired,@Named类似 @Component,用来注解类名或者指定引用某个类
Spring AOP
基本概念
面向切面编程(Aspect Oriented Programming, AOP),实现程序功能的统一维护。
主要功能为:日志记录、性能统计、安全控制、事务处理、异常处理等。
实现方式为:
预编译:AspectJ。
运行期动态代理(JDK动态代理、cglib动态代理):SpringAOP、jbossAOP。
SpringAOP:
为纯java实现,没有提供最完整的AOP实现,只支持方法执行连接点,这是为了侧重于提供一种AOP实现和IOC容器的整合。
Spring默认使用jdk动态代理实现AOP,也可以使用cglib代理。
关键为切面,是通知和切点的结合。
通知:定义切面做什么,何时使用。
切点:定义切面在何处使用,会匹配通知所需要织入的一个或多个连接点。
XML配置方式
spring xml的配置:
aop:aspect的ref为定义切面的bean的id。
aop:pointcut中的expression限定切面的影响范围。也可以在pointcut属性中定义影响范围。
环绕通知需要在ProceedingJoinPoint实例执行proceed方法前后进行操作。可以使用 args 向通知提供切入点方法的参数。
aop:declare-parents为匹配到的类添加父类接口并提供这个接口的实现。
Advisor:只有一个advice的切面。
<aop:before method="before" pointcut-ref="onePointcut"></aop:before>
<aop:after-returning method="afterReturning" pointcut-ref="onePointcut">
<aop:after-throwing method="afterThrowing" pointcut-ref="onePointcut">
<aop:after method="after" pointcut-ref="onePointcut"></aop:after>
<aop:around method="around" pointcut-ref="onePointcut"></aop:around>
AspectJ配置方式
使用注解方式实现AOP。
切面使用@Aspect, @Component标识。
切入点通过返回值void的方法定义,使用@Pointcut注解。
通知可以使用注解,@Before、@AfterReturning、@AfterThrowing、@After、@Around标识。
args传递切入点方法的参数,annotation传递切入点方法的注解。
returning传递返回值,throwing传递抛出的异常。
@DeclareParents注解为配置中的aop:declare-parents,为匹配到的类添加父类接口并提供这个接口的实现。
Spring事务
一组数据库操作,要么全部执行,要么全部不执行,具有原子性,一致性……
API
抽象为3个接口。
事务管理器
PlatformTransactionManager
事务定义信息
TransactionDefinition
事务的隔离级别可以不同程度上解决,脏读、不可重复读、虚读(幻读)的问题。mysql默认为REPEATABLE_READ级别。
事务的传播行为可以分为3类,共7种:在一个事务中,不在一个事务中,嵌套事务。
事务状态
TransactionStatus
事务管理
通过事务模板 TransactionTemplate 手动配置,使用少。
使用XML配置的声明式事务管理,使用AOP实现。
编程式事务管理
代理配置
需要为每个事务管理的类配置代理增强,使用少。
XML配置
配置好之后,类上无需添加代码,经常使用。
注解配置
使用 @Transactional 注解,配置简单,经常使用。
<!--直到配置事务管理器同上-->
<!--开启注解事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
SpringMVC
MVC基本流程
MVC工程配置
《maven学习笔记之IDEA+Maven+Jetty运行一个简单的web项目
》
https://blog.youkuaiyun.com/qq_28640763/article/details/79868092
webx.xml配置dispatcher.xml位置,dispatcher.xml配置viewResolver位置,controller指出具体的匹配请求调用的jsp
Controller现代方式
秒杀系统DAO层
相关技术介绍
MYSQL:表设计,SQL技巧,事务和行级锁
MyBatis:DAO层设计与开发,MyBatis合理使用,MyBatis与Spring整合
Spring:IOC整合Service,声明式事务运用
SpringMVC:Restful接口设计和使用,框架运作流程,Controller开发技巧
前段:交互设计,Bootsrap,jQuery
高并发:高并发点分析和优化
工程配置
logback 配置
http://logback.gos.ch/manual/configuration.html
spring 配置
http://docs.springio/spring/docs
mybatis 配置
http://mybatis.github.io/mybatis-3/zh/index.html
web.xml
servlet2.3 JSP el表达式默认不工作,需要切换到更高版本,可以从tomcat的样例中复制
pom.xml
junit改成4.11,3.0之前是编程方式,4.0之后是注解
sql部署
Code\mysql-8.0.16-winx64\bin
安装&登录
mysqld --initialize --console
mysqld install
net start mysql
mysql -u root -p
重置密码(8.0.15之后)
mysqld --console --skip-grant-tables --shared-memory
use mysql
update user set authentication_string='' where user='root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
查询
show tables;
show create table seckill\G
show create table success_killed\G
修改
SELECT * FROM seckill;
ALTER TABKE seckill
DROP INDEX idx_creat_time
ADD index_idx_c_s(start_time,create_time)
接口和数据实体
dao包新增两个基础操作接口
SeckillDao 秒杀接口
SuccessKilledDao 成功秒杀接口
entity包新增两个数据类型
Seckill 秒杀实体
SuccessKilled 成功秒杀实体
基于MyBatis实现DAO
MyBatis优势是自己写SQL,只需传入参数,可以选择XML提供SQL(推荐)注解提供SQL,DAO接口实现可以依赖Mapper自动实现(推荐)或者API编程方式实现
SeckillDao.xml
SuccessKilledDao.xml
主要书写了秒杀接口和成功秒杀接口里的方法对应的SQL语句;通过ognl表达式给列取别名,可以在获得SuccessKilled结果的同时得到seckill属性
SQL报错
Unknown system variable 'query_cache_size'
mysql-connector-java版本不匹配
com.mchange.v2.resourcepool.TimeoutException
checkoutTimeout设置1s太小了
java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.
properties加配置&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
数据库没结果
原因查找失败
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'limit' not found.
需要以注解的方式声明参数@Param("offset")
数据库数据查出来时间差了八小时
jdbc连接mysq之serverTimezone设定
UTC改成HongKong
总结
DAO层工作演变为:接口设计+SQL编写
代码和SQL分离,方便Review
DAO拼接等逻辑在Service层完成
秒杀系统Service层
接口设计
service方法设计思路:考虑方法力度,从使用者角度出发,考虑返回类型
dto包新增两个类:
Exposer:用于表示秒杀暴露接口
SeckillExecution:用于表示秒杀结果
enums包新增枚举
SeckukkStateEnum 用于表示执行结果
service包
新增一个接口类和实现类
SeckillService ScillServiceImpl
包含暴露接口,查询商品,执行秒杀方法
Spring配置
新增spring-service.xml开启bean注入,事务管理
秒杀系统Web层
Tomcat运行
下载完安装文件后,将压缩文件解压到一个方便的地方,比如 Windows 下的 C:\apache-tomcat-5.5.29 目录或者 Linux/Unix 下的 /usr/local/apache-tomcat-5.5.29 目录,然后创建 CATALINA_HOME 环境变量指向这些目录。
%CATALINA_HOME%\bin\startup.bat
或者
C:\apache-tomcat-5.5.29\bin\startup.bat