Java使用SpringBoot应用配置文件

*配置文件yml和properties均可,以下以yml为例
1.设置配置文件
app:
service:
name: justin
id: 000
2.创建配置文件映射类

@Component//如报错请将此注解注释,因为此时出现了该bean被注册两次的情况
@ConfigurationProperties("app.service")
public class ServiceProperties {

    private String name;//注意该字段名要与配置文件中保持一致
    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

3.创建配置文件读取类并将值赋给对应服务 read more

Java使用SAMBA协议实现上传和下载功能

背景:
对于系统来说,用户的数据和用户相关的文件一般都会分离放置,如果这个文件会被多个系统去调用,那么就会把这部分文件放到一个大家都可以拿到的地方,方便大家调阅,具体的实现有很多种,SAMBA就是其中一种。
说明:
SAMBA也是一种服务,它相当于是给大家提供了一个共享目录,消费者可以通过调用接口去存放文件和获取文件。
以下部分是Java实现上传和下载的部分:
首先引入需要的jar包

<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.14-kohsuke-1</version>
</dependency> read more

Java实现Esb企业服务总线对接

背景:
随着公司的发展,公司内部使用的系统越来越多,一部分公司就会采用Esb技术进行系统间的信息传递。
例如你的信用卡该还钱了,那么银行的主系统就会发送信息给微信服务或者短信服务,你就会接收到该还款的短信和微信消息了。
说明:
Esb同Java服务,MySQL服务一样,也是一个服务,对于一个Java或者其他服务的开发者来说我们无需担心Esb的生命周期,只需要学会怎样把自己的对外接口注册到Esb和如何通过Esb调用其他系统的接口即可;
事实上,怎样把自己的接口注册到Esb上也不需要我们做太多,只需要告诉Esb的维护者我们的接口怎样访问即可,所以下面主要来说我们如何通过Esb调用其他系统的接口
正文:
请求Esb接口我们需要发送XML形式的报文,Esb也会将返回信息转为XML形式发送给我们
一个Esb请求大致分为以下几个部分:
1.将包含操作数据的Model及请求头Model转换为XML
2.通过Socket将请求发出
3.将返回的XML报文解析为我们需要的Model

请求报文一般分为两部分,head和body;Head主要包含请求的接口编号、编号所属系统编号、请求方的机器编号、上送时间、Esb全局流水号等信息;body用于存放主要的业务数据,例如姓名、手机号等信息
发送请求及响应会有对应的JAR包做支持
在对响应报文解析的时候较为麻烦的就是返回了一些集合数据,这个时候需要对list进行多一层的解析 read more

Spring Cloud版本选择

大版本目前主要有:
Angel版本对应Spring Boot 1.2.x
Brixton版本对应Spring Boot 1.3.x
Camden版本对应Spring Boot 1.4.x
Dalston 版本对应Spring Boot 1.5.x
Edgware 版本对应Spring Boot 1.5.x
Finchley 版本对应Spring Boot 2.0.x
Greenwich 版本对应Spring Boot 2.1.x
小版本:
SNAPSHOT: 快照版本,随时可能修改
M: MileStone,M1表示第1个里程碑版本,一般同时标注PRE,表示预览版版。
SR: Service Release,SR1表示第1个正式版本,一般同时标注GA(GenerallyAvailable),表示稳定版本。
生产系统建议选择GA稳定版本

D版本和E版本的区别
二者均基于SpringBoot的1.5.x版本。但支持其他组件的版本不同,每个小版本的不同,会有细微差别。如以 Dalston.SR4 和 Edgware.RELEASE 来对比: read more

通过进制法捕获所有组合

题目:
现有2支队伍,每支队伍有2个人,两支队伍的人相互握手,求所有的握手组合方式。
我们可以快速得到答案:
假设两只队伍分别为A,B;成员代号为A1、A2、B1、B2;
则组合方式有以下四种:
A1,B1;A1,B2;A2,B1,;A2,B2;

难度稍微升级一下
题目:
现有3支队伍,每支队伍有3个人,3支队伍的人相互握手,求所有的握手组合方式。
当我们将队伍换成三支或更多的时候,答案可能并不是很快就能得到的 read more

Java实现Excel读取

背景:
每个月公司都会有发两个表,
一个是考勤表
另一个是工时表
需要我们对照考勤表把工时表完善
写了两次实在是感觉很浪费时间,于是就写了个代码代替人工
pom引用

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.14</version>
</dependency>
package com.justin.excel;


import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 描述:
 * 读写Excel
 *
 * @author Justin.Sun
 * @create 2018-07-30 17:34
 */
public class ExcelUtil {
    private static final String EXCEL_XLS = "xls";
    private static final String EXCEL_XLSX = "xlsx";
    private static Map<Integer,Integer> time=new HashMap<Integer, Integer>();
    private static Map<Integer,String> data=new HashMap<Integer, String>();
    private static FileInputStream in;
    private static Workbook workBook = null;
    private static  FileOutputStream out;

    /**
     * 读取考勤表并获取userName相关数据
     * @param fileName 文件路径
     * @param userName 名字
     * @throws IOException
     */
    public static void readExcel(String fileName,String userName) throws IOException {
        Sheet sheet=getSheet(fileName);
        // 第一行从0开始算
        int rowNumber = sheet.getLastRowNum();
        //逐行循环
        for (int i = 1; i <= rowNumber; i++) {
            Row row = sheet.getRow(i);
            if (row==null){
                System.out.println("获取到的行数"+i);
                break;
            }
            Cell cell;
            boolean arg=false;
            //循环行内的列
            for (int j=0;j<=row.getLastCellNum();j++){
                cell=row.getCell(j);
                if (cell==null){
                    break;
                }
                //获取数据的规则
                if (i==2){
                    String value=cell.toString();
                    try{
                        int day=Integer.parseInt(value);
                        time.put(day,j);
                    }catch (Exception e){
                        continue;
                    }
                }else if (i>2&&j==0&&userName.equals(cell.toString())){
                    arg=true;
                    for (int key:time.keySet()){
                        cell=row.getCell(time.get(key));
                        data.put(key,cell.toString().replace("\n","&").replaceAll("  ",""));
                    }
                }
            }
            //得到了我想要的数据,可以结束循环了
            if (arg){
                System.out.println(data);
                System.out.println("获取 "+userName+" 数据完成");
                break;
            }
        }
        close();
    }

    /**
     * 写入数据到工时表
     * @param fileName 文件路径
     * @param userName 名字
     * @throws IOException
     */
    public static void writeExcel(String fileName,String userName) throws IOException {
        SimpleDateFormat sdf=new SimpleDateFormat("d");
        Sheet sheet=getSheet(fileName);
        int rowNumber = sheet.getLastRowNum();
        for (int i = 1; i <= rowNumber; i++) {
            Row row = sheet.getRow(i);
            if (row==null){
                System.out.println("获取到的行数"+i);
                break;
            }
            Cell cell;
            //行循环
            for (int j=0;j<=row.getLastCellNum();j++){
                cell=row.getCell(j);
                if (cell==null){
                    break;
                }
                //名字替换
                if ("某某".equals(cell.toString())){
                    cell.setCellValue(userName);
                }
                //数据处理
                if (i>3&&j==1){
                    try{
                        int day= Integer.parseInt(sdf.format(cell.getDateCellValue()));
                        String value=data.get(day);
                        int index=value.indexOf("&");
                        String startTime="";
                        String endTime="";
                        if (index>0){
                            startTime=value.substring(0,index);
                            endTime=value.substring(index+1,value.length());
                        }
                        cell=row.getCell(3);
                        cell.setCellValue(startTime);
                        cell=row.getCell(4);
                        cell.setCellValue(endTime);
                        if (startTime.equals("")&&endTime.equals("")){
                            cell=row.getCell(5);
                            cell.setCellValue("");
                        }
                    }catch (Exception e){
                        cell=row.getCell(5);
                        //找到引用函数的单元格
                        if (cell.getCellType()==Cell.CELL_TYPE_FORMULA){
                            //执行函数并得到返回值
                            FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
                            CellValue cellValue=evaluator.evaluate(cell);
                            //替换新值到单元格
                            cell.setCellValue(cellValue.getNumberValue());
                        }
                    }
                }
            }
        }
        out=new FileOutputStream(fileName);
        workBook.write(out);
        close();
        System.out.println("写入 "+userName+" 数据完成");
    }

    /**
     * 创建连接并获取工作薄
     * @param fileName 文件路径
     * @return 工作薄对象
     * @throws IOException
     */
    private static Sheet getSheet(String fileName) throws IOException {
        File file=new File(fileName);
        in = new FileInputStream(file);
        //Excel&nbsp;2003
        if(file.getName().endsWith(EXCEL_XLS)){
            workBook = new HSSFWorkbook(in);
            // Excel 2007/2010
        }else if(file.getName().endsWith(EXCEL_XLSX)){
            workBook = new XSSFWorkbook(in);
        }
        //默认获取第一个工作薄
        return workBook.getSheetAt(0);
    }

    /**
     * 关闭连接
     * @throws IOException
     */
    private static void close() throws IOException {
        if (workBook!=null){
            workBook.close();
        }
        if (in!=null){
            in.close();
        }
        if (out!=null){
            out.close();
        }
    }
}

public class Application {
    private static String readFileName="E:/考勤表.xlsx";
    private static String writeFileName="E:/空白工时表.xlsx";
    private static String userName="Justin";
    public static void main(String[] args) throws IOException {
        //执行
        ExcelUtil.readExcel( readFileName,userName);
        ExcelUtil.writeExcel( writeFileName,userName);
    }
}