5. Spring、Mybatis整合Service层事务控制优化思路分析

# spring中处理事务的两种方式1. 编程式事务处理定义:通过在业务层中注入事务管理器对象,然后通过编码的方式进行事务控制缺点:1. 代码冗余2. 不够通用3. 不便于维护2. 声明式事务处理      [推荐]定义:通过利用aop切面编程进行事务控制 并对事务属性在配置文件中完成细粒度配置 这种方式 称之为声明事务好处:通用    减少代码冗余  更加专注于业务逻辑开发 无需重复编码
# spring、mybatis整合开发之Service层事务优化1. 自定义完成事务管理a. 开发基于事务的通知    环绕通知TransactionAdvice implements MethodInterceptor{private PlatformTransactionManager ts;   set;public Object invoke(MethodInvocation mi) throws Throwable {// 创建事务配置对象TransactionDefinition transactionDefinition = new DefaultTransactionDefinition();// 获取事务状态TransactionStatus status = ts.getTransaction(transactionDefinition);// 放行目标方法try{Object result = mi.proceed();  // 放行ts.commit(status); // 提交事务return result;}catch(Expection e){ts.rollback(status);}}         }b. 配置切面1). 配置通知对象<bean class="xxx.TransactionAdvice" id="tx"><property name="ts" ref="dataSourceTransactionManager"/></bean>2). 配置切面<aop:config><aop:pointcut id="pc" expression="within(com.baizhi.service.*SerbiceImpl)"/><aop:advisor advice-ref="tx" pointcut-ref="pc"/></aop:config>2. Spring框架开发声明式事务编程a. spring框架提供 tx:advice 标签作用:1. 可以根据事务管理器创建一个基于事务环绕通知对象2. tx:advice标签可以对事务进行细粒度控制(不使用bean标签的原因是tx:advice不仅可以在工厂中创建环绕通知对象,还可                                                以进行细粒度的控制)// 创建出来的通知对象在工厂中唯一标识  // 这个transactionManager类似于ref,传入id<tx:advice id="transactionAdvice" transactionManager="事务管理器是谁"><!--事务细粒度控制:基于方法层面--><tx:attributes><tx:method name="save"/><!--<tx:method name="save*,支持通配符"/>--><!--<tx:method name="delete,以后还要对其他方法进行事务控制,再在attributes里面写就行了"/>--></tx:attributes></tx:advice></tx:advice>b. 配置切面<aop:config><aop:pointcut id="pc" expression="within(com.baizhi.service.*SerbiceImpl)"/><aop:advisor advice-ref="tx" pointcut-ref="pc"/></aop:config>

在上一篇博客我们可以看到,在Service层进行事务控制时,需要在声明一个事务管理器成员变量,而且在使用时还要传入事务状态特别麻烦,并且在进行增加、删除、修改时都要进行这样的操作,在一定程度上造成了代码的冗余。我们可以联系到前面学过的通知的知识,我们可以自定义一个环绕通知进行事务控制,并在配置文件中注册,之后装配切面就可以了,相关代码如下:

  • 自定义环绕通知类:
// 自定义环绕通知类必须实现系统定义的环绕通知接口
TransactionAdvice implements MethodInterceptor{private PlatformTransactionManager ts;   set;public Object invoke(MethodInvocation mi) throws Throwable {// 创建事务配置对象TransactionDefinition transactionDefinition = new DefaultTransactionDefinition();// 获取事务状态TransactionStatus status = ts.getTransaction(transactionDefinition);// 放行目标方法try{Object result = mi.proceed();  // 放行ts.commit(status); // 提交事务return result;}catch(Expection e){ts.rollback(status);}}         }
  • 配置文件:
     <!--1). 配置通知对象--><bean class="xxx.TransactionAdvice" id="tx"><property name="ts" ref="dataSourceTransactionManager"/></bean><!--2). 配置切面--><aop:config><aop:pointcut id="pc" expression="within(com.baizhi.service.*SerbiceImpl)"/><aop:advisor advice-ref="tx" pointcut-ref="pc"/></aop:config>

利用环绕通知可以解决以前我们在进行事务控制时所产生的许多问题。由于自定义环绕通知这段代码无论谁来写都是一样的,所以框架提供了官方类,使用这个官方类就可以起到和上面自定义环绕通知进行事务控制一样的作用,而且非常方便,这就是spring框架开发声明式事务编程

在声明式事务编程中我们需要使用tx:advice标签(把tx:advice里面的内容就是一个环绕通知)在工厂中注册官方创建的环绕通知进行事务管理,之后再配置切面就可以了,非常方便。

  • 配置文件
<!--配置文件中部分内容--><!--数据源管理器--><!--它是用来控制数据源的线程安全问题,它不生产数据源,所以要告诉它控制哪个数据源的线程安全问题,所以要注入数据源--><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><!--注入数据源对象--><property name="dataSource" ref="dataSource"/></bean><!--tx:advice标签id:基于事务管理器创建的环绕通知对象在工厂中的唯一标识作用:1. 根据指定的事务管理器在工厂中创建一个事务的环绕通知对象2. 对业务层方法进行细粒度事务控制--> <!--注意:因为我们在自己创建环绕通知时使用了事务管理器成员变量,所以在使用官方的环绕通知管理实务操作时工厂中必须有事务管理器对象--><!--使用tx:advice标签相当于在工厂中注册了一个用于事务管理的环绕通知,可以看成是一个环绕通知--><!--id:表示这个环绕通知在工厂中的唯一id --><!--transaction-manager:传入事务管理对象在工厂中的唯一id--><tx:advice id="txAdvice" transaction-manager="transactionManager"><!--事务细粒度控制:基于方法层面--><!--如果tx:advice标签内部没有attributes进行细粒度的方法管理,实务操作是不会生效的,也就是说tx:advice内部必须使用attributes进行方法细粒度的管理--><tx:attributes><tx:method name="save"/>
<!--            <tx:method name="save*"/>-->
<!--            <tx:method name="delete"/>--></tx:attributes></tx:advice><!--配置事务切面--><aop:config><!--配置切入点--><aop:pointcut id="pc" expression="within(com.baizhi.service.*ServiceImpl)"/><!--组装切面--><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>
<!--配置文件中全部内容-->
<?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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--创建DataSource--><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/lb"/><property name="username" value="root"/><property name="password" value="root"/></bean><!--创建sqlSessionFactory--><bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"><!--因为使用了mybatis官方的创建SqlSessionFactory对象的工具类,所以不能使用mybatis的主配置文件了,主配置文件最重要的是数据源+mapper,所以我们要在这里写上数据源和mapper配置--><!--依赖数据源--><property name="dataSource" ref="dataSource"/><!--注册mapper配置文件--><property name="mapperLocations"><array><value>classpath:com/baizhi/mapper/UserDAOMapper.xml</value></array></property><!--注入别名相关配置 typeAliasesPackage:用来给指定包中所有类起别名 默认的别名:类名|类名首字母小写--><property name="typeAliasesPackage" value="com.baizhi.eneity"/></bean><!--一次性创建项目中所有DAO对象 MapperScannerConfigurerMapperScannerConfigurer:默认创建对象在工厂中唯一标识:接口的首字母小写的名字UserDAO=====> userDAO   Userdao====> userdaoOrderDAO====> orderDAO  Orderdao====> orderdaoEmpDAO====> empDAO--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--注入SqlSessionFactory--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><!--扫描DAO接口所在的包--><property name="basePackage" value="com.baizhi.dao"/></bean><!--管理Service组件--><bean class="com.baizhi.service.UserServiceImpl" name="userService"><property name="userDAO" ref="userDAO"/></bean><!--数据源管理器--><!--它是用来控制数据源的线程安全问题,它不生产数据源,所以要告诉它控制哪个数据源的线程安全问题,所以要注入数据源--><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><!--注入数据源对象--><property name="dataSource" ref="dataSource"/></bean><!--tx:advice标签id:基于事务管理器创建的环绕通知对象在工厂中的唯一标识作用:1. 根据指定的事务管理器在工厂中创建一个事务的环绕通知对象2. 对业务层方法进行细粒度事务控制--><tx:advice id="txAdvice" transaction-manager="transactionManager"><!--事务细粒度控制:基于方法层面--><tx:attributes><tx:method name="save"/>
<!--            <tx:method name="save*"/>-->
<!--            <tx:method name="delete"/>--></tx:attributes></tx:advice><!--配置事务切面--><aop:config><aop:pointcut id="pc" expression="within(com.baizhi.service.*ServiceImpl)"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config></beans>

注:这里因为是对上一篇的优化,所以大部分是一样的,这里只是把一下不一样的粘出来了

还有,不要使用错了的包的advice,要用tx包下的tx:advice标签

  • UserServiceImpl类
public class UserServiceImpl implements UserService{private UserDAO userDAO;public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}@Overridepublic List<User> findAll() {// 查询操作不需要事务控制return userDAO.findAll();}@Overridepublic void save(User user) {userDAO.save(user);//int i = 1 / 0;}
}
  • 测试和结果

测试之前的表

测试

public class TestUserService {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");UserService userService = (UserService) context.getBean("userService");//System.out.println(userService.getClass());// save// 使用数据库自动生成的主键userService.save(new User(null, "百知教育", 23, new Date()));// findAlluserService.findAll().forEach(user -> System.out.println("user = " + user));}
}

有异常时:

查看数据库中的表:

可以看到有异常时事务回滚了

我们再来看看没有异常时的执行结果:

执行之后表中记录:

我们可以看到,我们成功的使用官方创建的用于事务管理的环绕通知对事务进行了成功的管理。

6. Spring、Mybatis整合之最终编码

所有需要用到的类以及包结构:

步骤:

  1. 引入依赖
  2. 建表
  3. 实体类
  4. DAO接口
  5. Mapper配置文件
  6. Service接口
  7. Service实现类
  8. 编写Spring、Mybatis整合配置Spring.xml文件
  9. 测试Service
  1. 在pom.xml中引入依赖
<!--spring核心及相关依赖-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.3.2.RELEASE</version>
</dependency><!--mysql-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version>
</dependency><!--mybatis-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version>
</dependency><!--mybatis-spring-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.4</version>
</dependency><!--druid-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.19</version>
</dependency>
  1. 数据库中表

  1. 建实体类
public class User {private String id;private String name;private Integer age;private Date bir;public User() {}public User(String id, String name, Integer age, Date bir) {this.id = id;this.name = name;this.age = age;this.bir = bir;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBir() {return bir;}public void setBir(Date bir) {this.bir = bir;}@Overridepublic String toString() {return "User{" +"id='" + id + '\'' +", name='" + name + '\'' +", age=" + age +", bir=" + bir +'}';}
}
  1. DAO接口
public interface UserDAO {void save(User user);List<User> findAll();}
  1. Mapper配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baizhi.dao.UserDAO"><insert id="save" parameterType="User">insert into t_user values(#{id}, #{name}, #{age}, #{bir})</insert><select id="findAll" resultType="com.baizhi.eneity.User">select id, name, age, bir from t_user</select></mapper>
  1. Service接口
public interface UserService {void save(User user);List<User> findAll();
}
  1. Service实现类
public class UserServiceImpl implements UserService{private UserDAO userDAO;public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}public void save(User user) {// 处理业务逻辑userDAO.save(user);}public List<User> findAll() {return userDAO.findAll();}
}
  1. 编写Spring、Mybatis整合配置Spring.xml文件

步骤:

  • 创建数据源
  • 创建sqlSessionFactoy
  • 创建DAO
  • 创建事务管理器
  • 创建事务环绕通知并进行事务细粒度控制
  • 配置事务切面
  • 管理Service层组件
<?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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--创建数据源--><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/lb?characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="root"/></bean><!--创建sqlSessionFactoy--><bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"><!--注入datasource mapperLocations typeAliasesPackage--><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:com/baizhi/mapper/*.xml"/><property name="typeAliasesPackage" value="com.baizhi.eneity"/></bean><!--创建DAO--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--注入sqlSessionFactory dao接口所在包--><!--value要的是sqlSessionFactory在工厂中的名字--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><property name="basePackage" value="com.baizhi.dao"/></bean><!--创建事务管理器--><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><property name="dataSource" ref="dataSource"/></bean><!--创建事务环绕通知并进行事务细粒度控制--><!--transaction-manager找ref --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*"/><tx:method name="update*"/><tx:method name="delete*"/></tx:attributes></tx:advice><!--配置事务切面--><aop:config><aop:pointcut id="pc" expression="execution(* com.baizhi.service.*ServiceImpl.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config><!--管理Service层组件--><bean class="com.baizhi.service.UserServiceImpl" id="userService"><property name="userDAO" ref="userDAO"/></bean></beans>
  1. 测试
public class TestUserService {private ClassPathXmlApplicationContext context;@Beforepublic void before(){this.context = new ClassPathXmlApplicationContext("spring.xml");}@Testpublic void testSave(){UserService userService = (UserService) context.getBean("userService");User user = new User();user.setBir(new Date());user.setName("小陈");user.setAge(23);userService.save(user);}@Testpublic void testFindAll(){UserService userService = (UserService) context.getBean("userService");userService.findAll().forEach(user -> {System.out.println("user = " + user);});}@Afterpublic void after(){context.close();}
}

7. log4j日志使用

# spring、mybatis整合中使用log4j1. log4j作用:用来展示项目中的运行日志日志分类:1. 项目根日志 (全局日志)            [因为是全局日志,日志内容非常多,一般用不到]2. 项目子日志 (指定包级别日志)     [一般用的就是这种日志]日志级别:错误          警告    信息ERROR(高) > WARN > INFO > DEBUG(低)          [一般在做日志调试的时候都设置为DEBUG]ERROR:当项目错误时才会展示的日志级别越低反而输出的信息越多2. 如何使用a). 引入依赖<!--log4j--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.10.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency>      b). 引入log4.properties配置文件       注意:必须放置在resources根目录下  名字叫 log4j.propertieslog4j.rootLogger = ERROR,bblog4j.appender.bb = org.apache.log4j.ConsoleAppenderlog4j.appender.bb.layout = org.apache.log4j.PatternLayoutlog4j.appender.bb.layout.conversionPattern = [%p] %d{yyyy-MM-dd} %m%nlog4j.logger.com.baizhi.dao = DEBUGlog4j.logger.org.springframework = ERROR

log4j日志的配置:

# root logger
# gen ri zhi de ji bie: ERROR,jiu shi dang kuang jia zhong chu xian cuo wu shi cai hui zhan shi, bb dai biao bian liang ming zi
log4j.rootLogger=ERROR,bb
# da dao kong zhi tai
log4j.appender.bb=org.apache.log4j.ConsoleAppender
# bu jv, shi yong zi ding yi de ge shi
log4j.appender.bb.layout=org.apache.log4j.PatternLayout
# zi ding yi de jv ti ge shi jv ti shi shen mo
# %p: dai biao shu chu ji bie
# %d: dai biao shu chu ri zhi de da yin shi jian
# %m: dai biao shu chu zhu xian cheng yun xing ri zhi
# %n: dai biao shu chu wan zhe hang ri zhi hui che huan hang
log4j.appender.bb.layout.conversionPattern=[%p] %d{yyyy-MM-dd} %m%n# package logger
# jian kong com.baizhi.dao bao xia de ri zhi
# zhan shi dao de ri zhi
log4j.logger.com.baizhi.dao=DEBUG
# zhan shi spring kuang jia de ri zhi
log4j.logger.org.springframework=ERROR

实际效果:

Spring、Mybatis整合Service优化思路,DAO层、Service层最终编码以及log4j日志的使用相关推荐

  1. springMVC+Spring+mybatis整合配置版与注解版

    springMVC+Spring+mybatis整合 , 使用配置版来完成: -----------------------------前端 1.创建web系统,导入jar包: spring的jar包 ...

  2. java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取

    java spring+mybatis整合实现爬虫之<今日头条>搞笑动态图片爬取(详细) 原文地址原博客地址 先上效果图 抓取的动态图: 数据库: 一.此爬虫介绍 今日头条本身就是做爬虫的 ...

  3. mybatis学习(十一)——springmvc++spring+mybatis整合

    做任何一个项目都以一个需求,这里先定义一下需求:利用三大框架查询酒店列表. 一.搭建开发环境 1.创建一个web项目 我这里用的是 jdk1.8+tomact7.0 2.创建hotel表 CREATE ...

  4. (八) shiro + spring + mybatis整合开发

    1 前言 :  shiro代码参考java1234网站<一头扎进shiro>视频敲出来的,原理这些请参视频 , 点击 下载源码 点击 下载数据库 2 项目结构图 3 代码 UserCont ...

  5. 保姆级Spring+Mybatis整合的简单增删改查功能实现

    Springboot和Mybatis整合实现增删改查等 0.文章中pageHelper相关的操作是分页查询的东西与本文无关 1.首先创建一个Springboot的项目 1.1Java一般选择的是8,看 ...

  6. Jstorm+Spring+mybatis整合

    在现有的jstorm框架下,有一个需求:jstorm要对接mysql数据库的实时读取数据, 通过bolt处理,可能要调用service层的框架,最后保存到数据库. 在网上寻找了一下,发现storm集成 ...

  7. jstorm mysql_Jstorm+Spring+mybatis整合

    在现有的jstorm框架下,有一个需求:jstorm要对接mysql数据库的实时读取数据, 通过bolt处理,可能要调用service层的框架,最后保存到数据库. 在网上寻找了一下,发现storm集成 ...

  8. 解决spring mybatis 整合后mapper接口注入失败

    spring整合mybatis,在dao层我们只写一个接口,配置相应的*mapper.xml文件, 报如下错误: 1 org.springframework.beans.factory.Unsatis ...

  9. java使用druid maven_SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置...

    一直对springmvc和mybatis挺怀念的,最近想自己再搭建下框架,然后写点什么. 暂时没有整合缓存,druid也没有做ip地址的过滤.Spring的AOP简单配置了下,也还没具体弄,不知道能不 ...

最新文章

  1. ADO.NET与ORM的比较(5):MyBatis实现CRUD
  2. 设备管理系统html,蓝色的远程监控设备系统后台管理界面html模板
  3. Server.UrlEncode UrlDecode 动态绑定gridview列发送接收乱码的问题
  4. mysql主从增量同步_生产环境中mysql主从同步/完整/增量备份
  5. 面试:MySQL 架构
  6. 美国国防部设立承包商网络漏洞披露计划
  7. 关于我在安装2.6.9版本bochs虚拟机时遇到的问题以及解决过程
  8. LeetCode 107. Binary Tree Level Order Traversal II
  9. 怎么不能锁门_镜子能不能对着床
  10. python ant_python3.7.1ant+TKinter在Tkin中显示来自ANT+设备的实时数据
  11. 汇川技术小型PLC梯形图编程系列教程(1)小型PLC型号H123U简介
  12. 阵列天线方向图-均匀圆形/圆柱阵列matlab仿真
  13. Android面试英文介绍
  14. 云桌面到底是干什么的?
  15. 自己的应用跳转到应用宝评分界面
  16. 手机3D的新境界:Omnia II 是3D方面的力作!!
  17. VMware ESXi 扩容后提示“无法打开虚拟机的电源,请确认该虚拟磁盘是适用“厚”选项创建的”等信息,执行VMDK 格式是 zeroedthick 还是 eagerzeroedthick
  18. HTML如何返回上一页?
  19. Ansoft HFSS——ANSYS Electronics Suite 2020R1 Install Guidance
  20. 工具类commons-io的Tailer用法,用来监控文件内容的变化情况

热门文章

  1. 小萌库 - 精品游戏精彩回顾
  2. 字符编码转换类(支持多国语言)
  3. 亚马逊、速卖通、虾皮、lazada、沃尔玛高概率打造爆款的方法
  4. Kaggle新赛:Lyft 自动驾驶运动预测,发布迄今最大预测任务数据集
  5. Linux基础命令---find
  6. 民事诉讼法(1)目录
  7. 传输层协议(1):TCP 报文结构
  8. Python 框架 之 Django MVT 下的 V 的 视图简单介绍和使用
  9. 登录中国专利电子申请网的正确姿势
  10. 谷歌物联网操作系统Android Things揭开面纱