一.简要介绍:Spring Boot的定义和作用,激发读者的兴趣,并提出本文将讨论的主要内容。
Spring Boot的主要作用可以总结如下:
1.简化配置:
Spring Boot通过自动配置的方式减少了传统Spring应用的大量配置工作。它根据应用程序的类路径自动配置Spring和第三方库,使开发人员能够快速启动和运行应用程序。
2.快速开发:
Spring Boot提供了起步依赖(Starter Dependencies)的概念,它是一组预配置的依赖关系,能够满足特定功能或开发场景的需求。开发人员只需添加相应的起步依赖,即可快速集成各种功能和技术栈,如Web开发、数据库访问、安全性等。
3.内嵌服务器:
Spring Boot内置了常用的Servlet容器,如Tomcat、Jetty等,可以将应用程序打包为可执行的JAR文件,直接运行而无需外部服务器的支持。这极大地简化了部署和交付过程。
4.微服务支持:
spring Boot提供了丰富的功能和工具,支持构建微服务架构。它与Spring Cloud等相关项目集成,提供了服务注册与发现、负载均衡、断路器等功能,使开发人员能够轻松构建和管理分布式系统。
5.自动化运维:
Spring Boot具备丰富的健康监测和度量指标,支持应用程序的自动化运维。开发人员可以通过集成监控和管理工具,实时查看应用程序的状态、性能和日志,从而更好地进行故障排除和性能优化。
总之,Spring Boot的目标是通过简化配置和快速开发的方式,提升开发效率,加快应用程序的开发和交付速度,并为构建现代化的Java应用程序提供一个强大的基础框架。
二.Spring Boot配置注解:
1.@SpringBootApplication:
这是一个组合注解,用于标注主应用程序类。它包含了以下三个注解的功能:@Configuration、@EnableAutoConfiguration和@ComponentScan。通过使用@SpringBootApplication注解,可以自动装配Spring Boot的默认配置,并扫描并加载应用程序中的Bean。
2.@Configuration:
标注一个类为配置类,相当于传统Spring中的XML配置文件。在配置类中,可以使用@Bean注解来定义Bean。
3.@EnableAutoConfiguration:
开启自动配置功能,Spring Boot会根据依赖的jar包自动配置项目的运行环境。它会根据classpath中的jar包,自动配置项目所需的Bean。
4.@ComponentScan:
指定Spring要扫描的包路径,用于自动扫描和加载组件、服务和配置类。
5.@ConfigurationProperties:
用于将配置文件中的属性值绑定到Java对象的属性上。可以通过@ConfigurationProperties注解来指定配置的前缀和属性。
6.@Value:
用于将配置文件中的属性值注入到Spring的Bean中。可以将@Value注解直接标注在Bean的属性上,Spring会自动将对应的属性值注入。
7.@ConditionalOnProperty:
根据配置文件中的属性值来决定是否创建Bean。可以通过@ConditionalOnProperty注解来指定配置的属性名称和值。
8.@Profile:
用于指定在特定环境下激活的配置。可以通过@Profile注解来指定不同的配置文件或Bean。
这些注解只是Spring Boot中配置的一部分,还有其他更多的注解可以用于配置不同的功能和场景。使用这些注解可以方便地进行配置,简化了开发过程,提高了开发效率。
三.Spring Boot的数据访问:
1.JPA(Java Persistence API):
JPA是Java EE的一部分,它提供了一种标准的方式来对数据库进行访问。Spring Boot通过集成Spring Data JPA,简化了JPA的使用。你可以使用注解来定义实体类,使用接口继承JpaRepository或其他Spring Data JPA提供的接口来操作数据库。
2.Spring Data JDBC:
Spring Data JDBC是一个基于JDBC的轻量级数据库访问框架,它提供了一种更加简单的方式来进行数据库操作。你可以定义实体类,并使用注解来映射数据库表和字段。
3.MyBatis:
MyBatis是一个优秀的持久层框架,它通过XML或注解的方式来进行数据库操作。Spring Boot集成了MyBatis,你可以使用注解或XML配置文件来定义SQL语句和映射关系。
4.Spring Data Redis:如果你需要使用Redis作为缓存或持久化存储,Spring Boot提供了对Redis的支持。你可以通过Spring Data Redis来访问Redis数据库。
5.Spring Data MongoDB:
如果你需要使用MongoDB作为数据库,Spring Boot提供了对MongoDB的支持。你可以通过Spring Data MongoDB来进行数据访问。
这些只是Spring Boot提供的一些数据访问方式的例子,你可以根据自己的需求选择适合的方式来进行数据访问。在你的应用程序中,你可以通过依赖注入和自动配置来轻松地集成这些数据访问方式。
四.Spring Boot的视图技术:
1.Thymeleaf:
Thymeleaf是一种现代化的Java模板引擎,它允许你在HTML模板中使用自然的模板语言进行动态内容的渲染。Thymeleaf在Spring Boot中被广泛使用,它能够与Spring MVC无缝集成,提供了丰富的标签和表达式,使得开发者可以更加方便地处理视图层。
![在这里插入图片描述](https://img-blog.csdnimg.cn/ad55bbb680e14c709769a2e8f3482d42.png
2.FreeMarker:
FreeMarker是另一种流行的模板引擎,它使用类似于JSP的标签语法。Spring Boot集成了FreeMarker,你可以使用FreeMarker来渲染你的视图。
3.JSP(JavaServer Pages):
JSP是Java EE的一部分,它允许你在HTML页面中嵌入Java代码。虽然JSP在Spring Boot中仍然可用,但Thymeleaf和FreeMarker更受欢迎,因为它们更加现代化和灵活。
4.Velocity:
Velocity是一种快速、简单且功能强大的Java模板引擎。Spring Boot集成了Velocity,你可以使用Velocity来渲染你的视图。
5.Mustache:
Mustache是一种逻辑-less的模板语言,它使用起来非常简单。Spring Boot集成了Mustache,你可以使用Mustache来渲染你的视图。
以上是Spring Boot中常用的视图技术。你可以根据自己的喜好和项目需求选择适合的视图技术来进行开发。无论你选择哪种视图技术,Spring Boot都能够提供简单而强大的集成和配置方式,使得视图层开发更加便捷。
五.Spring Boot的Web应用开发
Spring Boot是一个用于简化Spring应用程序的开发的框架。它提供了快速构建能够自包含运行的独立的Spring应用程序的能力。对于Web开发,Spring Boot提供了许多功能和特性,使得开发过程更加简单和高效。
首先,Spring Boot提供了内嵌的Web服务器,如Tomcat、Jetty和Undertow,使得开发人员无需额外配置和部署外部服务器就可以运行和测试应用程序。
其次,Spring Boot集成了Spring MVC,这是一个用于构建Web应用程序的模块。它提供了基于注解的请求映射、数据绑定、数据验证和视图解析等功能,使得开发RESTful API和Web页面变得更加简单和便捷。
另外,Spring Boot还提供了许多辅助工具和自动配置功能,如静态资源处理、国际化支持、安全性配置等。这些功能可以帮助开发人员减少重复的配置工作,提高开发效率。
总之,使用Spring Boot进行Web开发可以大大简化开发过程,提高开发效率,并且可以集成各种常用的开发工具和框架,使得开发更加灵活和便捷。
六.Spring Boot的缓存管理
1.添加依赖:
在项目的pom.xml文件中添加相应的缓存依赖。例如,如果要使用Ehcache作为缓存技术,可以添加以下依赖:
org.springframework.boot
spring-boot-starter-cache
net.sf.ehcache
ehcache
2.配置缓存:
在application.properties或application.yml文件中配置缓存相关的属性。例如,如果要使用Ehcache,可以添加以下配置:
spring.cache.type=ehcache
3.添加缓存注解:
在需要缓存的方法上添加相应的缓存注解。Spring提供了几个常用的缓存注解,如@Cacheable、@CachePut、@CacheEvict等。这些注解可以用于指定缓存的名称、缓存的键、缓存的条件等。例如,使用@Cacheable注解可以将方法的返回值缓存起来,下次调用相同参数的方法时,可以直接从缓存中获取结果。
4.配置缓存管理器:
如果使用的是除了默认缓存管理器外的其他缓存技术,还需要配置相应的缓存管理器。可以通过实现CacheManager接口来自定义缓存管理器。
以上是使用缓存管理的基本步骤,在实际开发中可以根据具体需求进行灵活配置和使用。使用缓存管理可以提高应用程序的性能和响应速度,减少对数据库等资源的频繁访问,从而提升用户体验。
七、项目分析
1 .后端部分
(1)系统整体架构
(2)pom.xml文件
pom.xml文件信息详见系统具体源码
( 3)application.yml配置(注意缩进格式)
server:
port: 8888
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/hospital
username: root
password: root123
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
type-aliases-package: com.wxy.hospital.entity
mapper-locations: classpath:mapper/*.xml
logging:
level:
com.wxy.hospital.mapper: debug
(4)轮播图管理
package com.wxy.hospital.controller;
import com.wxy.hospital.aop.ApiPermission;
import com.wxy.hospital.entity.Banner;
import com.wxy.hospital.publicService.PIBannerService;
import com.wxy.hospital.service.IBannerService;
import com.wxy.hospital.util.Result;
import com.wxy.hospital.util.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
/**
-
-
前端控制器
-
@author 作者
-
@since 2023-06-10
*/
@RestController
@RequestMapping(“/banner”)
public class BannerController {
@Autowired
private IBannerService iBannerService;@GetMapping(“/admin/index”)
@ApiPermission
public Object show(int current, int size) {
return new Result().getResult(iBannerService.showBanner(current, size));
}@PostMapping(“admin/add”)
@ApiPermission
public Object add(@RequestParam(“file”) MultipartFile file) {
System.out.println(file.getName());
if (file.isEmpty()) {
return new Result().getError(200, “上传失败”);
}
String fileName = System.currentTimeMillis() + file.getOriginalFilename();
File file1 = new File(utils.dir);
if(!file1.exists()) {
file1.mkdirs();
}
File file2 = new File(utils.dir + System.getProperty(“file.separator”) + fileName);
try {
file.transferTo(file2);
Banner banner = new Banner();
banner.setImg(utils.img + fileName);
banner.setCreateTime(LocalDateTime.now());
Object o = iBannerService.addBanner(banner);
return new Result().getResult(o);
} catch (IOException e) {
throw new RuntimeException(e);
}
}@DeleteMapping(“admin/{id}”)
@ApiPermission
public Object del(@PathVariable int id) {
return new Result().getResult(iBannerService.del(id));
}@GetMapping(“index”)
public Object index() {
return new Result().getResult(iBannerService.list());
}
}- IBannerService BannerServiceImpl 服务以及其实现类
package com.wxy.hospital.service.impl;
- IBannerService BannerServiceImpl 服务以及其实现类
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wxy.hospital.entity.Banner;
import com.wxy.hospital.mapper.BannerMapper;
import com.wxy.hospital.service.IBannerService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
-
-
服务实现类
-
@author 作者
-
@since 2023-06-10
*/
@Service
public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> implements IBannerService {
@Autowired
private BannerMapper bannerMapper;
@Override
public Object showBanner(int current, int size) {
Page bannerPage = new Page<>(current, size);
Page bannerPage1 = bannerMapper.selectPage(bannerPage, null);
JSONObject jsonObject = new JSONObject();
jsonObject.put(“list”, bannerPage1);
return jsonObject;
}@Override
public Object addBanner(Banner banner) {
int insert = bannerMapper.insert(banner);
JSONObject jsonObject = new JSONObject();
jsonObject.put(“flag”, insert);
return jsonObject;
}@Override
public int del(int id) {
return bannerMapper.deleteById(id);
}
}- BannerMapper mapper文件继承BaseMapper,基础操作不用重写实现方法。
package com.wxy.hospital.mapper;
- BannerMapper mapper文件继承BaseMapper,基础操作不用重写实现方法。
import com.wxy.hospital.entity.Banner;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
-
- Mapper 接口
- @author 作者
- @since 2023-06-10
*/
public interface BannerMapper extends BaseMapper {
}
- BannerMapper.xml 基础操作xml不用写sql实现方法。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
-
-
@author 作者
-
@since 2023-06-10
*/
@ApiModel(value = “Banner对象”, description = “”)
public class Banner implements Serializable {private static final long serialVersionUID = 1L;
@TableId(value = “id”, type = IdType.AUTO)
private Integer id;private String img;
private LocalDateTime createTime;
private LocalDateTime updateTime;
public Integer getId() {
return id;
}public void setId(Integer id) {
this.id = id;
}
public String getImg() {
return img;
}public void setImg(String img) {
this.img = img;
}
public LocalDateTime getCreateTime() {
return createTime;
}public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}@Override
public String toString() {
return “Banner{” +
“id=” + id +
“, img=” + img +
“, createTime=” + createTime +
“, updateTime=” + updateTime +
“}”;
}
}