Quick Spring——一款在main方法中使用spring语法的敏捷框架

框架介绍

功能

让普通非web项目在使用main方法启动的时候,也能随意使用spring@Service@Autowired等语法,同时该项目整合了mybatis,方便了普通非web项目对数据库的操作。

设计思路

我在研究爬虫框架的时候,发现大多是爬虫框架都是通过main方法启动的,因为它们并不需要web容器,所以为了轻量级,都避开了与springMVC的整合。但是我个人习惯了spring的语法,同时并不喜欢原生JdbcTemplate的操作,更喜欢mybatis,所以设计了Quick Spring
它使普通项目与springspring-corespring-context两个模块简单整合,同时使用mybatis,方便了对数据库的操作。

源码地址

https://github.com/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() {

        logger.info("这是{}方法","test()");

        System.out.println("test Service");
    }

    public void find(Integer id) {

        logger.info("这是{}方法","find()");

        Test test = testMapper.selectByPrimaryKey(id);
        System.out.println(test.getText());
    }
    public void update(Test test) {
        testMapper.updateByPrimaryKeySelective(test);
    }
}

其中logger是典型的slf4j框架的使用方法,testMappermybatis的mapper,mapper的代码就没必要贴出来了,需要使用mybatis的自己使用工具生成就是了。
生成工具(实现中文注释)地址:https://github.com/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)

很明显,loggermybatis都成功使用了。

猜你喜欢

转载自blog.csdn.net/Mr_OOO/article/details/79220672
今日推荐