联盟怎么小狗怎么画一步一步教的返回

一步一步地配置Spring
本文旨在从一个空工程一步一步地配置Spring。
一、spring基本配置
1. 添加spring依赖
父工程pom.xml添加spring依赖
org.springframework
spring-framework-bom
4.2.6.RELEASE
org.springframework
spring-context
org.springframework
spring-web
org.springframework
spring-webmvc
org.springframework
spring-core
commons-logging
commons-logging
2. web.xml添加spring配置
修改web.xml文件为如下:
contextConfigLocation
classpath*:META-INF/dispatcher.xml
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
dispatcher
org.springframework.web.context.ContextLoaderListener
index.html
3. 添加dispatcher.xml文件
在web工程的src/main/resources/META-INF目录下添加dispatcher.xml文件,并添加如下配置:
4. 添加controller/service/dao等类
下面直接贴出各实现类。
(1)TestDaoImpl.java
package com.alan.dao.
import org.springframework.stereotype.R
import com.alan.dao.TestD
@Repository(&testDao&)
public class TestDaoImpl implements TestDao {
public String test() {
return &../index.html&;
(2)TestServiceImpl.java
package com.alan.service.
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.S
import com.alan.dao.TestD
import com.alan.service.TestS
@Service(&testService&)
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testD
public String test() {
return testDao.test();
(3)TestController.java
package com.alan.
import org.springframework.beans.factory.annotation.A
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RestC
import com.alan.service.TestS
@RestController
@RequestMapping(&/alan&)
public class TestController {
@Autowired
private TestService testS
@RequestMapping(&/test&)
public String test(){
return testService.test();
重新编译工程并启动tomcat,通过浏览器访问,如果出现以下内容则表示配置正确。
注意:若tomcat启动老是报org.springframework.web.context.ContextLoaderListener找不到,把Eclipse关了,并把工作空间中Server/.metadata/RemoteTempFiles等几个目录删除,重新打开Eclipse并配置Preferences且重新导入工程再试。
二、配置Json支持
6. 添加Json依赖
修改父工程的pom.xml,添加以下内容:
com.alibaba
7. 配置@ResponseBody返回Json
在web工程的dispatcher.xml文件中添加如下配置:
application/charset=UTF-8
text/charset=UTF-8
text/charset=UTF-8
8. 再次访问
重启tomcat,通过浏览器再次访问,如果返回以下内容表示配置@ResponseBody正确。
注:如果Controller类上注解为@RestController则相当于方法上注解了@ResponseBody。
9. 添加返回Model方法
新建Model,并添加对应的dao/service/controller方法返回此Model。
(1)TestModel.java
package com.alan.
public class TestModel {
public Integer getId() {
public void setId(Integer id) {
public String getName() {
public void setName(String name) {
this.name =
(2)TestDaoImpl.java
public TestModel testModel() {
TestModel testModel = new TestModel();
testModel.setId(1);
testModel.setName(&tt&);
return testM
(3)TestServiceImpl.java
public TestModel testModel() {
return testDao.testModel();
(4)TestController.java
@RequestMapping(&/test-model&)
public TestModel testModel(){
return testService.testModel();
重启tomcat,通过浏览器访问,如果返回以下内容则表示json配置正确。
三、配置单元测试
11. 添加单元测试依赖
修改父工程pom.xml,添加单元测试依赖。
org.springframework
spring-test
12. 添加测试类
新建一个测试类。
package com.alan.
import org.junit.T
import org.junit.runner.RunW
import org.springframework.beans.factory.annotation.A
import org.springframework.test.context.ContextC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import com.alan.service.TestS
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations=&classpath*:META-INF/dispatcher.xml&)
public class UnitTest {
@Autowired
private TestService testS
public void test(){
String result = testService.test();
System.out.println(result);
13. 运行测试类
Run As && JUnit Test,运行结果如下表示配置单元测试正确。
四、配置日志管理
此处介绍两种日志管理工具,一个是log4j,一个是logback。
(一)log4j
14. 添加log4j相关依赖
修改父工程的pom.xml,添加以下内容。
jcl-over-slf4j
slf4j-log4j12
15. 添加log4j.properties
在web工程的src/main/resources目录下添加log4j.properties文件。
log4j.rootCategory=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
log4j.category.org.springframework.beans.factory=DEBUG
修改log4j.rootCategory中的DEBUG为INFO/ERROR等即可输出相应级别的日志。
16. 测试log4j
修改单元测试类为如下。
package com.alan.
import org.junit.T
import org.junit.runner.RunW
import org.slf4j.L
import org.slf4j.LoggerF
import org.springframework.beans.factory.annotation.A
import org.springframework.test.context.ContextC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import com.alan.controller.TestC
import com.alan.service.TestS
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations=&classpath*:META-INF/dispatcher.xml&)
public class UnitTest {
private Logger logger = LoggerFactory.getLogger(UnitTest.class);
@Autowired
private TestService testS
public void test(){
logger.debug(&---------------------测试开始----------------------------&);
String result = testService.test();
System.out.println(result);
logger.debug(&---------------------测试结束----------------------------&);
运行测试类,如果输出结果为以下内容则表示log4j配置正确。
(一)logback
17. 添加logback依赖
修改父工程的pom.xml,删除之前log4j的依赖,添加logback相关的依赖。
jcl-over-slf4j
ch.qos.logback
logback-classic
org.logback-extensions
logback-ext-spring
18. 添加logback.xml文件
在web工程的src/main/resources目录下添加logback.xml文件,官网说会先检测classpath下的logback.groovy文件,如果没有再寻找logback-test.xml文件,最后才会找logback.xml文件,不过我们一般就直接使用logback.xml文件啦。
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L -%msg%n
${log.base}/alan-springmvc.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L -%msg%n
修改root元素的level属性为debug/info/error等即可输出相应级别的日志。
19. 添加logback监听
修改web工程的web.xml,添加以下内容。
logbackConfigLocation
classpath:logback.xml
ch.qos.logback.ext.spring.web.LogbackConfigListener
20. 测试logback
运行之前的单元测试类,如果输出以下内容则表示logback配置正确。
注:从log4j转到logback之前类中的写法完全不用改变,这是slf4j的威力。
打开日志文件(logback.xml中配置的第二个appender),如果看到以下内容表示logback配置正确。
注:../index.html这行是system.out.println输出的,所以不在日志文件中。
五、集成mybatis
本文采用bonecp管理数据库连接,数据库采用mysql。
21. 添加bonecp/mybatis/mysql/jdbc依赖
其中,mysql的依赖版本最好跟数据库保持一致,否则可能会出现连不上的情况。
com.jolbox
0.8.0.RELEASE
org.mybatis
org.mybatis
mybatis-spring
org.springframework
spring-jdbc
org.springframework
spring-test
mysql-connector-java
org.springframework
spring-jdbc
22. 添加spring-mybatis.xml
在web工程的src/main/resources/META-INF目录下增加配置文件spring-mybatis.xml。
classpath:mapper/*Mapper.xml
23. 修改dispatcher.xml
(1)增加对属性文件读取的支持;
file:/etc/*.properties
file:/E:/workspace/self/etc/*.properties
(2)引入spring-mybatis.xml文件
24. 添加jdbc.properties
在E:/workspace/self/etc目录下增加数据库连接配置文件jdbc.properties。
jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://127.0.0.1:3306/fcuh_user?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&useOldAliasMetadataBehavior=true&noAccessToProcedureBodies=true
jdbc_username=admin
jdbc_password=1234
#Number of partitions.
db.partitionCount=3
#Min number of connections per partition.
db.minConnectionsPerPartition=2
#Max number of connections per partition.
db.maxConnectionsPerPartition=10
#Number of new connections to create in 1 batch.
db.acquireIncrement=2
#Time to wait before a call to getConnection() times out and returns an error.
db.connectionTimeoutInMs=30000
#Number of release-connection helper threads to create per partition.
#A connection older than maxConnectionAge will be destroyed and purged from the pool.
db.maxConnectionAgeInSeconds=172800
#SQL statement to use for keep-alive/test of connection.
db.connectionTestStatement=select 1 from dual
#Maximum age of an unused connection before it is closed off.
db.idleMaxAgeInMinutes=60
#Connections older than this are sent a keep-alive statement.
db.idleConnectionTestPeriodInMinutes=60
#After attempting to acquire a connection and failing, try to connect these many times before giving up.
db.acquireRetryAttempts=5
#After attempting to acquire a connection and failing, wait for this value before attempting to acquire a new connection again.
db.acquireRetryDelayInMs=5000
#If set to true, the connection pool will remain empty until the first connection is obtained.
db.lazyInit=false
#Set to true to disable JMX.
db.disableJMX=false
#Name of the pool for JMX and thread names.
db.poolName=logistics
#Min no of prepared statements to cache.
db.statementsCacheSize=50
#If set to true, log SQL statements being executed.
db.logStatementsEnabled=false
#Queries taking longer than this limit to execute are logged.
db.queryExecuteTimeLimit=0
#Create more connections when we hit x% of our possible number of connections.
db.poolAvailabilityThreshold=60
25. 修改dao/service/controller/mapper类
修改dao/service/controller类,在dao工程添加新的包com.alan.mapper,并添加新类TestMapper.java。
注:主要测试select/update/事务操作。
(1)TestMapper.java
package com.alan.
import java.util.L
public interface TestMapper {
List testDB();
int testUpdate();
int testInsert();
(2)TestDaoImpl.java
package com.alan.dao.
import java.util.L
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.R
import com.alan.dao.TestD
import com.alan.mapper.TestM
import com.alan.model.TestM
@Repository(&testDao&)
public class TestDaoImpl implements TestDao {
@Autowired
private TestMapper testM
public String test() {
return &../index.html&;
public TestModel testModel() {
TestModel testModel = new TestModel();
testModel.setId(1);
testModel.setName(&tt&);
return testM
public List testDB() {
return testMapper.testDB();
public int testUpdate(){
return testMapper.testUpdate();
public int testInsert(){
return testMapper.testInsert();
(3)TestServiceImpl.java
注:testTx()方法会抛出异常以便测试事务。
package com.alan.service.
import java.util.L
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.S
import org.springframework.transaction.annotation.P
import org.springframework.transaction.annotation.T
import com.alan.dao.TestD
import com.alan.model.TestM
import com.alan.service.TestS
@Service(&testService&)
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testD
public String test() {
return testDao.test();
public TestModel testModel() {
return testDao.testModel();
public List testDB() {
return testDao.testDB();
public int testUpdate(){
return testDao.testUpdate();
public int testInsert(){
return testDao.testInsert();
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
public void testTx(Integer nullInt){
testUpdate();
nullInt.intValue();
testInsert();
(4)testController.java
package com.alan.
import java.util.L
import org.slf4j.L
import org.slf4j.LoggerF
import org.springframework.beans.factory.annotation.A
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RestC
import com.alan.model.TestM
import com.alan.service.TestS
@RestController
@RequestMapping(&/alan&)
public class TestController {
private Logger logger = LoggerFactory.getLogger(TestController.class);
@Autowired
private TestService testS
@RequestMapping(&/test&)
public String test(){
logger.debug(&enter into test&);
return testService.test();
@RequestMapping(&/test-model&)
public TestModel testModel(){
return testService.testModel();
@RequestMapping(&/test-db&)
public List testDB(){
return testService.testDB();
@RequestMapping(&/test-update&)
public int testUpdate(){
return testService.testUpdate();
@RequestMapping(&/test-tx&)
public String testTx(){
testService.testTx(null);
return &success&;
26. 添加TestMapper.xml
在dao工程的src/main/resources/mapper目录下,添加TestMapper.xml。
select user_id, mobile from basic_user_info limit 10
insert into basic_user_info(user_id,mobile,status)
values(3,'123x456x789',1)
前提:数据库建好了表,并插入了相关数据,至少包含3列:user_id,mobile,status。
(1)测试select
(2)测试update
(3)测试事务
浏览器报错,后台日志回滚,数据库未插入id为3的数据,说明事务测试成功。
至此,表示mybatis配置正确,并支持事务。
六、编写通用类
我们知道项目中基本每个表都会有增删改查这些方法,要是针对每个表都要写这么一大堆重复的方法着实让人心烦,这章我们来写通用的类以提高开发的效率。
28. 新建common工程
为方便我们直接建在父工程下了,按实际项目经验,common工程应该是一个独立的工程。
切换到父工程,执行以下命令。
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.mon -DartifactId=alan-springmvc-common -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0
同样,删除pom.xml文件中的groupId和versiong两行,删除自动生成的Junit依赖。
29. 新建各通用类
以下类都放在common工程相应的包下。
(1)BaseMapper.java
package com.alan.parent.
import java.util.L
public interface BaseMapper {
T queryById(int id);
List queryAll();
int add(T t);
int update(T t);
int delete(int id);
(2)BaseSqlDao.java
注意:此接口是包访问权限。
package com.alan.parent.
import java.util.L
import java.util.M
interface BaseSqlDao {
T queryVoByParam(Map param);
List queryListByParam(Map param);
void multipleDML(Map param);
(3)BaseSqlDaoImpl.java
注意:此类直接调用mybatis的API操作*Mapper.xml文件,跳过了*Mapper.java,具体使用方法后续介绍。其中,multipleDML方法暂不实现,有兴趣的可以参考另一篇博客。
package com.alan.parent.
import java.util.L
import java.util.M
import javax.annotation.R
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
class BaseSqlDaoImpl implements BaseSqlDao {
private SqlSessionFactory sqlSessionF
private String baseMapperP
public String getBaseMapperPath() {
return baseMapperP
public void setBaseMapperPath(String baseMapperPath) {
this.baseMapperPath = baseMapperP
T queryVoByParam(Map param) {
SqlSession session = sqlSessionFactory.openSession();
return session.selectOne(baseMapperPath + &.& + param.get(&mapperName&) + &.& + param.get(&selectId&), param);
List queryListByParam(Map param) {
SqlSession session = sqlSessionFactory.openSession();
return session.selectList(baseMapperPath + &.& + param.get(&mapperName&) + &.& + param.get(&selectId&), param);
public void multipleDML(Map param) {
(4)BaseDao.java
package com.alan.parent.
import java.util.L
import java.util.M
public interface BaseDao {
T queryById(int id);
List queryAll();
int add(T t);
int update(T t);
int delete(int id);
T queryVoByParam(Map param);
List queryListByParam(Map param);
void multipleDML(Map param);
(5)BaseDaoImpl.java
注意:此类中注入了BaseSqlDao实例。
package com.alan.parent.
import java.util.L
import java.util.M
import javax.annotation.PostC
import javax.annotation.R
import com.alan.parent.mapper.BaseM
public abstract class BaseDaoImpl implements BaseDao {
private BaseSqlDao baseSqlD
private BaseMapper
@PostConstruct
public void initMapper() {
this.mapper = init();
public abstract BaseMapper init();
public T queryById(int id) {
return mapper.queryById(id);
public List queryAll() {
return mapper.queryAll();
public int add(T t) {
return mapper.add(t);
public int update(T t) {
return mapper.update(t);
public int delete(int id) {
return mapper.delete(id);
public T queryVoByParam(Map param){
return baseSqlDao.queryVoByParam(param);
public List queryListByParam(Map param){
return baseSqlDao.queryListByParam(param);
public void multipleDML(Map param){
baseSqlDao.multipleDML(param);
(6)BaseService.java
package com.alan.parent.
import java.util.L
import java.util.M
public interface BaseService {
T queryById(int id);
List queryAll();
int add(T t);
int update(T t);
int delete(int id);
T queryVoByParam(Map param);
List queryListByParam(Map param);
void multipleDML(Map param);
(7)BaseServiceImpl.java
package com.alan.parent.
import java.util.L
import java.util.M
import javax.annotation.PostC
import com.alan.parent.dao.BaseD
public abstract class BaseServiceImpl implements BaseService {
private BaseDao
@PostConstruct
public void initDao(){
this.dao = init();
public abstract BaseDao init();
public T queryById(int id) {
return dao.queryById(id);
public List queryAll() {
return dao.queryAll();
public int add(T t) {
return dao.add(t);
public int update(T t) {
return dao.update(t);
public int delete(int id) {
return dao.delete(id);
public T queryVoByParam(Map param) {
return dao.queryVoByParam(param);
public List queryListByParam(Map param) {
return dao.queryListByParam(param);
public void multipleDML(Map param) {
dao.multipleDML(param);
(8)BaseController.java
注意,此类有五个方法加了@RequestMapping注解,这样继承了这个类的Controller就可以直接使用这些方法了,后续介绍使用方法。
package com.alan.parent.
import java.util.L
import java.util.M
import javax.annotation.PostC
import org.springframework.web.bind.annotation.RequestM
import com.alan.parent.service.BaseS
public abstract class BaseController {
private BaseService
@PostConstruct
public void initService() {
this.service = init();
public abstract BaseService init();
@RequestMapping(&/queryById&)
public T queryById(int id) {
return service.queryById(id);
@RequestMapping(&/queryAll&)
public List queryAll() {
return service.queryAll();
@RequestMapping(&/add&)
public int add(T t) {
return service.add(t);
@RequestMapping(&/update&)
public int update(T t) {
return service.update(t);
@RequestMapping(&/delete&)
public int delete(int id) {
return service.delete(id);
public T queryVoByParam(Map param) {
return service.queryVoByParam(param);
public List queryListByParam(Map param) {
return service.queryListByParam(param);
public void multipleDML(Map param) {
service.multipleDML(param);
30. 新建spring-common.xml配置文件
在common工程的src/main/resource/META-INFO目录下新建spring-common.xml文件,用于配置baseSqlDao。
31. 引入spring-common.xml配置文件
在web工程的dispatcher.xml文件中引入上述配置文件。
数据库中新建一个user_info表,并随意插入几条数据,用于测试上述通用类。
create table user_info
name varchar(50),
mobile varchar(11)
(1)实体类UserInfo.java
在dao工程下新建包com.alan.entity,将实体类置于其下。
package com.alan.
public class UserInfo {
public Integer getId() {
public void setId(Integer id) {
public String getName() {
public void setName(String name) {
this.name =
public String getMobile() {
public void setMobile(String mobile) {
this.mobile =
(2)UserInfoMapper.java
直接继承BaseMapper接口。
package com.alan.
import com.alan.entity.UserI
import com.alan.parent.mapper.BaseM
public interface UserInfoMapper extends BaseMapper{
(3)UserInfoDao.java
直接继承BaseDao接口。
package com.alan.
import com.alan.entity.UserI
import com.alan.parent.dao.BaseD
public interface UserInfoDao extends BaseDao{
(4)UserInfoDaoImpl.java
继承BaseDaoImpl并实现UserInfoDao接口,注入userInfoMapper,并覆写init方法,传入userInfoMapper,这样就可以直接使用BaseDaoImpl中的方法了。
package com.alan.dao.
import javax.annotation.R
import org.springframework.stereotype.R
import com.alan.dao.UserInfoD
import com.alan.entity.UserI
import com.alan.mapper.UserInfoM
import com.alan.parent.dao.BaseDaoI
import com.alan.parent.mapper.BaseM
@Repository(&userInfoDao&)
public class UserInfoDaoImpl extends BaseDaoImpl implements UserInfoDao{
private UserInfoMapper userInfoM
public BaseMapper init() {
return userInfoM
(5)UserInfoService.java
package com.alan.
import com.alan.entity.UserI
import com.alan.parent.service.BaseS
public interface UserInfoService extends BaseService {
(6)UserInfoServiceImpl.java
package com.alan.service.
import javax.annotation.R
import org.springframework.stereotype.S
import com.alan.dao.UserInfoD
import com.alan.entity.UserI
import com.alan.parent.dao.BaseD
import com.alan.parent.service.BaseServiceI
import com.alan.service.UserInfoS
@Service(&userInfoService&)
public class UserInfoServiceImpl extends BaseServiceImpl implements UserInfoService {
private UserInfoDao userInfoD
public BaseDao init() {
return userInfoD
(7)UserInfoController.java
继承自BaseController,并初始化userInfoService,并新增加了两个方法queryUserInfoByMobile和queryUserInfoByName(假设手机号不重复,名字可重复),分别调用父类的queryVoByParam和queryListByParam方法,使用这两个方法,直接service/dao/mapper里的方法都不用写了,直接操作mapper.xml文件,非常之方便,当然,如果有点逻辑还是放在service里比较清晰一点。
package com.alan.
import java.util.HashM
import java.util.L
import java.util.M
import javax.annotation.R
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RestC
import com.alan.entity.UserI
import com.alan.parent.controller.BaseC
import com.alan.parent.service.BaseS
import com.alan.service.UserInfoS
@RestController
@RequestMapping(&/userInfo&)
public class UserInfoController extends BaseController {
private UserInfoService userInfoS
public BaseService init() {
return userInfoS
@RequestMapping(&/queryUserInfoByMobile&)
public UserInfo queryUserInfoByMobile(String mobile){
Map param = new HashMap&&();
param.put(&mobile&, mobile);
param.put(&mapperName&,&UserInfoMapper&);
param.put(&selectId&, &queryUserInfoByMobile&);
return queryVoByParam(param);
@RequestMapping(&/queryUserInfoByName&)
public List queryUserInfoByName(String name){
Map param = new HashMap&&();
param.put(&name&, name);
param.put(&mapperName&,&UserInfoMapper&);
param.put(&selectId&, &queryUserInfoByName&);
return queryListByParam(param);
在dao工程的src/main/resources/mapper目录中新建UserInfoMapper.xml文件。
id, name, mobile
#{id}, #{name}, #{mobile}
insert into user_info ()
delete from user_info where id = #{id}
启动tomcat,中测试各方法的执行。
(1)queryById
(2)queryAll
(4)update
(5)delete
(6)queryUserInfoByMobile
(7)queryUserInfoByName
可见,以上各方法都可正确执行,表示我们的通用类编写完美。
七、自动生成代码
从上述编写过程中可见,user_info这一个表,就要写实体类/mapper/dao/service/controller等这么多个类(包括mapper.xml),而且每个类中内容的形式基本保持一致,除了userInfo标识不同。那么,有没有方法不用写这些类呢, 答案是肯定的,下面我们就自己编写一个简单的代码生成工具。
~~~~~~~~~~~未完待续~~~~~~~~~~~~~~~~~~~~~~~
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 英雄联盟怎么返回大厅 的文章

 

随机推荐