SSM-秒杀系统

目录

 

JAVA准备

Spring Bean 创建

Spring Bean 配置

通过xml配置

通过注解配置

Spring AOP

基本概念

XML配置方式

AspectJ配置方式

Spring事务

API

事务管理器

事务定义信息

事务状态

事务管理

编程式事务管理

代理配置

XML配置

注解配置

SpringMVC

MVC基本流程

MVC工程配置

Controller现代方式

秒杀系统DAO层

相关技术介绍

工程配置

web.xml

pom.xml

sql部署

接口和数据实体

基于MyBatis实现DAO

SQL报错

总结

秒杀系统Service层

接口设计

Spring配置

秒杀系统Web层

Tomcat运行


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代理。

https://i-blog.csdnimg.cn/blog_migrate/a30727f56d403a79cdf2248087260c8f.png

关键为切面,是通知和切点的结合。

通知:定义切面做什么,何时使用。

切点:定义切面在何处使用,会匹配通知所需要织入的一个或多个连接点。

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值