【本文章是否对你有用以及是否有好的建议,请留言】

本文章牵涉到的技术点比较多:Spring Data JPA、Redis、Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对以上这些技术点有一定的了解或者也可以先看看这篇文章,针对文章中实际的技术点在进一步了解(注意,您需要自己下载Redis Server到您的本地,所以确保您本地的Redis可用,这里还使用了MySql数据库,当然你也可以内存数据库进行测试)。这篇文章会提供对应的Eclipse代码示例,具体大体的分如下几个步骤:

(1)新建Java Maven Project;

(2)在pom.xml中添加相应的依赖包;

(3)编写Spring Boot启动类;

(4)配置application.properties;

(5)编写RedisCacheConfig配置类;

(6)编写DemoInfo测试实体类;

(7)编写DemoInfoRepository持久化类;

(8)编写DemoInfoService类;

(9)编写DemoInfoController类;

(10)测试代码是否正常运行了

(11)自定义缓存key;

(1)新建Java Maven Project;

这个步骤就不细说,新建一个spring-boot-redis Java maven project;

(2)在pom.xml中添加相应的依赖包;

在Maven中添加相应的依赖包,主要有:spring boot 父节点依赖;spring boot web支持;缓存服务spring-context-support;添加redis支持;JPA操作数据库;mysql 数据库驱动,具体pom.xml文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.kfit</groupId>

<artifactId>spring-boot-redis</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>spring-boot-redis</name>

<url>http://maven.apache.org</url>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<!-- 配置JDK编译版本. -->

<java.version>1.8</java.version>

</properties>

<!-- spring boot 父节点依赖,

引入这个之后相关的引入就不需要添加version配置,

spring boot会自动选择最合适的版本进行添加。

-->

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.3.3.RELEASE</version>

</parent>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<scope>test</scope>

</dependency>

<!-- spring boot web支持:mvc,aop... -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!--

包含支持UI模版(Velocity,FreeMarker,JasperReports),

邮件服务,

脚本服务(JRuby),

缓存Cache(EHCache),

任务计划Scheduling(uartz)。

-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

</dependency>

<!-- 添加redis支持-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-redis</artifactId>

</dependency>

<!-- JPA操作数据库. -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

<!-- mysql 数据库驱动. -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

</dependency>

<!-- 单元测试. -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

</dependencies>

</project>

上面是完整的pom.xml文件,每个里面都进行了简单的注释。

(3)编写Spring Boot启动类(com.kfit.App);

package com.kfit;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

/**

* Spring Boot启动类;

*

* @author Angel(QQ:412887952)

* @version v.0.1

*/

@SpringBootApplication

public class App {

/**

* -javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify

* @param args

*/

public static void main(String[] args) {

SpringApplication.run(App.class, args);

}

}

(4)配置application.properties;

这里主要是配置两个资源,第一就是数据库基本信息;第二就是redis配置;第三就是JPA的配置;

Src/main/resouces/application.properties:

########################################################

###datasource  配置MySQL数据源;

########################################################

spring.datasource.url = jdbc:mysql://localhost:3306/test

spring.datasource.username = root

spring.datasource.password = root

spring.datasource.driverClassName = com.mysql.jdbc.Driver

spring.datasource.max-active=20

spring.datasource.max-idle=8

spring.datasource.min-idle=8

spring.datasource.initial-size=10

########################################################

###REDIS (RedisProperties) redis基本配置;

########################################################

# database name

spring.redis.database=0

# server host1

spring.redis.host=127.0.0.1

# server password

#spring.redis.password=

#connection port

spring.redis.port=6379

# pool settings ...

spring.redis.pool.max-idle=8

spring.redis.pool.min-idle=0

spring.redis.pool.max-active=8

spring.redis.pool.max-wait=-1

# name of Redis server

#spring.redis.sentinel.master=

# comma-separated list of host:port pairs

#spring.redis.sentinel.nodes=

########################################################
### Java Persistence Api 自动进行建表
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

(5)编写RedisCacheConfig配置类;

缓存主要有几个要实现的类:其一就是CacheManager缓存管理器;其二就是具体操作实现类;其三就是CacheManager工厂类(这个可以使用配置文件配置的进行注入,也可以通过编码的方式进行实现);其四就是缓存key生产策略(当然Spring自带生成策略,但是在Redis客户端进行查看的话是系列化的key,对于我们肉眼来说就是感觉是乱码了,这里我们先使用自带的缓存策略)。

com.kfit.config/RedisCacheConfig:

package com.kfit.config;

import org.springframework.cache.CacheManager;

import org.springframework.cache.annotation.CachingConfigurerSupport;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.cache.RedisCacheManager;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

/**

* redis 缓存配置;

*

* 注意:RedisCacheConfig这里也可以不用继承:CachingConfigurerSupport,也就是直接一个普通的Class就好了;

*

* 这里主要我们之后要重新实现 key的生成策略,只要这里修改KeyGenerator,其它位置不用修改就生效了。

*

* 普通使用普通类的方式的话,那么在使用@Cacheable的时候还需要指定KeyGenerator的名称;这样编码的时候比较麻烦。

*

* @author Angel(QQ:412887952)

* @version v.0.1

*/

@Configuration

@EnableCaching//启用缓存,这个注解很重要;

publicclass RedisCacheConfig extends CachingConfigurerSupport {

/**

* 缓存管理器.

* @param redisTemplate

* @return

*/

@Bean

public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {

CacheManager cacheManager = new RedisCacheManager(redisTemplate);

returncacheManager;

}

/**

* redis模板操作类,类似于jdbcTemplate的一个类;

*

* 虽然CacheManager也能获取到Cache对象,但是操作起来没有那么灵活;

*

* 这里在扩展下:RedisTemplate这个类不见得很好操作,我们可以在进行扩展一个我们

*

* 自己的缓存类,比如:RedisStorage类;

*

* @param factory : 通过Spring进行注入,参数在application.properties进行配置;

* @return

*/

@Bean

public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {

RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();

redisTemplate.setConnectionFactory(factory);

//key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;

//所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer

//或者JdkSerializationRedisSerializer序列化方式;

//     RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;

//     redisTemplate.setKeySerializer(redisSerializer);

//     redisTemplate.setHashKeySerializer(redisSerializer);

returnredisTemplate;

}

}

在以上代码有很详细的注释,在这里还是在简单的提下:

RedisCacheConfig这里也可以不用继承:CachingConfigurerSupport,也就是直接一个普通的Class就好了;这里主要我们之后要重新实现 key的生成策略,只要这里修改KeyGenerator,其它位置不用修改就生效了。普通使用普通类的方式的话,那么在使用@Cacheable的时候还需要指定KeyGenerator的名称;这样编码的时候比较麻烦。

(6)编写DemoInfo测试实体类;

编写一个测试实体类:com.kfit.bean.DemoInfo:

package com.kfit.bean;

import java.io.Serializable;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

/**

* 测试实体类,这个随便;

* @author Angel(QQ:412887952)

* @version v.0.1

*/

@Entity

publicclass DemoInfo  implements Serializable{

privatestaticfinallongserialVersionUID = 1L;

@Id@GeneratedValue

privatelongid;

private String name;

private String pwd;

publiclong getId() {

returnid;

}

publicvoid setId(longid) {

this.id = id;

}

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

public String getPwd() {

returnpwd;

}

publicvoid setPwd(String pwd) {

this.pwd = pwd;

}

@Override

public String toString() {

return"DemoInfo [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";

}

}

(7)编写DemoInfoRepository持久化类;

DemoInfoRepository使用Spirng Data JPA实现:

com.kfit.repository.DemoInfoRepository:

package com.kfit.repository;

import org.springframework.data.repository.CrudRepository;

import com.kfit.bean.DemoInfo;

/**

* DemoInfo持久化类

* @author Angel(QQ:412887952)

* @version v.0.1

*/

publicinterface DemoInfoRepository extends CrudRepository<DemoInfo,Long> {

}

(8)编写DemoInfoService类;

编写DemoInfoService,这里有两个技术方面,第一就是使用Spring @Cacheable注解方式和RedisTemplate对象进行操作,具体代码如下:

com.kfit.service.DemoInfoService:

package com.kfit.service;

import com.kfit.bean.DemoInfo;

/**

* demoInfo 服务接口

* @author Angel(QQ:412887952)

* @version v.0.1

*/

publicinterface DemoInfoService {

public DemoInfo findById(longid);

publicvoid deleteFromCache(longid);

void test();

}

com.kfit.service.impl.DemoInfoServiceImpl:

package com.kfit.service.impl;

import javax.annotation.Resource;

import org.springframework.cache.annotation.CacheEvict;

import org.springframework.cache.annotation.Cacheable;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.ValueOperations;

import org.springframework.stereotype.Service;

import com.kfit.bean.DemoInfo;

import com.kfit.repository.DemoInfoRepository;

import com.kfit.service.DemoInfoService;

/**

*

*DemoInfo数据处理类

*

* @author Angel(QQ:412887952)

* @version v.0.1

*/

@Service

publicclass DemoInfoServiceImpl implements DemoInfoService {

@Resource

private DemoInfoRepository demoInfoRepository;

@Resource

private RedisTemplate<String,String> redisTemplate;

@Override

publicvoid test(){

ValueOperations<String,String> valueOperations = redisTemplate.opsForValue();

valueOperations.set("mykey4", "random1="+Math.random());

System.out.println(valueOperations.get("mykey4"));

}

//keyGenerator="myKeyGenerator"

@Cacheable(value="demoInfo") //缓存,这里没有指定key.

@Override

public DemoInfo findById(longid) {

System.err.println("DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id="+id);

returndemoInfoRepository.findOne(id);

}

@CacheEvict(value="demoInfo")

@Override

publicvoid deleteFromCache(longid) {

System.out.println("DemoInfoServiceImpl.delete().从缓存中删除.");

}

}

(9)编写DemoInfoController类;

package com.kfit.controller;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import com.kfit.bean.DemoInfo;

import com.kfit.service.DemoInfoService;

/**

* 测试类.

* @author Angel(QQ:412887952)

* @version v.0.1

*/

@Controller

publicclass DemoInfoController {

@Autowired

DemoInfoService demoInfoService;

@RequestMapping("/test")

public@ResponseBody String test(){

DemoInfo loaded = demoInfoService.findById(1);

System.out.println("loaded="+loaded);

DemoInfo cached = demoInfoService.findById(1);

System.out.println("cached="+cached);

loaded = demoInfoService.findById(2);

System.out.println("loaded2="+loaded);

return"ok";

}

@RequestMapping("/delete")

public@ResponseBody String delete(longid){

demoInfoService.deleteFromCache(id);

return"ok";

}

@RequestMapping("/test1")

public@ResponseBody String test1(){

demoInfoService.test();

System.out.println("DemoInfoController.test1()");

return"ok";

}

}

(10)测试代码是否正常运行了

启动应用程序,访问地址:http://127.0.0.1:8080/test

查看控制台可以查看:

DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id=1

loaded=DemoInfo [id=1, name=张三, pwd=123456]

cached=DemoInfo [id=1, name=张三, pwd=123456]

DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id=2

loaded2=DemoInfo [id=2, name=张三, pwd=123456]

如果你看到以上的打印信息的话,那么说明缓存成功了。

访问地址:http://127.0.0.1:8080/test1

random1=0.9985031320746356

DemoInfoController.test1()

二次访问:http://127.0.0.1:8080/test

loaded=DemoInfo [id=1, name=张三, pwd=123456]

cached=DemoInfo [id=1, name=张三, pwd=123456]

loaded2=DemoInfo [id=2, name=张三, pwd=123456]

这时候所有的数据都是执行缓存的。

这时候执行删除动作:http://127.0.0.1:8080/delete?id=1

然后在访问:http://127.0.0.1:8080/test

DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id=1

loaded=DemoInfo [id=1, name=张三, pwd=123456]

cached=DemoInfo [id=1, name=张三, pwd=123456]

loaded2=DemoInfo [id=2, name=张三, pwd=123456]

(11)自定义缓存key;

在com.kfit.config.RedisCacheConfig类中重写CachingConfigurerSupport中的keyGenerator ,具体实现代码如下:

/**

* 自定义key.

* 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。

*/

@Override

public KeyGenerator keyGenerator() {

System.out.println("RedisCacheConfig.keyGenerator()");

returnnew KeyGenerator() {

@Override

public Object generate(Object o, Method method, Object... objects) {

// This will generate a unique key of the class name, the method name

//and all method parameters appended.

StringBuilder sb = new StringBuilder();

sb.append(o.getClass().getName());

sb.append(method.getName());

for (Object obj : objects) {

sb.append(obj.toString());

}

System.out.println("keyGenerator=" + sb.toString());

returnsb.toString();

}

};

}

这时候在redis的客户端查看key的话还是序列化的肉眼看到就是乱码了,那么我改变key的序列方式,这个很简单,redis底层已经有具体的实现类了,我们只需要配置下:

//key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;

//所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer

//或者JdkSerializationRedisSerializer序列化方式;

RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;

redisTemplate.setKeySerializer(redisSerializer);

redisTemplate.setHashKeySerializer(redisSerializer);

综上以上分析:RedisCacheConfig类的方法调整为:

package com.kfit.config;

import java.lang.reflect.Method;

import org.springframework.cache.CacheManager;

import org.springframework.cache.annotation.CachingConfigurerSupport;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.cache.interceptor.KeyGenerator;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.cache.RedisCacheManager;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.serializer.RedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;

/**

* redis 缓存配置;

*

* 注意:RedisCacheConfig这里也可以不用继承:CachingConfigurerSupport,也就是直接一个普通的Class就好了;

*

* 这里主要我们之后要重新实现 key的生成策略,只要这里修改KeyGenerator,其它位置不用修改就生效了。

*

* 普通使用普通类的方式的话,那么在使用@Cacheable的时候还需要指定KeyGenerator的名称;这样编码的时候比较麻烦。

*

* @author Angel(QQ:412887952)

* @version v.0.1

*/

@Configuration

@EnableCaching//启用缓存,这个注解很重要;

publicclass RedisCacheConfig extends CachingConfigurerSupport {

/**

* 缓存管理器.

* @param redisTemplate

* @return

*/

@Bean

public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {

CacheManager cacheManager = new RedisCacheManager(redisTemplate);

returncacheManager;

}

/**

* RedisTemplate缓存操作类,类似于jdbcTemplate的一个类;

*

* 虽然CacheManager也能获取到Cache对象,但是操作起来没有那么灵活;

*

* 这里在扩展下:RedisTemplate这个类不见得很好操作,我们可以在进行扩展一个我们

*

* 自己的缓存类,比如:RedisStorage类;

*

* @param factory : 通过Spring进行注入,参数在application.properties进行配置;

* @return

*/

@Bean

public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {

RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();

redisTemplate.setConnectionFactory(factory);

//key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;

//所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer

//或者JdkSerializationRedisSerializer序列化方式;

RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;

redisTemplate.setKeySerializer(redisSerializer);

redisTemplate.setHashKeySerializer(redisSerializer);

returnredisTemplate;

}

/**

* 自定义key.

* 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。

*/

@Override

public KeyGenerator keyGenerator() {

System.out.println("RedisCacheConfig.keyGenerator()");

returnnew KeyGenerator() {

@Override

public Object generate(Object o, Method method, Object... objects) {

// This will generate a unique key of the class name, the method name

//and all method parameters appended.

StringBuilder sb = new StringBuilder();

sb.append(o.getClass().getName());

sb.append(method.getName());

for (Object obj : objects) {

sb.append(obj.toString());

}

System.out.println("keyGenerator=" + sb.toString());

returnsb.toString();

}

};

}

}

这时候在访问地址:http://127.0.0.1:8080/test

这时候看到的Key就是:com.kfit.service.impl.DemoInfoServiceImplfindById1

在控制台打印信息是:

(1)keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById1

(2)DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id=1

(3)keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById1

(4)loaded=DemoInfo [id=1, name=张三, pwd=123456]

(5)keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById1

(6)cached=DemoInfo [id=1, name=张三, pwd=123456]

(7)keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById2

(8)keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById2

(10)DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id=2

(11)loaded2=DemoInfo [id=2, name=张三, pwd=123456]

其中@Cacheable,@CacheEvict下节进行简单的介绍,这节的东西实在是太多了,到这里就打住吧,剩下的就需要靠你们自己进行扩展了。

Spring Boot 系列博客】

)前言【从零开始学Spring Boot】 :

http://412887952-qq-com.iteye.com/blog/2291496

)spring boot起步之Hello World【从零开始学Spring Boot】:

http://412887952-qq-com.iteye.com/blog/2291500

)Spring Boot返回json数据【从零开始学Spring Boot】

http://412887952-qq-com.iteye.com/blog/2291508

(15)Spring Boot使用Druid和监控配置【从零开始学Spring Boot】

http://412887952-qq-com.iteye.com/blog/2292362

)Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】

http://412887952-qq-com.iteye.com/blogs/2292376

)Spring Boot普通类调用bean【从零开始学Spring Boot】:

http://412887952-qq-com.iteye.com/blog/2292388

......

(35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

http://412887952-qq-com.iteye.com/blog/2294942

更多查看博客:http://412887952-qq-com.iteye.com/blog

(35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】的更多相关文章

  1. Spring Boot 集成 Redis 实现缓存机制

    本文章牵涉到的技术点比较多:spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对以上这些技术点有一定的了解或者也可以先看看这篇文章 ...

  2. Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    转自:https://blog.csdn.net/linxingliang/article/details/52263763 spring boot 自学笔记(三) Redis集成—RedisTemp ...

  3. Spring Boot从入门到精通(六)集成Redis实现缓存机制

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  4. (37)Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 写后感:博主写这么一系列文章也不容易啊,请评论支持下. 如果看过我之前(35)的文章这一篇的文章就会很简单,没有什么挑战性了. 那么我们先说说这一篇文 ...

  5. 17、Spring Boot普通类调用bean【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/52013017 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个 ...

  6. 75. Spring Boot 定制URL匹配规则【从零开始学Spring Boot】

    在之前有一篇文章说了,博客名称从原来的<从零开始学Spring Boot>更改为<Spring Boot常见异常汇总>,后来写了几篇文章之后发展,有些文章还是一些知识点,所以后 ...

  7. 74. Spring Data JPA方法定义规范【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 事情的起因:有人问过我们这个这个问题:为什么我利用Spring data jpa写的方法没有按照我想要的情况进行执行呢?我记得当时只是告诉他你你先 ...

  8. 58. Spring Boot国际化(i18n)【从零开始学Spring Boot】

    国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素.换言之,应用程序的功能和代码设计考虑在不 ...

  9. 55. spring boot 服务配置和部署【从零开始学Spring Boot】

    Spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动.其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat).当然你也可以将项 ...

随机推荐

  1. jQuery总结04

    1 JavaScript 中的 AJAX 的四个实现步骤分别是? 2 如何处理 XMLHttpRequest 对象的兼容问题? 3 jQuery 中的 AJAX 4 jQuery 选择器包括哪些? 5 ...

  2. C++常用字符串分割方法实例汇总

    投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-10-08我要评论 这篇文章主要介绍了C++常用字符串分割方法实例汇总,包括了strtok函数.STL.Boost等常用 ...

  3. Codeforces--630H--Benches(组合数)

    H - Benches Crawling in process... Crawling failed Time Limit:500MS     Memory Limit:65536KB     64b ...

  4. JFreeChart之堆叠柱形图(StackedBar)

    JFreeChart之堆叠柱形图(StackedBar) JAVA JFreeChart 最近的项目使用有个功能需要使用到堆叠柱形图,看了项目以前的代码实现没有想要的结果.所以自己就先到官网下载了 D ...

  5. jsp页面动态展示list-使用<select>和<c:forEach>标签

    转自:https://blog.csdn.net/zhugewochuang/article/details/80276466 后台:搜索数据放入list,然后为这个list提供响应的get和set方 ...

  6. Play on Words(欧拉路)

    http://poj.org/problem?id=1386 题意:给定若干个单词,若前一个的尾字母和后一个单词的首字母相同,则这两个单词可以连接,问是否所有的单词都能连接起来. 思路:欧拉路的判断, ...

  7. Android Gradle 学习笔记(七):Android Gradle 插件

    我们知道Android Gradle其实就是一个Gradle的一个第三方插件,它是由Google的Android团队开发的,基于Gradle构建的,和Android Studio完美搭配.相比于旧的构 ...

  8. hbase无法启动,The node /hbase is not in ZooKeeper

    问题详细描述如下: 2016-12-09 15:10:39,160 ERROR [org.apache.hadoop.hbase.client.ConnectionManager$HConnectio ...

  9. python--6、logging模块

    logging 可用的日志级别: debug 10 info 20 warning 30 error 40 critical 50 logging默认参数: 默认日志级别是warning. 默认情况日 ...

  10. intellij IDEA常见操作

    1.中文乱码设置:file - setting - Editor - File Encodings 设置为UTF-8 2.tomcat重新启动:Ctrl-F5,或者左上角 3.删除progect 先c ...