(1)添加相关依赖
注:spring 5.0.1.RELEASE有冲突
a、 添加spring相关依赖(版本:5.0.2.RELEASE)
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-test
${spring.version}
b、添加mybatis相关依赖(mybatis版本:3.4.5、pagehelper版本:5.1.2、mysql版本:5.1.44)
org.mybatis
mybatis
${mybatis.version}
mysql
mysql-connector-java
${mysql.version}
com.github.pagehelper
pagehelper
${pagehelper.version}
c、spring整合mybatis(版本:1.3.1)
org.mybatis
mybatis-spring
${mybatis.spring.version}
d、添加dbcp2连接池(commons-dbcp2版本:2.1.1、commons-pool2版本:2.4.3)
org.apache.commons
commons-dbcp2
${commons.dbcp2.version}
commons-pool2
org.apache.commons
org.apache.commons
commons-pool2
${commons.pool2.version}
e、添加日志配置(版本:2.9.1)
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
jcl-over-slf4j
${slf4j.version}
runtime
org.apache.logging.log4j
log4j-api
${log4j2.version}
org.apache.logging.log4j
log4j-core
${log4j2.version}
org.apache.logging.log4j
log4j-slf4j-impl
${log4j2.version}
slf4j-api
org.slf4j
org.apache.logging.log4j
log4j-web
${log4j2.version}
runtime
com.lmax
disruptor
${log4j2.disruptor.version}
f、其他(junit版本:4.12、javax.servlet-api版本:4.0.0、lombok版本:1.18.2)
junit
junit
${junit.version}
test
javax.servlet
javax.servlet-api
${servlet.version}
provided
org.projectlombok
lombok
${lombok.version}
provided
(2)创建spring配置文件applicationContext.xml
a、开启注解式开发
b、引入外部jdbc配置文件
c、配置dbcp2数据库连接池
d、spring和mybatis整合
helperDialect=mysql
e、注解式事物配置
f、开启动态代理
(3)注解式开发
mybatis的开发时,具体的实现类中set、get方法,均由spring的注解代替(repository,service、component),spring的注入,也由spring的注解代替(autowise/resource)
@Repository:将DAO类声明为Bean
@Service:通常作用在业务层
@Constroller:通常作用在控制层,将在Spring MVC中使用
@Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次
@Scope:模式声明(singleton|prototype)
@Autowired:将自动在代码上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方
@Resource:
1)@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
2)指定了name或者type则根据指定的类型去匹配bean
3)指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
问题:@Autowired和@Resource两个注解的区别:
1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
2)@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
(4)Spring Test+Junit完美组合
a、在工程的pom文件中增加spring-test的依赖
org.springframework
spring-test
${spring.version}
b、创建BaseTestCase,并在该类上加上两个注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
c、使用idean的junit插件(JUnitGenerator V2.0)生成测试用例
注1:还需要修改相关配置,详情参考资料:“IDEA Junit4配置.mht”
注2:快捷键,Ctrl + Shift + T
d、在执行单元测试时,为了避免产生脏数据,可将测试单元设置成事务回滚
@Rollback(value = true|false)//true回滚事务,false提交事务
@Transactional(transactionManager = "transactionManager")
e、具体的测试类继承BaseTestCase类
(5)修改分页代码
使用AOP编程解决分页代码重复的问题,新建PageBeanAspect类:
package com.zking.ssm.util;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author LJ
* @site www.lijun.com
* @create 2018-12-18 16:35
*/
@Component
@Aspect
public class PagerAspect {
/**
* “*”代表方法返回值不限
* “*..”代表包名不限(不论多少层级包)
* “*Service”代表以service结尾的接口
* “*Pager”代表以page结尾的方法
* “(..)”代表方法参数不限
* @param args
* @return
* @throws Throwable
*/
@Around("execution(* *..*Service.*Pager(..))")
public Object invoke(ProceedingJoinPoint args) throws Throwable {
Object[] params = args.getArgs();
PageBean pageBean = null;
for (Object param : params) {
if(param instanceof PageBean){
pageBean = (PageBean)param;
break;
}
}
if(pageBean !=null && pageBean.isPagination())
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
Object proceed = args.proceed(params);
if(pageBean !=null && pageBean.isPagination()){
PageInfo pageInfo = new PageInfo((List)proceed);
pageBean.setTotal(pageInfo.getTotal()+"");
}
return proceed;
}
}
语法结构:execution(方法修饰符 方法返回值 方法所属类 匹配方法名 ( 方法中的形参表 ) 方法申明抛出的异常 )
"*" :代表一个任意类型的参数;
“..”:代表零个或多个任意类型的参数。