一、核心配置
1、配置mybatis-config.xml(可选,1.3以后可不配置)
2、配置mapper.xml
3、配置db.properties
4、配置spring-context.xml
5、配置spring-mybatis.xml
7、配置spring-mvc.xml
8、配置web.xml
9、配置logback.xml
二、导入相应的jar包
1、properties版本声明
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.1.9.RELEASE</spring.version>
<mybatis.version>3.5.1</mybatis.version>
<mybatis-spring.version>2.0.2</mybatis-spring.version>
<mysql-connector.version>8.0.17</mysql-connector.version>
<slf4j-api.version>1.7.25</slf4j-api.version>
<logback.version>1.2.3</logback.version>
<logback-spring.version>0.1.5</logback-spring.version>
<lombok.version>1.18.8</lombok.version>
<druid.version>1.1.19</druid.version>
<junit.version>4.12</junit.version>
<fastjson.version>1.2.59</fastjson.version>
</properties>
2、Spring相关
<!--核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--第三方orm框架-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!--事物管理-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!--切面编程包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
3、SpringMVC
<!--spring mvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
4、MyBatis
<!--MyBatis核心包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--MyBatis 对spring支持-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
5、druid连接池与mysql驱动
<!--druid连接池池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mysql driver-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
6、json数据
<!--fastjsion 需要配置-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 二选一 -->
<!-- 或者使用jackson 默认无需配置-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
7、logback日志
<!--slf4j 日志接口 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<!--logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>${logback-spring.version}</version>
</dependency>
8、其它
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
三、Spring+Mybatis整合
1、说明
- 配置数据库相关参数properties的属性:通过${}来获取属性值
- 数据库连接池
- 配置SqlSessionFactory对象 这一步非常重要。把entity扫面和mapper.xml扫描配置进去
- 配置扫描DAO接口包 目的:动态实现DAO接口,并注入到Spring容器中,最能节省工作量的配置
2、spring-context.xml
开启注解扫描
<context:component-scan base-package="com.werner.ssm"/>
<!--
1. <context:component-scan>扫描和@Component相关的注解。其中包括@Controller,@Service,@Repository等,这些都是从@Component中继承而来的;并且完成对应注解内容的注入,也就是说这个标签它涵盖了下面这个标签的功能。
2 . <context:annotation-config> 扫描和@Autowired相关、相似的注解。其中包括@Required,@Autowired等等,这些标签有些是JSR规范的,所以Java原生的辅助注解。
2. <mvc:annotation-driven> 扫描Java配置MVC的部分,官网的内容指示的是:@EnableWebMvc,@Configuration修饰的一个类,等同于编程式声明。然后扫这个类就知道了mvc的配置,如果用了xml根本不需
-->
3、spring-mybatis.xml
配置properties
<!--1.配置数据库相关参数
properties的属性:通过${}来获取属性值
-->
<context:property-placeholder location="classpath:db.properties"
ignore-unresolvable="true"
order="1"
ignore-resource-not-found="true" />
配置SqlSessionFactory
<!--3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBatis全局配置文件:mybatis-config.xml mybatis-spring1.3以后可以不配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 扫描entity包 使用别名 -->
<property name="typeAliasesPackage" value="com.werner.ssm.domain.entity"/>
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<!-- 这句配置mapper配置文件的位置 如果采用注解的方式这句可以省去 -->
<property name="mapperLocations" value="classpath:mappers/**/*.xml"/>
</bean>
扫描Mapper接口
<!--4 Mapper接口所在包名,Spring自动扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="com.werner.ssm.mapper"
p:sqlSessionFactoryBeanName="sqlSessionFactory"
/>
4、连接池配置
spring-mybatis.xml
<!-- -->
<context:property-placeholder location="classpath:db.properties"
ignore-unresolvable="true"
order="1"
ignore-resource-not-found="true" />
<!-- 在上面的配置中,通常你需要配置url、username、password,maxActive这三项。
Druid会自动跟url识别驱动类名,如果连接的数据库非常见数据库,配置属性driverClassName
asyncInit是1.1.4中新增加的配置,如果有initialSize数量较多时,打开会加快应用启动时间
-->
<bean id="dataSource"
class="com.alibaba.druid.pool.DruidDataSource"
p:username="${username}"
p:url="${url}"
p:password="${password}">
<!-- 初始化连接大小 -->
<property name="initialSize" value="${druid.initialSize}"/>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${druid.maxActive}"/>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${druid.minIdle}"/>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${druid.maxWait}"/>
<!-- 指明连接是否被空闲连接回收器(如果有)进行检验 -->
<property name="testWhileIdle" value="${druid.testWhileIdle}"/>
<!-- 运行一次空闲连接回收器的时间间隔(60秒) -->
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}"/>
<!-- 验证时使用的SQL语句 -->
<property name="validationQuery" value="${druid.validationQuery}"/>
<!-- 申请连接时不要测试,否则很影响性能 -->
<property name="testOnBorrow" value="false"/>
</bean>
db.properties
# ========druid 配置参数========
# 初始化时建立物理连接的个数 默认0
druid.initialSize=5
# 最小连接池数量
druid.minIdle=10
# 最大连接池数量
druid.maxActive=50
# 获取连接时最大等待时间
druid.maxWait=30000
#空闲回收期运行周期(60秒)
druid.timeBetweenEvictionRunsMillis=60000
# 连接保持空闲而不被回收的最小时间
druid.minEvictableIdleTimeMillis=300000
#用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。
druid.validationQuery=SELECT 'x'
#建议配置为true,不影响性能,并且保证安全性。
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,
#执行validationQuery检测连接是否有效
druid.testWhileIdle=true
# 申请连接时执行validationQuery检测连接是否有效
druid.testOnBorrow=false
druid.testOnReturn=false
# 是否缓存preparedStatement
druid.poolPreparedStatements=true
#可以把这个数值配置大一些,比如说100
druid.maxPoolPreparedStatementPerConnectionSize=5100
# 常用的插件有:
# 监控统计用的filter:stat
# 日志用的filter:log4j
# 防御sql注入的filter:wall
druid.filters=wall,stat
配置 | 缺省值 | 说明 |
---|---|---|
name | 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。详情-点此处。 | |
url | 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | |
username | 连接数据库的用户名 | |
password | 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里 | |
driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 | |
poolPreparedStatements | false | 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 |
maxPoolPreparedStatementPerConnectionSize | -1 | 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 |
validationQuery | 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 | |
validationQueryTimeout | 单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法 | |
testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 |
keepAlive | false (1.0.28) | 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。 |
timeBetweenEvictionRunsMillis | 1分钟(1.0.14) | 有两个含义: 1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 |
numTestsPerEvictionRun | 30分钟(1.0.14) | 不再使用,一个DruidDataSource只支持一个EvictionRun |
minEvictableIdleTimeMillis | 连接保持空闲而不被驱逐的最小时间 | |
connectionInitSqls | 物理连接初始化的时候执行的sql | |
exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall | |
proxyFilters | 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系 |
四、SpringMVC整合
1、说明
主要配置
- 注解的启动
- 自动扫描控制器,
- 视图模式,
- 静态资源的处理
其它配置
- 配置文件上传
- 第三方json整合(fastjson)
- 避免IE执行AJAX时,返回JSON出现下载文件
2、spring-mvc.xml
开启注解模式
<!-- 1.开启SpringMVC注解模式 -->
<!-- 简化配置:
1>自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
2>提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持
-->
<mvc:annotation-driven/>
不扫描Service层
<!--2. 由子容器扫描装配了@Service 注解的实例。
spring的context是父子容器,由ServletContextListener
加载spring配置文件产生的是父容器,springMVC加载配置文件产生的是子容器,
子容器对Controller进行扫描装配时装配了@Service注解的实例
(@Controller 实例依赖@Service实例),
而该实例理应由父容器进行初始化以保证事务的增强处理,
所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力)
-->
<context:component-scan base-package="com.werner.ssm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
对静态资源文件的访问
方式一
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/projectjs/" mapping="/projectjs/**"/>
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/fonts/" mapping="/fonts/**"/>
<mvc:resources location="/WEB-INF/resources/" mapping="/resources/**"/>
方式二
<!-- 3.静态资源默认servlet配置
1> 加入对静态资源的处理:js,gif,png,pdf,word
3>允许使用"/"做整体映射
-->
<mvc:default-servlet-handler/>
<!-- 或者使用mvc标签-->
fastjson数据整合
fastjson配置
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!--避免IE执行AJAX时,返回JSON出现下载文件,指定字符集-->
<property name="supportedMediaTypes" value="application/json;charset=UTF-8"/>
<property name="fastJsonConfig">
<bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
<!--指定默认输出的日期格式-->
<property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
<!--序列化对象配置 可选-->
<property name="serializerFeatures">
<array>
<!--输出key时是否使用双引号,默认为true-->
<value>QuoteFieldNames</value>
<!--将JavaBean序列化为带格式的JSON文本-->
<value>PrettyFormat</value>
<!--是否输出值为null的字段,默认为false-->
<value>WriteMapNullValue</value>
<!--List字段若为null,输出[],而非null-->
<value>WriteNullListAsEmpty</value>
<!--数值字段若为null,输出0,而非null-->
<value>WriteNullNumberAsZero</value>
<!--字符类型字段若为null,输出”“,而非null-->
<value>WriteNullStringAsEmpty</value>
<!--Boolean字段若为null,输出false,而非null-->
<value>WriteNullBooleanAsFalse</value>
<!--日期格式化-->
<value>WriteDateUseDateFormat</value>
</array>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
Jackson配置
<!--Jackson2 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
配置jsp(可选)
<!-- 4.配置jsp 显示ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
配置文件上传(可选)
<!-- 5.配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
五、web.xml
Spring配置文件加载
<!-- 1 加载Spring Mybatis配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
注册springMVC
<!--2 注册springMVC-->
<servlet>
<servlet-name>dispatch</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatch</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
logback日志
<!-- 加载logback配置文件-->
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>classpath:logback.xml</param-value>
</context-param>
<listener>
<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>
其它
<!--设置默认启动页-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
六、logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<!--改成你自己的-->
<property name="LOG_HOME" value="../logs"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/error.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
七、其它常用第三方库
1.Apache POI 处理office文档用到的
2. IText PDF操作类库
3.Java Base64 Base64编码类库
4.Commons-lang 对应java sdk里面的java.lang包,用来简化基本工具类操作
5.pingyin4j 中文转拼音库
6.Commons-IO,处理IO的工具包
7.Commons-beanutils 用来处理javaBean类的反射,内省的工具包
8.Commons-codec 处理常用加密编码
9.Commons-collections 对各种集合类的封装
10.patchca Java验证码类库
11.Commons Configuration Java配置文件管理类
12.CGLib Java动态代理类库
13.Super CSV Java Csv格式读写类库
14.com4j 使用java调用com的类库
15.util.concurrent JAVA并发开发包
16.Jsapar JAVA文本文件处理包
17.Dregexp 正则表达式类库
18.JEgg Java多线程开发包
19.SmartPagination 页面数据分页处理20.Dom4j xml解析类
20.xml解析四种模式DOM,SAX,JDOM,DOM4J
21.SLF4J 日志处理软件包,底层可以支持log4j,commonlog,JDKLOG等等。
22.Apache MINA TCP/IP通信非阻塞框架,可以实现高性能的NIO通信机制。
23.JBossNetty 同22,JBOSS提供的一个开源框架,适合高并发连接。
24.httpclient apache开源框架,实现http协议的各项操作。
25.google Guice 一个开源JAVA实现的IOC框架,据说性能高于spring100倍,希望你可以验证下。
26.CGLIB 一个动态代理实现的框架,hibernate,spring等框架里的动态代理实现。
27.JBOSS JBPM 工作流引擎开源框架。
28.DROOLS 规则引擎开源框架,商业的有ILOG(IBM拥有)。
29.JEgg 是一个框架用来减少开发可靠的多线程 Java 应用程序的复杂度。JEgg 采用的是活动对象 Active Object 设计模式。
30.IK Expression是一个开源的(OpenSource),可扩展的(Extensible),基于java语言开发的一个超轻量级(Super lightweight)的公式化语言解析执行工具包。
IK Expression V2.0不依赖于任何第三方的java库。它做为一个简单的jar,可以集成于任意的Java应用中。这包括了JavaEE应用(基于应用服务器的), Java桌面应用以及Java WebStart方式的应用。
IK Expression最初诞生的原因是为了能增强工作流引擎,如jBPM等对流程配置的灵活度。使其能在流程运行期获得同配置期一样灵活地对执行逻辑条件进行变更。经过扩展后的IK Expression还可以适用于各种常规业务系统的动态条件配置,如需要图形化配置应用的场合,或是模拟Excel电子表格的公式运算的场景。
31.date4j是一个用于简化日期和时间操作的Java工具。可以替换java.util.Date。
网友评论