SpringBoot-集成redis,dubbo,ssm
项目应用: 1、整合ssm框架应用 spring+springmvc+mybatis(普通方式,整合tk:mybatis) 整合简单的ssm框架(spring+springmvc+普通的方式) 1.1、加入相关的依赖:
1.2、引入热部署插件和lambok插件: 热部署的插件在idea中需要配置的,但是在eclipse中引入就Ok了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
1.3、配置项目自动编译,settings-build-compiler-这里必须需要勾上的。
1.4、启用devtools插件 shift+alt_ctrl+/->registry->勾选compiler.automake.allow.when.app.running。 1.5、在springBoot的插件里面做如下的配置: 以fork的方式去启动devtools:这个配置是必须配置的,不配置的话是不生效的。
上面的就是整个热部署的插件的步骤。 如何去启用lombok:一个实体类简化的插件:有了它之后实体类中hashCode,toString,get,set方法都不用手动去写,直接用注解来生成。 1.6、首先在idea中settings-plugins-搜索lombok-安装lombok插件:
1.7、在实体类上加上@Data,@Setter,@Getter,......加上这些注解之后就可以不用手动去写一些方法,这时就在这个类上加上这些方法了。
@AllArgsConstructor:带参数的构造方法的注解。 @NoArgsConstructor:无参的构造方法的注解。
lombok插件的注解有下面一些。
注意:在类加上@Data这个注解的话是有无参的构造方法,没有有参的构造方法。但是可以加上@AllArgsConstructor这个注解。 这就是插件的作用,凸显的很明显。 1.8、集成Mybatis
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
1.9、如何去配置mybatis 在SpringBoot2.0以后一旦把mybatis的依赖引进来之后,它必须去找数据库的数据源,如果没有的话会报错的。
配置数据源的一些配置如下:这里不用配置数据库连接池了,用默认的就可以
配置下mybatis
建个mapper的接口:
这个接口对应一个在resources文件夹下的一个xxxMapper.xml的文件,每一个接口都会映射一个xml的文件,因为接口文件和xml文件要绑定,代码如下:
上面的方式在xml中加sql语句,在开发中用的很多, @Resource:注解的意思是按照找个bookMapper这个名称在spring容器中去找,有没有这样的一个名字的。如果存在的话就给它装配到BookMapper的属性中去。如果不存在的话会按照BookMapper这个类型去找,如果存在的话也会装配进来。所以是先根据名称去找,再根据类型去找。 如果是@Autowired的话是先按照类型去装配,后面再会按照名称去装配。
断言的结果如果是绿色的话就没问题。
9、批量插入:
上面的单表的操作不需要自己去写的,所以选用mybatis的插件来做 比如使用tk:mybatis来生成mybatis的增删改查的语句。 2、引入tk:mybatis的插件:
2.1、引入的依赖如下:tk.mybatis就是通用mapper。
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
2.2、引入上面的依赖的话,会给引入一个自动配置的tk.mybatis的jar包,有了它之后就知道怎么配置了。
2.3、看下MapperProperties,它有一个前缀mapper
MapperProperties继承了Config这个类。下面是可选的配置的选项。
2.4、属性的配置文件如下:
2.5、写一个项目中所有mapper的父类,代码如下:
package com.boot.ssm.bootssm2.common;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* 项目中所有mapper的父类
* @param <T>
*/
public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
2.6、新建一个图书信息的Mapper文件的接口去继承BaseMapper,代码如下:
2.7、在项目中如果每一个mapper的接口都写一个@Mapper注解的话,很不方便了,可以用下面的方式:在主类上加上@MapperScan的tk.mybatis的注解。value的属性的值是一个数组,这里可以配置多个路径。
2.8、在domain中加一个实体类:
2.9、主函数的代码如下:
运行下:
注意:如果有复合主键的话只能用配置文件了。
在下面的两个jar里面就有方法支持复杂的sql语句的查询。
总结:tk.mybatis和jpa的用法有很多是类似的。如果是多表操作的话还是在xml里面操作,在tk.mybatis中是操作不了的。现在开发的项目中大多数使用单表操作了,基本不怎么用多表了。
3、SpringBoot集成dubbo:
3.1、新建一个dubbo-api的maven项目:这个只需要提供接口就可以,什么都不需要引入,只需要提供服务:
3.2、新建一个实体类,由于这个实体类用户信息类在网络中进行传输,所以要实现序列化接口:
3.3、用dubbo一般用来发布服务的,也就是服务,提供一个api的接口,代码如下:
package org.example.api;
import org.example.domain.UserInfo;
public interface UserService {
//定义用户登录的api
UserInfo loginUser(UserInfo user);
}
3.4、这个api由服务去实现,实现之后给消费者去消费就可以了,新建一个dubbo-provider的boot项目,由于这个provider是要实现api的,实现之后是要给客户端提供服务的,所以要把api的依赖添加到provider项目中:
3.5、写一个服务的实现类,交给Spring容器去管理,写的是单机版本的,并不是分布式的。代码如下:
package com.boot.dubbo.demo.bootdubbo.service;
import com.boot.dubbo.demo.api.UserService;
import com.boot.dubbo.demo.domain.UserInfo;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public UserInfo login(UserInfo userInfo) {
return userInfo;
}
}
3.6、引入dubbo的依赖:由于zkclient这个客户端和zookeeper进行通信,所以要引入zkclient的依赖。也要引入zookeeper的依赖,由于zookeeper包含logback和log4j的依赖的,所以要排除掉依赖,由于在springBoot中已经有了这两个依赖了。否则的话会报错的。
3.7、配置dubbo配置项:在引入dubbo依赖的时候,会引入一个starer的依赖:
配置如下:
然后把接口给暴漏出去,代码如下:
这个api会给客户端调用,所以要分开。
3.8、启用dubbo的整个配置:
这时整个dubbo的服务端就完事了。
3.9、启动下服务端:这时就把服务注册到了zookeeper上了。
新建一个消费端:依赖只需要web就可以了。由于消费端也是依赖于dubbo的,并且消费端的配置和服务端的配置也是一样的:
依赖也是服务端的依赖一样,所以也加进来:
由于消费端也是需要注入api接口的,不需要实现类的。所以消费端也需要注入api的依赖。
消费端也需要启动整个dubbo的配置:
在消费端写一个controller去测试,代码如下:Reference 这个注解的意思是在spring容器中是有的但是从注册中心里面去找有没有这样的对象存在,如果存在的话,通过反序列化的方式赋给这个属性然后进行使用。
package com.boot.consumer.demo.dubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.boot.dubbo.demo.api.UserService;
import com.boot.dubbo.demo.domain.UserInfo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
//引用dubbo服务端暴漏出的接口
@Reference
private UserService userService;
@GetMapping("/login")
public UserInfo userInfo(UserInfo userInfo){
return userService.login(userInfo);
}
}
启动下消费端运行下访问下项目:
小节总结:上面的过程就是SpringBoot去整合dubbo的步骤。zookeeper发布订阅的模式,dubbo使用rpc协议的方式进行通信的,底层用的是socket。
整个dubbo的架构图:
redis也支持服务的注册中心。但是一般用zookeeper,因为zookeeper是高可用的服务注册中心。
4、SpringBoot集成redis
redis:就是一个键值对的nosql数据库
4.1、新建一个项目boot-redis,引入redis和web的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.2、由于在springBoot中自动装配了redis:
只要在类的路径下RedisOperations的话,并且注入了RedisProperties对象的话。就会把这个类装配置进去,并且如果在容器中不存在redisTemplate这个对象的话也会把redisTemplate对象装配进去。SringRedisTemplate这个对象如果在spring容器中不存在的话也会把StringRedisTemplate对象装配到spring容器中去。
StringRedisTemplate的父类就是RedisTemplate。
所以这里根据RedisTemplate对象获取到了两个对象。
现在用RedisTemplate操作下,代码如下:
运行 的结果如下:所以说用redisTemplate是不行的,因为把字符串或者对象存到redis中的话应该有相应的序列化器,如果没有序列化的话肯定是乱码的,redisTemplate默认用的是jdk的序列化器,因为存的时候是二进制,读的时候是把字符串读出来。如果用redisTemplate的话存到redis中是乱码的。
stringRedisTemplate就可以的,如果key相同就会给覆盖。因为StringRedisTemplate有自己的序列化器
运行的结果如下:
如果用StringRedisTemplate存个对象,代码如下:会报错的,报错的原因是不能把一个对象转成字符串。
解决办法:1>:把这个对象转成json字符串。加入依赖:fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
主函数的代码修改如下:
能够存到redis中,但是存的类型不清楚。
2、上面的方法太Low了。都是用框架封装好的,一般会自定义序列化器
代码如下:
主函数修改如下:
运行如下:这时就能看到存的类型了。
用jackson的效率不高,压缩出来的东西回很长。比如用fastjson,或者gson。
1、用fastjson,在项目中经常用的是fastjson,但是也有用gson的,gson的序列化器和fastjson的序列化器的配置是一样的。
1.1、新建一个序列化器,代码如下:
1.2、然后把这个序列化器装配到spring容器中,代码如下:
运行的结果如下:
总结:上面的就是用springBoot去整合ssm,整合dubbo,redis的过程。