SpringBoot框架学习

SpringBoot自动配置注解原理解析

1. SpringBoot启动主程序类:

每次直接直接启动这个启动类Application,SpringBoot就启动成功了,并且帮我们配置了好多自动配置类。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.taobao.pandora.boot.PandoraBootstrap;

/**
 * Pandora Boot应用的入口类
 * 

LogUtil * * @author xx */ @SpringBootApplication(scanBasePackages = {"com.alibaba.algo","com.xx.xx","com.xx.xx"}) public class Application { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(Application.class, args); PandoraBootstrap.markStartupAndWait(); } }

SpringBoot框架学习_第1张图片

 

注解函数:

@SpringBootApplication 源码

SpringBoot框架学习_第2张图片

 

 

三个比较重要的注解:

  • @SpringBootConfiguration : Spring Boot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类

  • @EnableAutoConfiguration: 开启自动配置类,SpringBoot的精华所在

  • @ComponentScan包扫描

以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效

 

 

项目实践:

Service层:Generator.xml配置自增id

Controller层:文件解析,字段入库

package com.alibaba.algo.controller.cpwController;



import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;

import static com.xx.xx.xx.FileWrite.pathAll;

@Controller
public class CpwLogSaveController {
    public static String pathOrigin = FileRead.pathOrigin;

    @Autowired
    CpwLogSaveService cpwLogSaveService;
    @Autowired
    CpwLogSaveController cpwLogSaveController;

    // 注意这里是RequestMapping  后面的内容为接口路径。此接口为logOrigin,ODPS原始日志
    @RequestMapping("/logsave")
    @ResponseBody
    public Object runProcessTask() {
        return parseData(pathOrigin, true);

    }

    // 读取path路径的txt文件
    public CpwResultModel parseData(String path, Boolean isOrigin) {

        // 文件读取必须得用try catch,文件按行读取
        // 按行处理数据,一行行插入数据库
        int count = 0;

        try {
            File file = new File(path);
            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
            String s;

            while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
                String result = s.trim();//去空白,末尾或者开头。去空格
                if (result.equals("")) {
                    continue;
                }
                String[] array = result.split(FileWrite.rex);
                count++;
                if (isOrigin) {
                    originLogInsert(array);
                }

            }
            br.close();
            // 拷贝origin_log.txt为origin_log_copy.txt副本,删除控制台运行出原始日志origin_log.txt,防止重复请求接口导致数据重复写入
            deleteOriginFileAndCopy();

            // 接口结果返回字段
            CpwResultModel cpwResultModel = new CpwResultModel();

            cpwResultModel.setCode(Constants.CODE_SUCCESS);
            cpwResultModel.setResult("success");
            cpwResultModel.setCount(count);

            if (count == 0) {
                cpwResultModel.setError("暂无错误日志~~");
            }

            return cpwResultModel;

        } catch (Exception e) {
            e.printStackTrace();
            CpwResultModel cpwResultModel = new CpwResultModel();

            cpwResultModel.setCode(Constants.CODE_ERROR);
            cpwResultModel.setResult("failed");
            cpwResultModel.setCount(count);
            cpwResultModel.setError(e.toString());
            return cpwResultModel;
        }
    }

//    private void parseError(String[] array) {
//        String nowTime = array[0];
//        String logTime = array[1];
//        String logId = array[2];
//        String appScene = array[3];
//        String utdid = array[4];
//        String origialParam = array[5];
//
//        // 把字段解析到cpw_log_param数据表
//
//        CpwLogSaveDO cpwLogParamDO = new CpwLogSaveDO();
//        cpwLogParamDO.setGmtCreate(new Date());
//        cpwLogParamDO.setGmtModified(new Date());
//
//
//    }

    // 原始日志origin_log.txt解析后字段入库
    private void originLogInsert(String[] array) throws InterruptedException, IOException {
        String nowTime = array[0];
        String logTime = array[1];
        String logId = array[2];
        String appScene = array[3];
        String utdid = array[4];
        String originParam = array[5];

        // 把字段解析到cpw_log_save数据表

        CpwLogSaveDO cpwLogSaveDO = new CpwLogSaveDO();
//       cpwLogSaveDO.setId((long)1);
        cpwLogSaveDO.setGmtCreate(new Date());
        cpwLogSaveDO.setGmtModified(new Date());
        cpwLogSaveDO.setNowTime(nowTime);
        cpwLogSaveDO.setLogTime(logTime);
        cpwLogSaveDO.setLogId(Integer.parseInt(logId));
        cpwLogSaveDO.setAppScene(appScene);
        cpwLogSaveDO.setUtdid(utdid);
        cpwLogSaveDO.setOriginParam(originParam);
        cpwLogSaveService.insertData(cpwLogSaveDO);


    }

    private void deleteOriginFileAndCopy(){
        // 请求接口日志入库后,拷贝本地origin_log.txt到origin_log_copy.txt 每次日志运行做备份
        File origin_log = new File(pathAll + File.separator + "origin_log.txt");
        File origin_log_copy = new File(pathAll + File.separator + "origin_log_copy.txt");

        try {
            if (origin_log_copy.exists()) {
                origin_log_copy.delete();
            }
            System.out.println("可能没有这个文件,兼容代码===原始日志副本已删除。delete origin_log_copy.txt file ");

        } catch (Exception e) {
            e.printStackTrace();
        }

        // 拷贝副本,同步数据
        FileCopy.copyFileUsingJava7Files(origin_log, origin_log_copy);
        System.out.println("origin_log_copy同步完成");

        // 删除正本数据,保留副本数据
        FileWrite.deleteOriginLogFirstRunFile();

    }

}

 

Model层:入库字段定义成变量,javaBeans

package com.xx.xx.xx.cpwController;

import com.xx.xx.model.CpwLogSaveDO;

import java.util.List;

// 定义接口返回参数
public class CpwResultModel {
    public String code;
    public String result;
    public int count;
    public String error;
    public List list;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }
}

 

嘻嘻嘻 头条的哥哥问的,我之前写过,只是当时是照葫芦画瓢的。。。写的仓促,时间久了忘了。。大厂的人果然nice,不会因为你没写出来给你fail。换小厂,绝对觉得你不行,会问:leetcode 1600道算法为什么不会?没完全写出来==给你挂。。。

坚持不刷题。

总结下面试经历:点点点QA面我 必挂,低T低P低级别的人面我 必挂,毕竟 谁会想招个工资比你高的呢?

小厂:你为啥不会Python?你不会这些函数,自动化怎么写的。。。

自动化很难么?遇到高T高P,我们一致认为自动化超简单,对我而言,复制粘贴 改改 运行 集成到CICD 完事了。。。

你可能感兴趣的:(code)