SpringBoot(主流)

SpringBoot简介
核心点:
1、敏捷开发,轻量级框架 , 弊端:封装太完美,不方便扩展 (但是高版本中的springboot是可以自定义的)
2、无需tomcat (java应用程序运行,通过运行jar包)
3、减少xml配置(几乎没有xml),配置properties文件
4、SpringCloud + SpringBoot = (微服务开发)
5、注解

SpringBoot与微服务有什么关联?

目前微服务都是使用springCloud(Http接口+rest),SpringCloud用的是SpirngbBoot,SpringBoot Web组件封装SpringMVC。
SpringBoot的底层是SpringMVC,所以SpringBoot不可能和Struts整合。
互联网项目的趋势:面向服务架构(SOA) --》 微服务架构 (SpringCloud+SpringBoot)

SpringData 与 SpringMVC
SpringData主要用来操作数据库,类似mybatis、hibernate
SpringMVC是控制层框架

SpringBoot是否安全?
安全,封装的比较好。

核心依赖:
引入父类工程:自动将常用的依赖包引用过了了
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEALSE</version>
</parent>

引入web组件:自动引用spring 引用SpringMVC,不写版本,自动解决jar包冲突问题
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

springboot封装jar包的依赖原理:(为什么加一个依赖就能引入所有相关jar包)
使用maven继承依赖关系,管理所有的jar包。
引用指定的jar包,然后自动的引用其它相关jar包。

@RestController:返回json格式的数据
@RestController 类似于  @Controller + @ResponseBody

@EnableAutoConfiguration :创建tomcat容器,注入所有配置信息
主方法: main,标识开始运行该项目
启动成功后,端口号为8080

SpringBoot如果有多个controller类,可以新建一个启动类(包含mainfnagf )。
在启动类上使用 @ComponentScan("cn.demo.controller") 扫描所有的controller类

SpringBoot项目启动后,可以直接访问静态资源
静态资源推荐放在src/java/resources目录下的,static(自己新建的目录)下,可以通过
http://localhost:8080/pic.jpg访问图片

全部捕获异常:(管理整个项目的异常,改变404/500错误页面)
(1)新建全局捕获异常类 使用@ControllerAdvice
当项目中出现运行时异常时。。会自动调用此方法,然后返回到相应的页面。

/*** 全部捕获异常:使用AOP的异常通知*@authorAdministrator*如果返回json格式 添加@ResponseBody注解,*如果返回页面使用String作为返回值,不需要添加注解*/@ControllerAdvicepublic classGlobalExceptionHandler {//以json数据返回@ExceptionHandler(RuntimeException.class)@ResponseBodypublic Map<String,Object>error500(){Map<String,Object> map = new HashMap<String,Object>();map.put("500", "系统错误");returnmap;}//    //异常是返回页面//@ExceptionHandler(RuntimeException.class)//public String error404(){//return "error";//}
}

Springboot和freemarker整合:
Springboot和模板引擎整合,不推荐使用jsp。推荐 freemarker
模板引擎(动态页面静态化):将动态的数据未造成静态的html页面
优点: 提高搜索引擎搜索效率,静态页面会排前
能做动态Active实现
模板引擎技术: Freemarker、velocity、thymelef

SpringBoot怎么渲染页面?
(1)加入freemarker依赖
spring-boot-starter-freemarker
(2)freemarker默认找的是resources/templates 目录下的文件
在sourcess/templates 目录下新建 index.ftl 页面
(3)使用@Controller注解,返回String类型数据
可以不加任何配置,直接启动就行了。(也可以配置aplication.properties文件)

pom.xml文件

   <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.3.RELEASE</version></parent><dependencies><!—SpringBoot web 组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

  <!--springboot 整合freemarker 添加的依赖-->    <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-freemarker</artifactId>   </dependency></dependencies>

freemarker在application.properteis中的配置:

spring.freemarker.allow-request-override=falsespring.freemarker.cache=truespring.freemarker.check-template-location=truespring.freemarker.charset=UTF-8spring.freemarker.content-type=text/htmlspring.freemarker.expose-request-attributes=falsespring.freemarker.expose-session-attributes=falsespring.freemarker.expose-spring-macro-helpers=false#spring.freemarker.prefix=#spring.freemarker.request-context-attribute=#spring.freemarker.settings.*=spring.freemarker.suffix=.ftl

#配置freemarker文件的位置
spring.freemarker.template-loader-path=classpath:/templates/#comma-separated list#spring.freemarker.view-names= # whitelist of view names that can be resolved

SpringBoot整合jsp项目
(1)一定要选择war包,maven项目
(2)引入jsp依赖: spring-boot-starter-tomcat ,spring-boot-starter-web,tomcat-embed-jasper
(3)使用@Controller注解,返回String类型数据
(4)在application.properteis文件中配置:

spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.suffix=.jsp

pom.xml文件

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.3.RELEASE</version></parent><dependencies><!-- SpringBoot 核心组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId></dependency></dependencies>

SpringBoot整合JdbcTemplate
(1)引入依赖 spring-boot-starter-jdbc,spring-boot-starter-test,mysql-connector-java
(2)建立application.properties文件 ,配属数据库信息
(3)在业务层, @Autoworied private JdbcTemplate jdbcTemplate; jdbcTemplate.update("数据库语句");
pom.xml文件

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.21</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

main法对应的类中,扫多个包
@ComponentScan(basePackage{"com.demo.controller","com.demo.service"})

SpringBoot整合JPA
SpringJPA:对hibernate做封装,基本上使用注解。
项目整合jdbc/jpa/mybatis不会有冲突,所以依赖不会冲突
(1)引入依赖 spring-boot-data-jpa,mysql-connector-java
(2)创建实体类 ,使用注解@Entity(name="user")--引用java中的,不要引用hiberante里面的
@Id 标识主键,@Column 标识为列
(3)建立application.properties文件 ,配属数据库信息
(4)新建Dao层,集成JpaRepository。public interface UserDao extends

JpaRepository<User,Integer>{},
@Autoworied
private UserDao userDap;
userDao.save("数据库语句");//增加
userDao.find(id);//删除
(5)添加 EnableJpaRepositories("com.demo.dao") //扫描到层
(6)添加EntityScan("com.demo.bean") //扫描实体类

SpringBoot整合Mybatis
(1)加入依赖 mybatis-spring-boot-starter
(2)加入applcation.properties 配置文件,数据库配置信息
mybatis 注解版本 和 XML版本
注解版本
新建mapper接口,UserMapper.java
例如:@Select("{SELECT *FROM USER WHERE NAME=#{name}}")
User findByName(@Param("name") String name);
在main主类中使用注解: @MapperScan("com.demo.mapper")

运行springboot时记得注明tomcat的版本,如果本地tomcat的版本为8.0以下时
通过添加依赖:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>7.0.72</version> <!--这个就是tomcat的版本-->
</dependency>

springboot整合使用springjpa

pom文件引入依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.2.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.21</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

创建User实体类

@Entity(name = "users")public classUser {@Id@GeneratedValueprivateInteger id;@ColumnprivateString name;@ColumnprivateInteger age;//..get/set方法
}

创建UserDao  这里继承了JpaRepository就可以直接使用了,里面有基本的增删改查方法

public interface UserDao extends JpaRepository<User, Integer>{}

创建IndexController

@RestControllerpublic classIndexController {@AutowiredprivateUserDao userDao;@RequestMapping("/index")publicString index(Integer id) {User findUser=userDao.findOne(id);System.out.println(findUser.getName());return "success";}
}

启动项目 需要添加注解:

@EnableJpaRepositories(basePackages = "com.dao")  //扫描到dao层@EntityScan(basePackages = "com.entity") //扫描实体类层

@ComponentScan(basePackages = { "com"})
@EnableJpaRepositories(basePackages= "com.dao")
@EnableAutoConfiguration
@EntityScan(basePackages= "com.entity")public classApp {public static voidmain(String[] args) {SpringApplication.run(App.class, args);}
}

springboot整合多数据源
配置文件中新增两个数据源 application.properties文件中配置:

#数据源test1
spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test1.url= jdbc:mysql://localhost:3306/test01?
useUnicode=true&characterEncoding=utf-8spring.datasource.test1.username=root
spring.datasource.test1.password=root#数据源test2
spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test2.url= jdbc:mysql://localhost:3306/test02?
useUnicode=true&characterEncoding=utf-8spring.datasource.test2.username=root
spring.datasource.test2.password= root

自定义数据源配置:

@Bean(name = "test1DataSource")//创建name为test1DataSource的bean@Qualifier("test1DataSource") //表示引用 test1DataDource@Primary //这个注解指定默认的数据源信息@ConfigurationProperties(prefix = "spring.datasource.test1") //读取application.properteis配置文件中的前缀为 spring.datasource.test1的配置信息
@Configuration //注册到springboot容器中
@MapperScan(basePackages = "com.user1", sqlSessionFactoryRef = "test1SqlSessionFactory")public classDataSource1Config {/**** @methodDesc: 功能描述:(配置test1数据库)*/@Bean(name= "test1DataSource")@Primary  //这个注解指定默认的数据源信息@ConfigurationProperties(prefix= "spring.datasource.test1") //读取application.properteis配置文件中的前缀为 spring.datasource.test1的配置信息publicDataSource testDataSource() {returnDataSourceBuilder.create().build();}/**** @methodDesc: 功能描述:(test1 sql会话工厂)*/@Bean(name= "test1SqlSessionFactory")@Primarypublic SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)throwsException {SqlSessionFactoryBean bean= newSqlSessionFactoryBean();bean.setDataSource(dataSource);//    如果不是注解开发就需要使用下面这个设置,来注明mapper.xml文件的位置//bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));returnbean.getObject();}/**** @methodDesc: 功能描述:(test1 事物管理)*/@Bean(name= "test1TransactionManager")@Primarypublic DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {return newDataSourceTransactionManager(dataSource);}@Bean(name= "test1SqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(  @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throwsException {return newSqlSessionTemplate(sqlSessionFactory);}}

创建分包Mapper ,与数据源配置的@MapperScan注解里面的信息对应。

public interfaceUser1Mapper {@Insert("insert into users values(null,#{name},#{age});")public int addUser(@Param("name") String name, @Param("age") Integer age);
}

启动项目

@SpringBootApplicationpublic classApp {public static voidmain(String[] args) {SpringApplication.run(App.class, args);}
}

事物管理
springboot整合事物管理
springboot默认集成事物,只主要在方法上加上@Transactional即可

SpringBoot分布式事物管理
使用springboot+jta+atomikos 分布式事物管理

pom.xml,添加如下依赖

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

application.properties

# Mysql 1mysql.datasource.test.url= jdbc:mysql://localhost:3306/test01?
useUnicode=true&characterEncoding=utf-8mysql.datasource.test.username=root
mysql.datasource.test.password=rootmysql.datasource.test.minPoolSize= 3mysql.datasource.test.maxPoolSize= 25mysql.datasource.test.maxLifetime= 20000mysql.datasource.test.borrowConnectionTimeout= 30mysql.datasource.test.loginTimeout= 30mysql.datasource.test.maintenanceInterval= 60mysql.datasource.test.maxIdleTime= 60mysql.datasource.test.testQuery= select 1# Mysql2mysql.datasource.test2.url=jdbc:mysql://localhost:3306/test02?
useUnicode=true&characterEncoding=utf-8mysql.datasource.test2.username=root
mysql.datasource.test2.password=rootmysql.datasource.test2.minPoolSize= 3mysql.datasource.test2.maxPoolSize= 25mysql.datasource.test2.maxLifetime= 20000mysql.datasource.test2.borrowConnectionTimeout= 30mysql.datasource.test2.loginTimeout= 30mysql.datasource.test2.maintenanceInterval= 60mysql.datasource.test2.maxIdleTime= 60mysql.datasource.test2.testQuery= select 1

读取配置文件信息

packagecom.config;importorg.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix= "mysql.datasource.test")public classDBConfig1 {privateString url;privateString username;privateString password;private intminPoolSize;private intmaxPoolSize;private intmaxLifetime;private intborrowConnectionTimeout;private intloginTimeout;private intmaintenanceInterval;private intmaxIdleTime;privateString testQuery;
}packagecom.config;importorg.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix= "mysql.datasource.test1")public classDBConfig2 {privateString url;privateString username;privateString password;private intminPoolSize;private intmaxPoolSize;private intmaxLifetime;private intborrowConnectionTimeout;private intloginTimeout;private intmaintenanceInterval;private intmaxIdleTime;privateString testQuery;
}

创建多数据源

@Configuration//basePackages 最好分开配置 如果放在同一个文件夹可能会报错
@MapperScan(basePackages = "com.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")public classTestMyBatisConfig1 {//配置数据源
@Primary@Bean(name= "testDataSource")public DataSource testDataSource(DBConfig1 testConfig) throwsSQLException {MysqlXADataSource mysqlXaDataSource= newMysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource= newAtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("testDataSource");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());returnxaDataSource;}@Bean(name= "testSqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)throwsException {SqlSessionFactoryBean bean= newSqlSessionFactoryBean();bean.setDataSource(dataSource);returnbean.getObject();}@Bean(name= "testSqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throwsException {return newSqlSessionTemplate(sqlSessionFactory);}
}

packagecom.datasource;importjava.sql.SQLException;importjavax.sql.DataSource;importorg.apache.ibatis.session.SqlSessionFactory;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.mybatis.spring.SqlSessionTemplate;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importcom.atomikos.jdbc.AtomikosDataSourceBean;importcom.itmayiedu.config.DBConfig1;importcom.mysql.jdbc.jdbc2.optional.MysqlXADataSource;@Configuration//basePackages 最好分开配置 如果放在同一个文件夹可能会报错
@MapperScan(basePackages = "com.itmayiedu.test02", sqlSessionTemplateRef ="test2SqlSessionTemplate")public classTestMyBatisConfig2 {//配置数据源@Bean(name = "test2DataSource")public DataSource testDataSource(DBConfig1 testConfig) throwsSQLException {MysqlXADataSource mysqlXaDataSource= newMysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource= newAtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("test2DataSource");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());returnxaDataSource;}@Bean(name= "test2SqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throwsException {SqlSessionFactoryBean bean= newSqlSessionFactoryBean();bean.setDataSource(dataSource);returnbean.getObject();}@Bean(name= "test2SqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throwsException {return newSqlSessionTemplate(sqlSessionFactory);}
}

在启动类中需要使用@EnableConfigurationProperteis注解来加载配置信息:
@EnableConfigurationProperties(value = { DBConfig1.class, DBConfig2.class })

日志管理
使用log4j记录日志
log4j.properties (这是linux下的日志配置,如果是windows下使用,需要更改文件路径配置)

#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n    log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold=info
log4j.appender.info.append=true#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold=error
log4j.appender.error.append=true#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold=DEBUG
log4j.appender.DEBUG.append=true#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-

使用AOP统一处理Web请求日志
pom.xml文件

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

使用@Aspect注解标识切面类:

@Aspect
@Componentpublic classWebLogAspect {private Logger logger =LoggerFactory.getLogger(getClass());@Pointcut("execution(public * com.controller..*.*(..))")public voidwebLog() {}@Before("webLog()")public void doBefore(JoinPoint joinPoint) throwsThrowable {//接收到请求,记录请求内容ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request=attributes.getRequest();//记录下请求内容logger.info("URL : " +request.getRequestURL().toString());logger.info("HTTP_METHOD : " +request.getMethod());logger.info("IP : " +request.getRemoteAddr());Enumeration<String> enu =request.getParameterNames();while(enu.hasMoreElements()) {String name=(String) enu.nextElement();logger.info("name:{},value:{}", name, request.getParameter(name));}}@AfterReturning(returning= "ret", pointcut = "webLog()")public void doAfterReturning(Object ret) throwsThrowable {//处理完请求,返回内容logger.info("RESPONSE : " +ret);}
}

缓存支持
注解配置与EhCache使用
pom.xml

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

新建ehcache.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"updateCheck="false"><diskStore path="java.io.tmpdir/Tmp_EhCache" /><!-- 默认配置 --><defaultCache maxElementsInMemory="5000" eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120"memoryStoreEvictionPolicy="LRU" overflowToDisk="false" /><cache name="baseCache" maxElementsInMemory="10000"maxElementsOnDisk="100000" /></ehcache>

配置信息详解:

 <!--name:缓存名称。  maxElementsInMemory:缓存最大个数。  eternal:对象是否永久有效,一但设置了,timeout将不起作用。  timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。  timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。  overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。  diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。  maxElementsOnDisk:硬盘最大缓存个数。  diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. Thedefault value is false.         diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。  memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。  clearOnFlush:内存数量最大时是否清除。-->

代码使用Cacheable

@CacheConfig(cacheNames = "baseCache")public interfaceUserMapper {@Select("select * from users where name=#{name}")@CacheableUserEntity findName(@Param("name") String name);
}

清除缓存

@AutowiredprivateCacheManager cacheManager;
@RequestMapping("/remoKey")public voidremoKey() {cacheManager.getCache("baseCache").clear();
}

使用@Scheduled创建定时任务
在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置

@Componentpublic classScheduledTasks {private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");@Scheduled(fixedRate= 5000)public voidreportCurrentTime() {System.out.println("现在时间:" + dateFormat.format(newDate()));}
}

使用@Async实现异步调用
(1)在启动类上加上@EnableAsync

(2)需要执行异步方法上加入  @Async

就能实现异步。异步就相当于多线程的执行,不需要等方法执行完在执行下一条语句。

自定义参数
(1)在application.properties文件中添加配置
name=www.com

(2)在Controller类中得到配合文件中的参数值

通过 @Value("${name}") 将配置文件中的信息读取过来
    @Value("${name}")privateString name;@ResponseBody@RequestMapping("/getValue")publicString getValue() {returnname;}

多环境配置
(1)编写多个配置文件,命名方式为: application-*.properties
  application-dev.properties:开发环境
  application-test.properties:测试环境
  application-pre.properties:预生产环境

application-prod.properties:生产环境

(2)在application.properties文件中指定使用配置文件:

 spring.profiles.active=pre  #指定使用application-pre.properties --- 预生产环境配置文件

修改端口号
server.port=8888
server.context-path=/Demo

SpringBoot yml 使用
创建application.yml
server:
port:  8090
context-path: /Demo

发布打包
使用mvn package 打包
使用java –jar 包名
如果报错没有主清单,在pom文件中新增

  <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><maimClass>com.dmeo.app.App</maimClass>  //这里指定执行的主类,就是main方法所在的类</configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

Springboot与redis整合:

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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>springboot</groupId><artifactId>springboot-redis</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>springboot-redis Maven Webapp</name><url>http://maven.apache.org</url><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><compiler.source>1.7</compiler.source><compiler.target>1.7</compiler.target><!-- servlet/jsp/EL (2.4/2.0/?)(2.5/2.1/2.1),(3.0/2.2/2.2),(3.1/2.3/3.0) --><servlet.version>3.1.0</servlet.version><jsp.version>2.3.1</jsp.version><jstl.version>1.2</jstl.version><junit.version>4.12</junit.version></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>${jsp.version}</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.21</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.objenesis</groupId><artifactId>objenesis</artifactId><version>1.2</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency></dependencies>
</project>

业务层直接调用StringRedisTemplate:

packagespringboot.springboot_redis.demo.service;importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.stereotype.Service;importorg.springframework.util.StringUtils;@Servicepublic classRedisService {@AutowiredprivateStringRedisTemplate stringRedisTemplate;public voidsetObject(String key,Object value){//redis : hash set zset  list string//先用common-lang包下的 StringUtils 判断key 和value是否为空if(StringUtils.isEmpty(key) || value == null){return;}//判断类型: 存放string类型if(value instanceofString){String strValue=(String )value;stringRedisTemplate.opsForValue().set(key, strValue);return;}//判断类型: 存放list类型if(value instanceofList){List<String> listValue= (List<String>)value;for(String str : listValue){stringRedisTemplate.opsForList().leftPush(key, str);}return;}}
}

application.properteis配置信息:

spring.redis.database=0spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=123456spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.pool.max-active=8spring.redis.pool.max-wait=1spring.redis.timeout=5000

 

转载于:https://www.cnblogs.com/DFX339/p/8890667.html

SpringBoot技术点细解相关推荐

  1. WCDMA的高速引擎 细解HSDPA技术(转)

    WCDMA的高速引擎 细解HSDPA技术(转)[@more@] 对高速移动分组数据业务的支持能力是3G系统最重要的特点之一.WCDMA R99版本可以提供384kbps的数据速率,这个速率对于大部分现 ...

  2. 交换机分布缓存_细解网络设备缓存技术

    原标题:细解网络设备缓存技术 缓存的概念并不陌生,尤其是网络交换机,现在绝大部分的交换机均采用存储转发模式. 缓存的概念并不陌生,尤其是网络交换机,现在绝大部分的交换机均采用存储转发模式.所谓存储转发 ...

  3. SpringBoot的配置详解application

    SpringBoot的配置文件application有两种文件格式,两种配置的内容是一致的,只是格式不一致. 1.application.properties 2.application.yml或者a ...

  4. 知识图谱技术发展详解(一)

    一.万维网现状 1.当前的Web是一种面向人的网络,很多繁琐的过程依旧需要人工的参与. 2.以搜索引擎为例,目前的搜索引擎主要依靠关键字匹配,因此存在如下问题: (1)高匹配.低精度,搜索出来的内容中 ...

  5. Java程序员进阶必读,最全微服务架构技术点详解来啦

    前言 微服务作为这个互联网时代最火的技术之一,想必大家即使没有学习过也有所了解,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服 ...

  6. Silverlight实用窍门系列:35.细解Silverlight冒泡路由事件和注册冒泡路由事件【附带实例源码】...

    Silverlight中的事件分为普通事件和冒泡路由事件,它并没有包括WPF中的隧道路由事件,在本章中将详细讲解冒泡路由事件和如何注册一个冒泡路由事件. 一.细解冒泡路由事件 冒泡路由事件可以比喻为: ...

  7. 【干货】PMcaff干货课程学习精彩分享:Apple Watch 技术特性详解

    昨天PMcaff给大家推荐了Apple Watch的发布会,好多小伙伴们在后台留言,所以PMcaff小咖今天给大家找来一篇干货,看完感觉还不错,在这里分享给大家. 作为苹果主推的智能穿戴产品,Appl ...

  8. SpringBoot异常处理ErrorController详解

    文章目录 一.背景 二.SpringBoot的默认异常处理BasicErrorController 三.自定义错误异常 写在前面: 我是「境里婆娑」.我还是从前那个少年,没有一丝丝改变,时间只不过是考 ...

  9. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  10. springboot+jsp中文乱码_【spring 国际化】springMVC、springboot国际化处理详解

    在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...

最新文章

  1. Design Pattern - Composite(C#)
  2. 【LeetCode从零单排】No22.Generate Parentheses
  3. SAP ByD 期末结账步骤简化(不完整)方法
  4. java小编程--在一个A字符串中找到与B字符串一样的,返回B字符串出现的第一个位置
  5. python 字符串比较忽略大小写的方法_python实现忽略大小写对字符串列表排序的方法...
  6. 架设流媒体服务器[转]
  7. qtplaintextedit如何删除内容_数据库中的数据如何进行批量修改
  8. 爬虫数据传入mysql_nodejs爬虫数据存入mysql
  9. 样条曲面_用SolidWorks曲面将六个小圆管向大圆管过渡
  10. “const char*”类型的值不能用于初始化“char”类型的实体
  11. What is a TensorFlow Session?
  12. 华为IPD研发项目管理5项精髓
  13. 【cuda】——npp/cuda图像预处理resize+norm对比
  14. 华为设备配置MSDP实现PIM-SM域间组播
  15. 微信昵称特殊字符保存StringEscapeUtils
  16. 7.1 我的质量之旅
  17. Android 二维码扫描(仿微信界面),根据Google zxing
  18. echarts 饼形图{c} 显示 [Obejct,Obejct]
  19. 软件开发前言技术系列讲座
  20. On Die Termination (ODT) DDR

热门文章

  1. border-radius的8个属性值_画半圆、叶子等
  2. Python 中的容器
  3. VC++中轻松实现滑动(Slider)控件
  4. 【转】android 常用theme
  5. 这个时代再也难出现贵子
  6. RatingBar的实现
  7. 一起谈.NET技术,在ASP.NET中自动合并小图片并使用CSS Sprite显示出来
  8. ieee1284controller怎么添加打印机_讲述3D打印机怎么用 初学者必看
  9. CF1399D Binary String To Subsequences
  10. BZOJ4072[Wf2014] baggage