第一章 Spring Boot 入门
1、1配置开发环境
1、1、1安装JDK
1、1、2安装IDEA或STS
1、1、3安装配置Maven
1、1、4安装git或svn
具体操作步骤比较简单,请参考官网:https://spring.io/guides
1、2创建工程
1、2、1官网导出
进入springboot的官网的github仓库,根据项目要求选择组件,然后下载对应的工程即可。
1、2、2IDEA创建yi中方式就是创建maven项目,然后在pom.xml中添加对应的依赖也可以。
配置好程序的maven,然后右击创建一个Spring stater 项目,然后如图所示,操作即可。还有
至此项目创建完毕。
具体的pom.xml文件参考:https://spring.io/guides/gs/actuator-service/ ,具体内容不再呈现。
1、3简单实例
1、在src/main/java下创建对应的文件夹,用来存放代码,在其根目录下的Application中修改代码如下:
package com.huawei.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@RestController
public class SpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudApplication.class, args);
}
@RequestMapping(value = "/products")
public String getResult() {
return "hello";
}
}
程序有默认的端口等配置信息,具体application.properties文件配置在src/main/resources/application.properties ,参考官网或我的另外一篇博客,参数有具体讲解。
https://blog.youkuaiyun.com/weixin_41419401/article/details/99774549
1、4发布运行
程序可以通过gradle或maven打包为jar或war包,也可以直接运行main方法启动,同时,springBoot还支持多套属性文件切换,具体配置参考官网。
java -jar spring-boot-hello-0.1.0.jar
maven打包为jar包命令,打包为war包时需要修改pom.xml文件,./mvnw clean package
二、数据库的使用
常见持久化模块
数据库的大部分映射和持久化操作类似。基本流程为:
添加依赖---->修改数据库配置信息---->实体建模---->实体持久化
其中springBoot集成了大部分的常用操作,如JPA等,同时支持多种框架的灵活使用。
1、MYSQL
a、添加依赖
b、创建实体建模
根据业务分析实体间的关系如下图:
对应的实体如下:
@Entity
@Table(name="department")
public class Department{
@Id
@GenerateValue(Strategy=GenerationType.IDENTITY)
private Long id ;
private String name ;
public Department(){}
//省略setter,getter方法
}
其中可以使用@ManyToOne和@ManyToMany用来定义实体间的映射关系,@DateTimeFormat对时间格式化,@JsonBackReference来防止关系对象的递归访问。中间表使用user_id来存储它们各自的ID,表示它们的对应关系。
@Entity
@Table(name="user")
public class User implements Serilizable{
@Id
@GenerateValue(Strategy=GenerationType.IDENTITY)
private Long id ;
private String name ;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdate ;
@ManyToOne
@JoinColumn('did')
@JsonBackReference
private Department departement ;
@ManyToMany(cascade ={},fetch=FetchTypt.EAGER)
@JoinTable(name = "user_role" ,joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinCloumn(name="roles_id")})
private List<Role> roles ;
public User(){}
//省略setter,getter方法
}
角色类实体同部门实体编写。
c、实体的持久化
使用JPA是持久化代码如下;
@Respository
public interface UserRepository extends JpaRepository<User , Long>{}
JpaRepository接口的继承关系如下:
JpaRepository---->PagingAndSortingRepository---->CrudRepository---->Repository
直接使用一个接口就可以实现增删改查和分页查询,以及制定字段的排序等操作。JpaRepository接口除默认的实现方法外,还提供了自定义声明方法的规则,接口中使用关键字findBy、readBy,getBy作为方法名的前缀,拼接实体类的属性字段(首字母大写),如:And,Or,Between,LessThan,GreaterThan,isNull,NotNull,Like,NotLike,OrderBy,Not,In,NotIn()FindByNotIn(Collection<String> nameList)
d、测试SQL
@EnableTransactionManagement 启用JPA事务管理;
@EnableJpaRepositories 启用JPA资源库并指定了上面定义的接口资源库的位置;
@EntityScan 指定了实体的位置,它将导入我们定义的实体
@Order(Ordered.HIGHEST_PRECEDENCE)
@configuration
@EnableTansactionManagement(proxyTargetClass=true)
@EnableJpaRepositories(basePackages="XXX.XXX.respository")
@EntityScan(basePpackages="XX.XX.entity")
public class JpaConfiguration{
@Bean
public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor (){
return new PersistenceExceptionTranslationPostProcessor ()
}
}
测试时可以在数据库服务其中创建test库,远程运行时可能权限访问异常,此时可执行一下语句,授权:
grant all privileges on test.* to 'root'@'localHost' identified by '密码' ;
springBoot中的配置如下:
测试程序先初始化数据库,创建部门,创建角色,创建用户,同时将它的所属部门设定为上面创建的部门,并将现有的所有角色都分配给这个用户,使用分页查询获取用户列表,并打印相应的信息。代码如下:
@RunWith(SpringJunit4Runner.class)
@ContextConfiguration( classes = { JpaConfiguration.class } )
public class MysqlTest{
private static Logger logger = LoggerFactory.getLogger(MysqlTest.class) ;
@Autowired
UserRespository userRespository ;
@Autowird
DepartmentRespository departmentRespository ;
@Autowird
RoleRespository roleRespository ;
@Before
public void initData(){
userRepository.deleteAll();
roleRepositpry.deleteAll();
departmentRepository.deleteAll();
Department department = new Department();
department.setName("kaifabu");
departmentRespository.save(department);
Assert.notNull(department.getId() ) ;
Role role = new Role() ;
role.setName("admin");
roleRespository.save(role);
Assert.notNull(role.getId() ) ;
User user = new User() ;
user.setName("user");
user.setCreatedate(new Date());
user.setDepartment(department);
List<Role> roles = roleRespository.finadAll();
Assert.notNull(roles) ;
user.setRoles(roles);
userRespository.save(user);
Assert.notNull(user.getId() ) ;
}
@Test
public void findPage(){
Pageable pageable = new PageRequest(0,10,new Sort(Sort.Direction.ASC,"id"));
Page<User> page = userRepository.findAll(pageable);
Assert.notNull(page);
for(User user : page.getContent() ){
logger.info("====user==== user name:{},department name:{},role name:{}",
user.getName(),user.getDepartment(),user.getRoles().get(0).getName() ) ;
}
}
}
运行Junit即可,如果显示绿色,则说明测试通过。在数据库中也可查到表结构和数据。
2、redis
关系型数据库无法满足业务需要时就可以考虑具有高效存取性能的缓存数据库来实现。
a、pom.xml中依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
b、创建Redis服务
Redis数据类型string,hash,list,set/zset。Redis在springBoot没有提供像。JPA那样的接口。
具体代码参考如下git链接.
https://github.com/chenfromsz/
mongoDB和Neo4j的使用类似.
三、提供数据库的访问性能
3.1使用Druid
Druid是一个关系型的数据库连接池,是阿里巴巴的开源项目,几乎支持多个数据库。其在监控、可扩展、稳定性等方面具有明显的优势。
3.1.1配置依赖
可以从 https://mvnrepository.com/ 查找Druid的依赖配置。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
3.1.2配置
配置数据库的连接数,数据库驱动等信息。
3.1.3开启Druid监控功能
使用监控服务器设定了监控后的连接地址为:“/druid/*”,设定访问数据库的白名单和黑名单,即通过IP来控制访问员。代码如下:
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean statViewServle(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//白名单:
servletRegistrationBean.addInitParameter("allow","192.168.1.218,127.0.0.1");
//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的即提示:Sorry, you are not permitted to view this page.
servletRegistrationBean.addInitParameter("deny","192.168.1.100");
//登录查看信息的账号密码.
servletRegistrationBean.addInitParameter("loginUsername","druid");
servletRegistrationBean.addInitParameter("loginPassword","12345678");
//是否能够重置数据.
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加过滤规则.
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
程序运行后,登录浏览器:http://localhost/druid/index.html 来打开控制台,输入设定的用户名和密码。实时查看连接池问题,每个被执行的sql语句等信息。
3.1.4使用Redis做缓存
Redis来通过注解实现缓存,代码如下:
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtyoes") RedisTemplate redisTemplate){
RedisCacheManager manager = new RedisCacheManager((redisTemplate));
manager.setDefaultExpiration(43200); //12hours
return manager;
}
}
参考:摘抄至陈韶健的《深入实践Spring Boot》