- 框架介绍
- 功能
- 设计思路
- 源码地址
- 使用介绍
- 测试项目目录结构
- 导入maven
- maven地址
- 配置文件
- quick-applicationContextxml
- log4jproperties
- applicationproperties
- 启动类
- Server类
- main方法启动
- 测试结果
框架介绍
功能
让普通非web项目在使用main方法启动的时候,也能随意使用spring的@Service,@Autowired等语法,同时该项目整合了mybatis,方便了普通非web项目对数据库的操作。
设计思路
我在研究爬虫框架的时候,发现大多是爬虫框架都是通过main方法启动的,因为它们并不需要web容器,所以为了轻量级,都避开了与springMVC的整合。但是我个人习惯了spring的语法,同时并不喜欢原生JdbcTemplate的操作,更喜欢mybatis,所以设计了Quick Spring。 它使普通项目与spring的spring-core和spring-context两个模块简单整合,同时使用mybatis,方便了对数据库的操作。
源码地址
https:///a252937166/quick-spring
使用介绍
测试项目目录结构
图(1)
导入maven
如何创建maven项目就不多介绍了,不懂得同学可以看一下idea如何创建maven项目(一),超简单的。
maven地址:
<dependency>
<groupId>com.ouyanglol</groupId>
<artifactId>quick-spring</artifactId>
<version>1.0</version>
</dependency>
图(2)
配置文件
Quick Spring会扫描resource下以quick-开头的xml文件,默认为spring的配置文件,配置语法和普通spring配置一样,我这里提供简单模板,需要个性化配置的,可以自己改。
quick-applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--选择最流行的druid连接池-->
<bean id="mybatisDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${database.driverClassName}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<!-- 初始化连接数量 -->
<property name="initialSize" value="${druid.initialSize}" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="${druid.minIdle}" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="${druid.maxActive}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${druid.maxWait}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${druid.validationQuery}" />
<property name="testWhileIdle" value="${druid.testWhileIdle}" />
<property name="testOnBorrow" value="${druid.testOnBorrow}" />
<property name="testOnReturn" value="${druid.testOnReturn}" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。 -->
<property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="${druid.maxPoolPreparedStatementPerConnectionSize}" />
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="${druid.filters}" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="mybatisDataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:mapper/*.xml</value>
</list>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ouyang.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!--选择自动扫描路径-->
<context:component-scan base-package="com.ouyang"/>
<!--选择配置文件-->
<context:property-placeholder location="classpath:application.properties" />
</beans>
其中<context:component-scan base-package="com.ouyang"/>,<property name="basePackage" value="com.ouyang.dao"/>和<context:property-placeholder location="classpath:application.properties" />大家根据自己项目路径自己改一下。
log4j.properties
log4j.rootLogger=DEBUG,stdout,D,E,I
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r:%L] - [%p] %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /data/log/quick.debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
### 输出到日志文件 ###
log4j.appender.I = org.apache.log4j.DailyRollingFileAppender
log4j.appender.I.File = /data/log/quick.info.log
log4j.appender.I.Append = true
log4j.appender.I.Threshold = INFO
log4j.appender.I.layout = org.apache.log4j.PatternLayout
log4j.appender.I.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = /data/log/quick.error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
我顺便把日志也整合了,日志我用的是slf4j整合log4j,也是当下最流行的选择,使用方法很简单,等下java代码里简单介绍一下。 其中日志的输出路径,大家可以根据自己的需求修改一下。
application.properties
database.driverClassName=com.mysql.cj.jdbc.Driver
database.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false
database.username=mysql
database.password=123456
druid.initialSize=10
druid.minIdle=6
druid.maxActive=50
druid.maxWait=60000
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.validationQuery=SELECT 1
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.poolPreparedStatements=false
druid.maxPoolPreparedStatementPerConnectionSize=20
druid.filters=wall,stat
统一记录配置信息。
启动类
MyQuick.java
package com.ouyang.quick;
import com.ouyang.service.TestService;
import com.ouyanglol.annotation.QuickSpring;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Package: com.ouyang.quick
*
* @Author: Ouyang
* @Date: 2018/1/29
*/
@QuickSpring
public class MyQuick {
@Autowired
TestService testService;
public void test() {
testService.test();
System.out.println("MyQuick");
}
}
我个人建议启动类都放在quick的包路径下(当然也可以自定义),只需要加上@QuickSpring注释就行了,启动类中可以随意使用spring注释,name默认为类名,当然可以可自己修改。
TestQuick.java(自定义name和包路径) 从项目路径可以看到,该文件在com.ouyang.test包路径下。
package com.ouyang.test;
import com.ouyang.model.Test;
import com.ouyang.service.TestService;
import com.ouyanglol.annotation.QuickSpring;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Package: com.ouyang.test
*
* @Author: Ouyang
* @Date: 2018/1/29
*/
@QuickSpring(name = "myTest")
public class TestQuick {
@Autowired
TestService testService;
public void test() {
testService.test();
System.out.println("TestQuick");
}
public void update(Test test) {
testService.update(test);
}
}
Server类
TestServer.java
package com.ouyang.service;
import com.ouyang.dao.TestMapper;
import com.ouyang.model.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Package: com.ouyang.service
*
* @Author: Ouyang
* @Date: 2018/1/26
*/
@Service
public class TestService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
TestMapper testMapper;
public void test() {
("这是{}方法","test()");
System.out.println("test Service");
}
public void find(Integer id) {
("这是{}方法","find()");
Test test = testMapper.selectByPrimaryKey(id);
System.out.println(test.getText());
}
public void update(Test test) {
testMapper.updateByPrimaryKeySelective(test);
}
}
其中logger是典型的slf4j框架的使用方法,testMapper是mybatis的mapper,mapper的代码就没必要贴出来了,需要使用mybatis的自己使用工具生成就是了。 生成工具(实现中文注释)地址:https:///a252937166/mybatis-generator-core-1.3.2
main方法启动
App.java
package com.ouyang;
import com.ouyang.model.Test;
import com.ouyang.quick.MyQuick;
import com.ouyang.service.TestService;
import com.ouyang.test.TestQuick;
import com.ouyanglol.core.QuickBase;
/**
* Hello world!
*
*/
public class App {
public static void main( String[] args ) {
QuickBase quickBase = QuickBase.getInstance();//初始化quick包下的启动类
MyQuick quick = (MyQuick) quickBase.getQuick("MyQuick");
quick.test();
QuickBase quickBase1 = QuickBase.getInstance("test");//初始化test包下的启动类
TestQuick quick1 = (TestQuick) quickBase1.getQuick("myTest");
quick1.test();
TestService testService = (TestService) quickBase.getBean("testService");
testService.test();
testService.find(1);
testService.find(2);
testService.find(3);
testService.find(4);
}
}
首先使用QuickBase quickBase = QuickBase.getInstance();初始化需要使用的启动类,如果不是在quick包下,需要手动填入包名。
quickBase.getQuick();
这个方法获取启动类,其中myTest与@QuickSpring(name = "myTest")中的name对应,不填name就默认是类名。获取之后就是随意调用方法了。直接启动main方法就能使用了。
quickBase.getBean("testService")
这个方法可以单独获取spring的bean对线。
测试结果
图(3)
很明显,logger和mybatis都成功使用了。