spring boot 学习笔记(一)
学习链接:http://www.cnblogs.com/ityouknow/category/914493.html
定义
spring boot 是由pivotal 团队提供的权限框架,设计目的是用来简化新的spring应用的初始搭建以及开发过程,该框架使用了特定的方式来进行设置,从而使开发人员不在需要定义样板化的配置。因此,spring boot 不是新的框架,是默认设置了很多框架的使用方式,就像maven 整合了所有的jar包,spring boot 整合了一部分的框架。
优势
简单,快速,方便
原有web项目
- 1,配置 web.xml,加载 spring 和springMVC
- 2,配置数据库连接,配置spring事务
- 3,配置加载配置文件的读取,开启注解扫描。
- 4,配置日志文件
学习
- 热部署 devtools
- json注解,jsonFromat 等
- service 配置 port 等
- config 配置 对照
- jpa配置 自动生成类等
thymeleaf 模板
thymeleaf (saimei leifu) 介绍
thymeleaf 是一款用于渲染XML/XHTML/HTML5内容的模板模板引擎,类似JSP,velocity,FreeMaker等,它可以轻易的与spring MVC 等Web框架进行集成,作为Web应用的模板引擎。与其他模板引擎相比。thymeleaf 最大的特点是能够直接再浏览器中打开并正确的显示模板页面,而不需要启动整个web应用。 和 velocity ,fremaker,beetle 这类的模板到底好在哪里?thymeleaf是不同的,因为它使用了自然的模板技术,这以为着thymeleaf的模板语法不会破坏文档的结构,模板依旧是有效的xml文档,模板还可以作为工作原型,thymeleaf会在运行期替换掉静态值,velocity与freemarker则是连续的文本处理器。
- Velocity:
$message
- FreeMarker:
${message}
- Thymeleaf:
Hello World!
由于thymeleaf 使用XML DOM 解析器,因此它并不适合处理大规模的XML文件
URl
url 在web应用模板中占据十分重要的地位,需要注意的是thymeleaf 对于url的处理是通过语法,@{。。。}来处理的,thymeleaf 支持决定路径。
条件求值
<a th:href="@{/login}" th:unless=${session.user != null}>Login
for 循环
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
页面即原型
在web 开发过程中,前后端的配合,需要修改模板,静态资源文件等, 但实际上前端工程师的职责更多应该关注与页面非后端,使用jsp,veloctiy 等传统的java模板引擎很那做到这一点,biubiu渲染以后才能看到结果,thymeleaf 从根本上颠覆了这一过程,通过书信进行模板渲染。
过滤器 filter 过滤器
filters用于记录调用日志,排除xss威胁的字符,执行权限验证等。SpringBoot 自动添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,我们也可以自定义filter
1, 实现Filter接口,实现Filter方法。 2, 添加@Configuration 注解,将自定义Filter 加入过滤链
自定义 Property
1,配置在application.properties中 > * com.neo.title=螺旋 * com.meo.description=啰嗦 2,自定义配置类 @Component public class NeoProprtties { @Value private String title; @Value private String description; }
数据库
jpa sun官方提出的java持久化规范,它为java开发人员提供了一种对象/关系映射工具来管理java应用中的关系数据,住哟啊为了简化现有的持久化开发工作和整合prm技术,结束现有的,hibernate,TopLink,JDO等orm框架各自为营局面,吸收了他们的有点,具有
易于使用,伸缩性强的有点。与spring 结合紧密。
> jpa 是一套规范,不是一套产品。hibernate,topLink,JDO 他们是一套产品。
spring data jpa 是spring 基于orm框架,jpa规范基础上封装的一套jpa应用框架,可使开发者使用简易代码访问数据和操作数据,提供crud的常用功能。
mysql ,spring data jpa 是利用Hibernate 生成各种自动化的sql ,crud 等
1,添加java包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2,添加配置文件
> spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql= true
3,hibernate.hbm2ddl.auto 参数的主要用于:自动创建、更新、验证数据库表结构4个值
> * create :每次加载hibernate时都会删除上一次生成的表,然后根据model类重新生成新的表。就是没有改变也会这样执行。会导致数据库文件丢失。
> * create-drop: 每次加载hibernate是根据model类生成表,但是sessionFactory已关闭,表就自动删除。
> * update :最常用的,第一次加载hibernate时候根据model类会自动建立表的结构(要有建立好数据库),以后加载hibernate 时根据model 类自动更新表结构,即使表表结构改变了单表中仍然存在不会删除以前的行,要注意的是当部署到服务器后,表接口是不会被马上建立起来的,是哟啊等应用第一次运行起来才会。
> * validate : 每次加载hibernate时,验证创建数据库结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
dialect 指, 指定生成表名的存储引擎为inneoDB
show-sql 是否打印出自动生产的sql。
3,添加实体类和Dao
> @Entity
public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @Column(nullable = false, unique = true) private String userName; @Column(nullable = false) private String passWord; @Column(nullable = false, unique = true) private String email; @Column(nullable = true, unique = true) private String nickName; @Column(nullable = false) private String regTime; //省略getter settet方法、构造方法 }
dao 只要继承jpaRepository 类就可以。
public interface UserRepository extends JpaRepository<User, Long> { User findByUserName(String userName); User findByUserNameOrEmail(String username, String email);
entity 中不映射成列的字段需要加 @Transient 不加注解会被映射成列。
多数据源的支持
同源数据库的多源支持
如果使用分布式开发模式,不同的服务使用不同的数据库,一个项目中有可能会使用多个数据源。因此需要配置多个数据源,spring data jpa 对多个数据源有很好的支持,实现主要分三步 1,配置多个数据源 2,不同实体类放入不同包内 3,声明不同的包实体类指向不同的数据源,事务支持。
使用枚举注解
我们希望数据库中存储的是枚举对应的String类型,而不是枚举的索引值 @Enumerated(EnumType.STRING) @Column(nullable = true) private UserType type;
4,测试 注解,@RunWith(SpringJunit4ClassRunner.class) @SpringApplicationCinfiguration(Application.class)
spring data jpa 还有很多的功能,比如封装好的分页,可以自己蒂尼sql,主从分离等。
Gradle 构建工具
spring 项目建议使用gradle进行构建项目相对 maven来讲,gradle更简洁。 而且 gradle 构建大型项目。吸收了maven和ant的特点。
Werbjars
Webjars 是一个神奇的东西,可以以jar包的形式,使用前端的各种框架,组件。 webjars 是将客户端资源达成jar包。以对资源进行统一的依赖管理。webjar包部署在maven 中央仓库上。
- 为什么使用,webjars 可以像maven一样提供给我们前端的资源jar包,方便管理依赖。
- 如何使用 WebJars主官网 查找对于的组件,比如Vuejs <dependency> <groupId>org.webjars.bower</groupId> <artifactId>vue</artifactId> <version>1.0.21</version> </dependency>
- 页面引入
<link th:href="@{/webjars/bootstrap/3.3.6/dist/css/bootstrap.css}" rel="stylesheet"></link>
spring Boot redis 的使用
redis 介绍
redis 是业界使用最广泛的内存数据存储。相比 memcached redis支持更丰富的数据结构。例如,hashes list sets 等,支持数据持久化。redis还提供数据库的一些特性,例如,事务,HA,主从库等。redis 兼具了缓存系统和数据库的一些特性,有丰富的应用场景。
如何使用
引入spring -boot-starter- redis jar包
添加配置文件 # REDIS (RedisProperties) Redis数据库索引(默认为0) spring.redis.database=0
Redis服务器地址 spring.redis.host=192.168.0.58 Redis服务器连接端口 spring.redis.port=6379
Redis服务器连接密码(默认为空) spring.redis.password=
连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8
连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1
连接池中的最大空闲连接 spring.redis.pool.max-idle=8
连接池中的最小空闲连接 spring.redis.pool.min-idle=0
连接超时时间(毫秒) spring.redis.timeout=0添加cache 配置类 @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport{ }
自动根据方法生成缓存 @RequestMapping("/getUser") @Cacheable(value="user-key") value 值就是缓存到redis中的key
共享Session-spring-session-data-redis
分布式系统中,sessiong共享有很多的解决方案,其中托管到缓存中应该是最常用的方案之一,
引入依赖 spring-session-data-redis
session配置 @Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30) public class SessionConfig { } maxInactiveIntervalInSeconds :设置session失效时间,使用redis session 之后,原boot 的server.session.timeout 属性不再生效。
spring boot RabbitMQ
介绍
RabbitMQ 是实现高级消息队列,AMQP的消息中间件的一种,起源于金融系统,在分布是系统中存储转发消息,具有易用性,拓展性,高可用的特性,RabbitMQ 主要是以为系统之间的双向解耦而生,当生产者生成大量数据,消费者无法快速的消费,就需要一个中间件缓冲,保存这些数据。
AMQP,即 Advanced Message Queuing Protocel ,高级消息队列协议。是应用层协议的一个开放版本,为面向消息的中间件设计。消息中间件主要是用于组件之间的解耦,消费发送者无需知道消息执行者者,反之亦然,AMQP 主要特征就是面向消息,队列,路由(包括点对点和发布,订阅),可靠性,安全等特点。 -- 消息中间件主要是用于组件之间的解耦。
RabbitMQ 是一个开源的AMQP实现,服务端使用Erlang 语言编写支持多种客服端,现有的语言基本偶支持。入Python,ruby。net java jms c PHP actionscript xmpp stomp。AJAX。用于在分布式系统中储存转发信息,在易用性,拓展性,高可用性表现不俗。
#### 概念
通常的消息队列,会有三个概念,发送者,接收者,队列。RabbitMQ 在这个基本的概念上添加了一层,在发消息者 和 队列中,叫交换器,exchange ,这样就变成,发消息者把消息给交换器,交换器再通过策略把消息传给队列。
其中比较重要的概念有,虚拟主机,交换器,队列 ,绑定
* 虚拟主机:一个虚拟主机持有一组交换机,队列和绑定。用户只能在虚拟主机的颗粒进行权限控制,如果想禁止A组访问B组的交换机/队列和绑定,必须为A和B分别创建一个虚拟主机,每一个RabbitMQ服务器都有一个默认的虚拟主机。
* 交换机 exchenge 用于转发消息,但是不会存储,因此需要Queue bind 。不然那exchange会直接丢弃producer发送过来的消息,这里一个重要概念,路由键,消息到交换器,交换器会转发到对应的队列中,这个需要路由键控制。
* 绑定 交换机需要和队列相绑定,多对多关系。
#### 交换机 Exchange
交换机的功能主要是接收消息并转发到绑定的队列中,交换机不存消息,在启用ack模式后,交换机找不到队列会返回错误。交换机有4终类型,direct ,topic,headers and fanout
@ direct: direct 启动先匹配,再投送。即再绑定的时候设置一个值,routing_key 消息的routing_key 匹配时,才会投送到绑定的队列中。
@ Topic : 按规则转发消息
@ Headers : 设置 header attribute 参数类型的交换机。
@ fanout: 转发消息到所有的绑定队列
* direct exchange
direct exchange 是RabbitMQ 默认的就交换机模式,最简单的,根据key 找队列。一个队列上可以绑定多个key。
* Topic Exchange
Topic Exchange 转发消息主要是通配符,队列和交换机绑定会定义一种路由模式,路由键匹配上路由模式后才能通过交换机转发消息。
这种交换机模式下:
** 路由键 必须是一串字符串,用英文句号隔开,比如,aaa.su
** 路由模式必须包含一个标识符 \*,\#, 主要用于匹配路由键制定位置的单词,比如,aaa.b.*,能匹配的路由键就是 第一个单词aaa,第三个单词b。如果末尾是井号(\#),可以匹配所有以此开头的路由键。
** 具体的代码,第一参数 交换机, 第二参数 routing key 第三参数为具体消息。
> rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", " this is RabbitMQ!");
topic 和 direct 类似,匹配上支持了模式,在点分的 routing——key 模式中,通配符两个,型号 表示一个词,井号 表示多个或零个。
* Headers Exchange
headers 也是根据规矩匹配,对比direct 和 topic 固定的是用routing key ,headers 是一个自定义匹配规则的类型,在队列和交换机绑定时,会设定一组键值对规则,消息中也包括一组键值对,如果这些键值对,有一对或者全部匹配的时候,消息就会被投放到对应的队列。
* Fanout Exchange
fanout exchange 消息广播模式,不管路由键或路由模式,会把消息发给所有绑定到它的队列,如果配置了routing key 会被忽略。
#### springBoot 集成 RabbitMQ
##### 1,添加pom包 spring boot stater amqp 包
##### 2,配置文件
> 配置Rabbitmq 的安装地址,端口,以及账户信息。
spring.application.name=spirng-boot-rabbitmq
spring.rabbitmq.host=192.168.0.86
spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=123456
3 队列配置
public Queue queue(){ return new Queue(“hello”)}
发送 rabbitTemplate 是springBoot 提供的默认实现 public class helloSender{ @autowired private amqpTemplate rabbitTemplate;
public void send(){
string context = "hello" + new Date();
System.out.pringln("Sender:"+context);
this.rabbitTemplate.convertAndSend("hello",context);
}
}
--接收者 @Component @RabbitListener public class HelloReceiver { @RabbitHandler public void process(String hello){ System.out.println("Receiver :"+hello); } } --测试 @RunWith(SpringRunner.class) @SpringBootTest public class RabbitMqHelloTest{
@Autowired
private HelloSender helloSender;
@Test
public void hello() throws Exception{
hrlloSender.send();
}
} -- 接收者和发送者必须一致 --发送者 public void send(User user){ system.out.println("Sender object: "+user.toString()); this.rabbitTemplate.convertAndSend("object",user); }
--接收者 @RabbitHandler public void process(User user){ system.out.println("Receiver object :" +user); } --Topic Exhange 可以根据不同的routing key 自由绑定不同的队列,需要对topic 规则配置。 @Configuration public class RopicRabbitConfig { final static String message = "topic.message"; final static String messages = "topic.messages";
@Bean
public Queue queueMessage(){
return new Queue(TopicRabbitConfig.message);
}
@Bean
public Queue queueMessages(){
return new Queue(TopicRabbitConfig.messages);
}
@Bean
TopicExchange exchange(){
return new TopicExchange("exchange");
}
@Bean
Binding bindingExchangeMessage(Queue queueMessage,TopicExchange exchange){
return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
}
@Bean
Binding bindingExchangeMessages (Queue queueMessages,TopicExchange exchange){
return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
}
}
使用queueMessages 同时匹配两个队列,queueMessage只匹配“topic.message” public void send1(){ String context = "hi ,i am message1"; System.out.println("Sender: "+context); this.rabbitTemplate.convertAndSend("exchange","topic.message",context); }
public void send2(){ String context = "hi i am message2"; System.out.println("Sender :"+context); this.rabbitTemplate.convertAndSend("exchange","topic.message",context);
} --Fanout Exchange Fanout 是我们熟悉的广播模式或者订阅模式。给Fanout交换机发送消息,绑定了这个交换机的所有队列都收到这个消息。 Fanout @Configuration public class FaoutRabbitConfig{ @Bean public Queue AMessage(){ return new Queue("fanout.A"); }
@Bean
public Queue BMessage(){
return new Queue("fanout.B");
}
@Bean
public Queue CMessage(){
return new Queue("fanout.C");
}
@Bean
FanoutExchange fanoutExchange(){
return new FanoutExchange("fanoutExchange");
}
@Bean
Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange){
return BindingBuilder.bind(Amessage).to(fanoutExchange);
}
@Bean
Binding bindingExchangeB(Queue BMessage,FanoutExchange fanoutExchange){
return BindingBuilder.bind(Bmessage).to(fanoutExchange);
}
@Bean
Binding bindingExchangeC(Queue CMessage,FanoutExchange fanoutExchange){
return BindingBuilder.bind(CMessage).to(fanoutExchange);
}
}
spring boot 定时任务
pom 包引入
spring boot starter 包
启动定时注解
启动类上加@EnableScheduling 开启定时 @SpringBootApplication @EnableScheduling public class Application{
public static void main(String[] args){
SpringApplication.run(Application.class,args);
}
}
####创建定时任务实现类 @Component public class SchedulerTask{ private int count = 0;
@Scheduled(cron="*/6 * * * *?")--@Scheduled(fixedTate = 6000)
private void pricess(){
System.out.println("this is scheduler task runing "+(count++));
}
}
spring boot 学习笔记(一)的更多相关文章
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用[z]
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- Spring Boot 学习笔记--整合Thymeleaf
1.新建Spring Boot项目 添加spring-boot-starter-thymeleaf依赖 <dependency> <groupId>org.springfram ...
- 我的第一个spring boot程序(spring boot 学习笔记之二)
第一个spring boot程序 写在前面:鉴于spring注解以及springMVC的配置有大量细节和知识点,在学习理解之后,我们将直接进入spring boot的学习,在后续学习中用到注解及其他相 ...
- Java框架spring Boot学习笔记(六):Spring Boot事务管理
SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.
- Spring Boot学习笔记---Spring Boot 基础及使用idea搭建项目
最近一段时间一直在学习Spring Boot,刚进的一家公司也正好有用到这个技术.虽然一直在学习,但是还没有好好的总结,今天周末先简单总结一下基础知识,等有时间再慢慢学习总结吧. Spring Boo ...
- spring boot学习笔记2
开场知识: spring 容器注入bean,时容器初始化的一些接口以及接口调用的时间先后顺序: 1)BeanFactoryPostProcessor 容器初始化的回调方法 * BeanFactoryP ...
- Spring Boot学习笔记二
Spring Boot入门第二篇 第一天的详见:https://www.cnblogs.com/LBJLAKERS/p/12001253.html 同样是新建一个pring Initializer快速 ...
随机推荐
- 阿里云系统安装部署Freeswitch
1.安装vim apt-get install vim 2.修改镜像源 将/etc/apt/source.list的原有源注释掉,添加下面的源: deb http://mirrors.163.com/ ...
- async样例
function iniProcessDetail(isjob) { var cursor = logColl.find({}).sort({ip: 1}); var insertbolk = []; ...
- python实现经典冒泡算法
利用for循环,完成a=[1,7,4,89,34,2]的冒泡排序 冒泡排序:小的排在前,大的排在后面
- Android开发之《Module相互引用,NDK不能正常Debug》
解决Android Studio不能进入调试模式问题 Android Studio 2.2.3 native debug 无法调试?:https://www.zhihu.com/question/54 ...
- documentFragment深入理解
documentFragment是一个保存多个element的容器对象(保存在内存)当更新其中的一个或者多个element时,页面不会更新.只有当documentFragment容器中保存的所有ele ...
- View 属性
关于 View 设置属性的方式: JavaxmlstyledefStyleAttrdefStyleResTheme 关于 defStyleRes 的使用,和在 xml 中声明 style=" ...
- Redis 机器内核参数优化
" > /proc/sys/vm/overcommit_memory echo never > /sys/kernel/mm/transparent_hugepage/enabl ...
- Flutter Widgets 之 SnackBar
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 基础用法 应用程序有时候需要弹出消息提示用户,比如'网络连 ...
- Nginx使用和配置
概要: Nginx 简介 Nginx 架构说明 Nginx 基础配置与使用 Nginx 反向代理与负载均衡 Nginx 实现高速缓存 Nginx 性能参数调优 一.Nginx 简介与安装 Nginx ...
- python之面向对象02
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法 1. __init__()方法 class Cat: def __init__(self,newname, ...