SpringBoot


仅用于个人笔记使用。

SpringBoot初始化一个应用:

网址:https://start.spring.io/

微天气项目micro-weather-basic项目中,idea新建SpringBoot项目,选择web依赖项,在pom.xml中加入依赖项:添加httpclient客户端插件。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</version>
</dependency>

初始化

idea中新建SpringInitializr项目

1.SpringBoot目录用处

resources目录:

static目录用来放js文件

templates目录放如html文件的模板文件

2.项目使用redis

项目名称:micro-weather-redis

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

在服务层service,中使用StringRedisTemplate类(对redis对象进行了包装)调用redis

想要使用上面的依赖项还需要在application.properties文件中添入配置信息

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=0
#spring.redis.pool.max-active=8
#spring.redis.pool.max-wait=-1
#spring.redis.pool.max-idle=500
#spring.redis.pool.min-idle=0
#spring.redis.timeout=0
private void saveCityDataByid(String url,String cityID){
    //从第三方接口获取数据并写入缓存

    String strBody = null;//用来存放responseEntity的strBody部分。
    ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();//对值操作

    ObjectMapper objectMapper = new ObjectMapper();//获取jackson中的对象映射集合
    ResponseEntity<String > responseEntity = restTemplate.getForEntity(url,String.class);

    if(responseEntity.getStatusCodeValue()==200){
        strBody = responseEntity.getBody();

    }
    logger.info("请求"+cityID+"天气数据中,和写入缓存中");
    valueOperations.set(url,strBody,TIME_OUT, TimeUnit.SECONDS);
}
private Weather doGetWeather(String url){
    String key = url;
    Weather weather =null;//用来存放获得的天气对象
    String strBody = null;//用来存放responseEntity的strBody部分。

    ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();//对值操作

    ObjectMapper objectMapper = new ObjectMapper();//获取jackson中的对象映射集合

    if(stringRedisTemplate.hasKey(key)){
    //1.先在缓存中查找数据
       strBody = valueOperations.get(key);
       //添加日志
        logger.info("redis has data");
    }else{
    //2.缓存中没有再去第三方接口查找
        System.out.println("问第三方获取资源");
        ResponseEntity<String > responseEntity = restTemplate.getForEntity(url,String.class);


        //如果返回报的状态码等于200,则获取返回报的身体部分
        if(responseEntity.getStatusCodeValue()==200){
            strBody = responseEntity.getBody();
        }
        logger.info("redis don't has data");
    }
    //3.写入缓存
    valueOperations.set(key,strBody,TIME_OUT, TimeUnit.SECONDS);


    //从map中获取Weather对象
    try {
        if(strBody==null){
            System.out.println("strBody为空");
        }
        weather = objectMapper.readValue(strBody,Weather.class);
    } catch (IOException e) {
        //e.printStackTrace();
        logger.error("Error!",e);
    }
    return weather;
}

house项目使用redis

  @Value("${file.prefix}")
  private String imgPrefix;
  
  /**
   * 1.首先通过缓存获取
   * 2.不存在将从通过数据库获取用户对象
   * 3.将用户对象写入缓存,设置缓存时间5分钟
   * 4.返回对象
   * @param id
   * @return
   */
  public User getUserById(Long id) {
    String key = "user:"+id;
    String json =  redisTemplate.opsForValue().get(key);
    User user = null;
    if (Strings.isNullOrEmpty(json)) {
      user =  userMapper.selectById(id);
      user.setAvatar(imgPrefix + user.getAvatar());
      String string  = JSON.toJSONString(user);
      redisTemplate.opsForValue().set(key, string);
      redisTemplate.expire(key, 5, TimeUnit.MINUTES);
    }else {
      user = JSON.parseObject(json,User.class);
    }
    return user;
  }

3.集成定时器,quartz scheduler,现实定时获取天气数据

在工程micro-weather-client中,无效,使用Spring自带的计时器功能代替

依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

1.创建job层

​ 创建xxxjob.java文件,该类需要继承QuartzJobBean

package mystudy.microweatherbasic.job;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;

//Quartzschdule示例

public class QuartzScheduleJobDemo extends QuartzJobBean {
    //日志
    private static final Logger logger = LoggerFactory.getLogger(QuartzScheduleJobDemo.class);

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        logger.info("do job");
    }
}

2.config层创建配置文件QuartzConfiguration.java

package mystudy.microweatherbasic.config;

import mystudy.microweatherbasic.job.QuartzScheduleJobDemo;
import org.quartz.*;
import org.springframework.context.annotation.Bean;

//定时器配置类,QuartzConfiguration
public class QuartzConfiguration {
    private static final int TIME = 2; // 更新频率,秒
    // JobDetail
    @Bean
    public JobDetail weatherDataSyncJobDetail() {
        return JobBuilder.newJob(QuartzScheduleJobDemo.class).withIdentity("quartzScheduleJobDemo")
                .storeDurably().build();
    }

    // Trigger触发
    @Bean
    public Trigger weatherDataSyncTrigger() {

        SimpleScheduleBuilder schedBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(TIME).repeatForever();

        return TriggerBuilder.newTrigger().forJob(weatherDataSyncJobDetail())
                .withIdentity("quartzScheduleDemoSyncTrigger").withSchedule(schedBuilder).build();
    }
}

在工程micro-weather-client中,无效,使用Spring自带的计时器功能代替

SpringScheduleJob.java文件:

package mystudy.microweatherbasic.SpringScheduleTask;

import mystudy.microweatherbasic.city.City;
import mystudy.microweatherbasic.cityService.CityDataService;
import mystudy.microweatherbasic.weatherDataService.GetWeatherDataService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.util.List;

//利用Spring自带定时器功能,实现隔半小时同步一次缓存功能
@Component
@Configuration
@EnableScheduling
public class SpringScheduleJob {
    //日志
    private static final Logger logger = LoggerFactory.getLogger(SpringScheduleJob.class);
    @Autowired
    CityDataService cityDataService;
    @Autowired
    GetWeatherDataService getWeatherDataService;

    @Scheduled(fixedRate = 1000*3000)
    public void executeInternal(){
        logger.info("sync start!!");
        //1.获取城市列表,注入CityDataService
        List<City> cityList = null;
        try {
            cityList = cityDataService.getCityList();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JAXBException e) {
            //e.printStackTrace();
            logger.error("JAXBException",e);
        }
        //2.遍历城市列表,调用天气服务接口,将天气信息写入缓存
        for (City city:cityList
        ) {
            logger.info("sync cityWeatherData");
            if(city.getCityId()!=null){
                getWeatherDataService.syncCityDataById(city.getCityId());
            }

        }

        logger.info("sync end!!");
    }
}

4.(javax中的xml解析)获取城市city.xml数据

很复杂,建议使用xstream见《笔记衣超市笔记.md》,比较简单

映射文件

<?xml version="1.0" encoding="UTF-8"?>
<c c1="0">
<d d1="101280101" d2="广州" d3="guangzhou" d4="广东"/>
<d d1="101280102" d2="番禺" d3="panyu" d4="广东"/>
</c>

City.java

对应cityList.xml文件中的d标签

package mystudy.microweatherbasic.city;
//城市列表中的各城市信息

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="d")
@XmlAccessorType(XmlAccessType.FIELD)
public class City {

    @XmlAttribute(name="d1")
    private String cityId;

    @XmlAttribute(name="d2")
    private String cityName;

    @XmlAttribute(name="d3")
    private String cityPingyin;

    @XmlAttribute(name="d4")
    private String provinceCenter;

    public void setCityPingyin(String cityPingyin) {
        this.cityPingyin = cityPingyin;
    }

    public String getCityPingyin() {
        return cityPingyin;
    }

    public void setCityId(String cityId) {
        this.cityId = cityId;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public void setProvinceCenter(String provinceCenter) {
        this.provinceCenter = provinceCenter;
    }

    public String getCityId() {
        return cityId;
    }

    public String getCityName() {
        return cityName;
    }

    public String getProvinceCenter() {
        return provinceCenter;
    }
}

CityList.java

对应整个cityList.xml文件,对应c标签

package mystudy.microweatherbasic.city;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

//城市列表,映射整个xml文件
@XmlRootElement(name="c")
@XmlAccessorType(XmlAccessType.FIELD)
public class CityList {
    @XmlAttribute(name="d")
    private List<City> cityList;

    public void setCityList(List<City> cityList) {
        this.cityList = cityList;
    }
    public List<City> getCityList() {
        return cityList;
    }
}

CityDataServiceImpl文件:

package mystudy.microweatherbasic.cityService.cityServiceImpl;

import mystudy.microweatherbasic.city.City;
import mystudy.microweatherbasic.city.CityList;
import mystudy.microweatherbasic.cityService.CityDataService;
import mystudy.microweatherbasic.util.XmlBuilder;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

import javax.xml.bind.JAXBException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

@Service
public class CityDataServiceImpl implements CityDataService {
    @Override
    public List<City> getCityList() throws IOException, JAXBException {
        //1.读取xml文件,先将其转换为文本对象

        //Spring中将资源文件转为resource
        Resource resource = new ClassPathResource("static/citylist.xml");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream(),"UTF8"));

        StringBuffer stringBuffer = new StringBuffer();//用来存放读取到的内容
        String str = "";//定义空字符串,在读取高效流时用
        while((str=bufferedReader.readLine())!=null){
            stringBuffer.append(str);
            System.out.println(str);
        }
        //释放资源
        if(bufferedReader!=null){
            bufferedReader.close();
        }
        //2.将文本对象转换为指定对象
        CityList cityList = (CityList) XmlBuilder.xmlStr2Object(CityList.class,stringBuffer.toString());
        return cityList.getCityList();
    }
}

XmlBuilder文件:

package mystudy.microweatherbasic.util;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

/*
* 工具类
* 将xml文件转为java对象
* */
public class XmlBuilder {
    public static Object xmlStr2Object(Class<?> clazz, String xmlStr) throws JAXBException, IOException {
        Object xmlObject = null;

        //将xml文件以读入字符串流的形式读入
        Reader reader = new StringReader(xmlStr);

        //sun公司的将xml文件转换为java对象。
        // JAXBContext,类中提供了将xml文件转为java对象的接口。
        JAXBContext context = JAXBContext.newInstance(clazz);

        //解析对象,包含转为对象的接口
        Unmarshaller unmarshaller =  context.createUnmarshaller();

        //可以解析多种形式的参数
        xmlObject = unmarshaller.unmarshal(reader);

        //释放资源
        if(reader != null){
            reader.close();
        }
        return xmlObject;
    }
}

在application.properties文件中添加:

spring.thymeleaf.cache=false
//实现springBoot项目热部署静态文件

热部署:

主:https://www.cnblogs.com/winner-0715/p/6666579.html

副:https://www.cnblogs.com/a8457013/p/8065489.html

maven依赖项:

<!--使用springboot的热部署-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

1.开启idea自动make功能

Settings --> 查找make project automatically --》选中

2.设置:

Ctrl+Shift+alt+/快捷键,设置Registry,勾选compiler.automake.allow.when.app.running

3.重启idea

4.配置依赖项

在ssm框架中使用无效

bootstrap(缺)

前端设计,thymeleaf

thymeleaf面向后端的数据渲染引擎

项目中引入springBoot

方式1:pom继承spring-boot-starter-parent

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

方式2:pom引入spring-boot-dependencies

。。。
    <dependencyManagement>
		<dependencies>
            <dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>1.4.7.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		
		</dependencies>
	</dependencyManagement>
。。。

两种方式不同体现在修改properties是否能覆盖依赖版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值