springboot快速开发(二)

版权声明: https://blog.csdn.net/u011402896/article/details/79956630
springboot的快速上手


1. 建立目录


controller
service
domain
Application.java 启动类


2. 支持web
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 
3. 编写第一个controller
@RestController
public class HelloWorldController {
    @RequestMapping("/hello")
    public String index() {
        return "Hello World";
    }
}
访问地址: localhost:8080/hello即可


4. 热启动配置,修改后实时生效,不需要重新启动
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>



5.  web综合开发
(1) json开发注解 RestController即可,如果是需要页面则采用Contoller注解
(2) 定义Filter过滤器,boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter这两个过滤器
a. 实现Filter接口
b. 添加@Configuration注解,将自定义Filter加入到过滤链中
(3)属性文件读取
定义一个类,注解component
将application.properties中的属性采用@value("${mysql.username}")注入
并且需要get set方法
比如可以注入不同地址和日志输出级别
logging.path=/user/local/log
logging.level.com.favorites=DEBUG
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=ERROR


(4) 数据库开发
依赖加入
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
Entity中不映射成列的字段得加@Transient 注解,不加注解也会映射成列。


写实体类,然后添加注解,然后在这个里面一堆注解,比如
@Column 然后null或者unique的boolean值
不映射的要注解@Transient。
这尼玛 xml和注解之间的战争是吗


较新版的Spring Boot取消了@SpringApplicationConfiguration这个注解,用@SpringBootTest就可以了这里写图片描述


我擦
这个hibernate有点厉害呢,可以自动创建表,如果不是这样的话,那怎么办!
hibernate中有不同的配置参数,用来创建表,或者升级表。springboot采用这个hibernate来
访问数据层看来是有一定的道理的。


分析下JpaRepository
这个接口继承了两个接口
PagingAndSortingRepository 分页接口 
QueryByExampleExecutor 查询接口


CrudRepository这个接口和其中的方法有些同。
挺厉害的呢。


spring data jpa还有封装好的分页,自定义sql和主从分离等,牛逼


(5) 采用这个Thymeleaf替代jsp等页面展示,可以解析XML/XHTML/HTML5
采用了DOM XML引擎,不适合解析大规模的xml文件
语法对比
Velocity: <p>$message</p>
FreeMarker: <p>${message}</p>
Thymeleaf: <p th:text="${message}">Hello World!</p>


URL
URL在Web应用模板中占据着十分重要的地位,需要特别注意的是Thymeleaf对于URL的处理是通过语法@{…}来处理的。Thymeleaf支持绝对路径URL:
<a th:href="@{http://www.thymeleaf.org}">Thymeleaf</a>


条件求值
<a th:href="@{/login}" th:unless=${session.user != null}>Login</a>
for循环
<tr th:each="prod : ${prods}">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
Thymeleaf不会引入需要在应用服务器才能解析的标签等
前端工程只需要交付纯粹的HTML/CSS/JAVAScript即可


建议用gradle来构建spring项目,虽然目前maven还是主流


WebJars把前端的东西JavaScript,Css等打成jar包文件,进行统一依赖管理。
这个jar包可以部署在Maven中央仓库上。
替代哪种拷贝资源的方式
比如组件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>
示例代码
https://github.com/ityouknow/spring-boot-examples


语法参考:https://www.tianmaying.com/tutorial/using-thymeleaf


springboot官方文档:https://qbgbook.gitbooks.io/spring-boot-reference-guide-zh/content/


注意:这个网站可以自动生成demo,http://start.spring.io/
6. redis的使用


redis 比memcache更牛一些,更多数据结构和持久化特性,列表,hash,set等
spring写了redis的template方法类


编写配置类,继承CachingConfigurerSupport


设置一些参数,见类中


编写测试方法,采用的是redisTemplate模板来设置相关的值和取值
还有StringRedisTemplate可能是用来存String类型的值的


下面重点说,在web查询缓存的时候如何来返回。
这里有一个问题,关于springboot的注入的问题
在启动类中,即用@SpringBootApplication修饰的类中,
需要run的类应该为在所有子包外面的启动类,比如这里用的
SpringApplication.run(Application.class, args);
这样就能扫描这个class下面的子包注册了,否则持久层的就没法注册了不是。


在requestMapping修饰的方法上加入缓存注解,可以将返回的缓存到redis中


7. springboot 和mybatis的结合
(1) 配置属性文件中指定实体类包 mybatis.type-aliases-package=org.yinxueframework.cms.admin.domain
(2) 在启动applicaton中指定扫描的mapper
可以采用注解的方式或者xml的配置来配置mybatis的这个数据层访问
看喜好了,mybatis就是要让你写sql写个爽。唉......
大的互联网公司都有mybatis,而hibernate一般都传统企业喜欢用。




8. rabbitMQ的消息中间件用法,比activeMQ好,用来组件解耦,和异步
现在大家都放在这个容器中,就形成了异步的方式,这样就解放了生产者和消费者的生产力。
流水线般操作。多好!!! 这个吞吐量咋办?
alibaba做了一个交换器,用来将这些消息转发到不同的队列中,采用一定的规则!
有4种方式
第一种,先匹配,在投送 DirectExchange
第二种,按规则转发消息,最灵活 TopicExchange
第三种,设置消息头属性参数类型的交换器 
第四种,转发消息到绑定的队列中。
第一种是默认的。也是最简单的。根据key全文搜索赌赢的队列。
第一种用法详细解析:
绑定的key,bindingkey就是生产的消息提供,
然后匹配路由键
有可能出现两个绑定key到一个队列中上
那是因为可能发生第三个队列,这样这其中一个就可以到第三个
队列中去,而第二个队列可以接收两种类型绑定key的消息
那 路由键是咋么确定的呢。


第二种解析:
哟个通配符的方式,队列和交换机定义中路由模式,那么通配符匹配到了才能转发这个消息
a.路由键是一串字符,用.隔开,比如  agreements.us agreements.eu.stockholm
b.必须包含一个*号,用来匹配指定位置的单词,
agreements..b.*  这个表示只能匹配第一个单词是agreements,第四个是b的情况
agreements.eu.berlin.# 这个表示以agreements.eu.berlin开头的单词都可以
#表示一个或者多个单词


具体的发码信息:
第一个参数表示交换机,第二个表示routingkey 第三个表示参数即消息
rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2","this is RabbitMMMMMMQQQQQ")


与上面的区别就是 采用了 * 或者 # 这两个符号,前者表示一个词,后者表示0个或者多个词


headersExchange 
是用来自定义规则的,设定一组键值对,当这些键值对有一对或者全部匹配时
消息被投送到对应的队列中
FanoutExchange
消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列。
如果配置了routing_key会被忽略。




rabbitMQ的安装
下载erlang语言包,配置path
下载rabbitMQ windows64安装包,安装
命令行启动,安装插件,然后启动管理:
rabbitmq-plugins enable rabbitmq_management
rabbitmq-service stop
rabbitmq-service install
rabbitmq-service start
管理地址:http://localhost:15672/#/  别写错了,这里也有坑啊!
登帐帐号和密码都是guest


当一个接收者对队列进行监听的时候,就按顺序取出进行处理即可
当两个接收者对队列进行监听的时候,就平均分布进行处理?


测试语句中需要对将信息存储到队列中时需要进行抛出异常的写法,否则会有消息都丢失???? 原因是啥?


测试的时候线程直接就结束了,关闭了容器,使得revicer没来得及处理消息就关闭了。


对于对象的处理,信息直接接收,并且处理,直接采用User对象作为入参。示例如下:
注意:::::::::::  需要在配置的启动类中配置相应名称的队列比如 new Queue("user")
测试语句,线程需要等待下让revicer处理完请求,否则会造成队列积压。
@Test
    public void sendUser() throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            User user = new User("zhangsi",String.valueOf(i));
            helloSender.sendUser(user);
        }
        Thread.sleep(10000);
    }


这是接收者处理器。
@Component
@RabbitListener(queues = "user") //监听队列user
public class UserRecevier {


    @RabbitHandler
    public void handleUser(User user){
        System.out.println(user);
    }
}


其他几种模式,topic和广播模式等见这里的详细帖子 https://mp.weixin.qq.com/s/5G3wHzNzpcUlBLwqOJ7BUQ


8. 多数据库的配置




9. 定时任务的开启
(1)开启定时任务的内容。
启动类上注解加上@EnableScheduling 开启定时任务的内容。
(2)在需要执行的任务上进行注解
a.采用Quartz框架的Cron表达式
@Scheduled(cron="*/6 * * * * ?") 这里的*号之间有空格
依次表示的是秒分时日月周年
b.方法注解
@Scheduled(fixedRate= 6000) 上一次执行时间的6s后
@Scheduled(fixedDelay= 6000) 上一次执行完毕时间之后6秒再执行
@Scheduled(initialDelay=1000,fixedRate=6000) 第一次延迟1秒后执行,然后按6秒执行一次




10. MongoDB
noSQL 最像关系型数据库的非关系型数据库
一条记录就是一个文档,是一个数据结构。由字段和值组成。与json对象类似。
适合缓存和日志,不使用复杂的多表级联查询,事务支持弱。




阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页