1. Spring 5.X应用零配置开发
Spring 框架从5.x版本推荐使用注解形式来对java应用程序进行开发与配置,并且可以完全替代原始的XML+注解形式的开发,在使用注解形式进行项目开发与环境配置时,Spring框架提供了针对环境配置与业务bean开发相关注解。
注解
声明Bean注解
@Component: 组件没有明确规定其角色,作用在类级别上声明当前类为一个业务组件,被Spring Ioc容器维护 。
@Service: 在业务逻辑层(Service 层)类级别进行声明 。
@Repository: 在数据访问层(dao 层) 类级别声明 。
@Controller: 在展现层(MVC) 使用,标注当前类为一个控制器。
注入Bean注解
@AutoWired: Spring官方提供注解 。
@Inject: JSR-330提供注解(标准制定方) 。
@Resource: JSR-250提供注解。
注意:在Set方法或属性上声明,一般情况下通用一般开发中更习惯声明在属性上。
Spring5.x中配置与获取Bean注解
@Configuration: 作用与类上,将当前类声明为一个配置类,相当于一个xml配置文件。
@ComponentScan: 自动扫描指定包下标注有。
@Repository,@Service,@Controller @Component: 注解的类并由Ioc容器进行实例化和维护 。
@Bean: 作用于方法上,相当于xml 文件中<bean> 声明当前方法返回值为一个bean 。
@Value: 获取properties文件指定key,value值。
-
IOC中Bean的实例化与获取
通过实例化AnnotationConfigApplicationContext类,接收配置参数类IocConfig,并获取UserService Bean实现方法调用。 1.在pom.xml中添加坐标相关配置 <dependencies> <!-- spring的依赖坐标 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.4.RELEASE</version> </dependency> </dependencies> <build> <plugins> <!-- 指定Maven编译的JDK版本和编码 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <!-- 源代码使用的JDK版本 --> <source>11</source> <!-- 需要生成的目标class文件的编译版本 --> <target>11</target> <!-- 字符集编码 --> <encoding>utf-8</encoding> </configuration> </plugin> </plugins> </build> 2.创建Bean对象 UserDao.java和UserService.java 3.创建IocConfig配置类 //将当前类声明为一个配置类 @Configuration //设置扫描包范围 @ComponentScan("com.yjxxt.springboot") public class IocConfig { } 4.创建启动类执行测试 public class Starter { public static void main(String[] args) { //基于Java的配置类加载Spring的应用上下文 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(IocConfig.class); //获取指定的Bean对象 UserService userService = ac.getBean(UserService.class); //调用Bean对象的方法 userService.test(); } }
-
@Bean注解使用
使用@Bean注解声明在方法(注意:方法名一般为bean对象名称)级别用于返回实例化的Bean对象。 1.创建Bean对象 AccountDao.java 2.修改IocConfig配置类 @Configuration @ComponentScan("com.yjxxt.springboot") public class IocConfig02 { //返回实例化的单例Bean对象 @Bean public AccountDao accountDao(){ return new AccountDao(); } } 3.创建启动类并执行测试 public class Starter02 { public static void main(String[] args) { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(IocConfig.class); //判断IocConfig对象是否是单例 System.out.println(ac.isSingleton("IocConfig")); //获取IocConfig对象 IocConfig iocConfig = ac.getBean(IocConfig.class); //获取AccountDao对象 AccountDao accountDao01 = iocConfig.accountDao(); AccountDao accountDao02 = iocConfig.accountDao(); System.out.println(accountDao01 + "," + accountDao02); accountDao01.test(); } }
-
读取外部配置文件
通过@PropertySource注解声明到类级别来指定读取相关配置。 1.准备配置文件 user.properties # user.properties user.userName=admin user.password=admin jdbc.properties # jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/hr? useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=root 2.@PropertySource加载配置文件 properties配置文件 @Configuration @ComponentScan("com.yjxxt") @PropertySource(value = {"classpath:jdbc.properties","classpath:user.properties"}) public class IocConfig03 { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; // 控制台打印属性值信息 public void showConfigInfo(){ System.out.println("driver:" + driver + ",url:" + url); System.out.println("userName:" + userName + ",password:" + password); } } 3.其他Bean对象获取properties文件内容 @Service public class UserService { @Resource private UserDao userDao; @Value("${user.userName}") private String userName; @Value("${user.password}") private String password; public void test(){ System.out.println("UserService.test..."); userDao.test(); System.out.println("userName:" + userName + ",password:" + password); } }
-
组合注解与元注解
Spring为了消除重复注解,在元注解上引入了组合注解,其实可以理解为对代码的重构,相当于注解的注解,拥有元注解的原始功能。 @Configuration注解就是组合注解,拥有@Component注解功能,即配置类本身也是一个被IOC维护的单例Bean。 1.自定义组合注解 组合注解MyCompScan定义 拥有元注解@Configuration + @ComponentScan(扫描器)两者功能 覆盖value属性 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Configuration @ComponentScan public @interface MyCompScan { //设置别名,当前属性为哪个注解服务 @AliasFor(annotation = ComponentScan.class , value = "value") String[] value() default {}; } 2.应用组合注解 @MyCompScan("com.yjxxt.springboot") @PropertySource(value = {"classpath:jdbc.properties","classpath:user.properties"}) public class IocConfig04 { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; public void showConfigInfo(){ System.out.println("driver:" + driver + ",url:" + url); System.out.println("userName:" + userName + ",password:" + password); } } 3.测试组合注解 public class Starter { public static void main(String[] args) { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(IocConfig04.class); UserService userService = ac.getBean(UserService.class); userService.test(); } }
2. Spring MVC零配置创建与部署
1.pom.xml添加坐标相关配置
<dependencies>
<!-- spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- web servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>springmvc</finalName>
<plugins>
<!-- 指定Maven编译的JDK版本和编码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
2.添加源代码
@Controller
public class HelloController {
@RequestMapping("/index")
public String index(){
return "index";
}
}
3.添加视图(WEB-INF/views目录下创建index.jsp)
<html>
<body>
<h2>Hello mvc!</h2>
</body>
</html>
4.SpringMVC配置类添加
@Configuration
//在@Configuration注解的配置类中添加,用于为该应用添加SpringMVC的功能
@EnableWebMvc
//扫描包范围
@ComponentScan("com.xxxx")
public class MvcConfig {
//配置JSP视图解析器
@Bean
//将方法返回的结果交给IOC容器维护
public InternalResourceViewResolver viewResolver(){
//获取视图解析器
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
//设置前缀
viewResolver.setPrefix("/WEB-INF/views/");
//设置后缀
viewResolver.setSuffix(".jsp");
//返回解析器对象 (交给IOC容器进行维护)
return viewResolver;
}
}
5.入口文件代码添加
//实现WebApplicationinitializer 接口的类都可以在web应用程序启动时被加载
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//基于Java的配置类加载Spring的应用上下文
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//注册 Mvc 配置信息
ctx.register(MvcConfig.class);
//设置 ServletContext 上下文信息
ctx.setServletContext(servletContext);
//配置转发器 Dispatcher
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher",new DispatcherServlet(ctx));
//设置映射路径
servlet.addMapping("/");
//启动时即实例化 Bean
servlet.setLoadOnStartup(1);
}
}
6.如果项目中存在静态资源文件,定义拦截器
//静态资源 handler不进行处理 直接响应到客户端
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//配置拦截器
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
//添加拦截器到mvc 环境
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor());
}
3. Spring Boot
Spring-Boot正是为了解决繁琐的代码配置而产生的。Spring Boot 是一个在 Spring的基础上搭建的全新的框架,它的设计目的是用来简化Spring应用的初始搭建以及开发过程。
优点:简单、快速、方便。
特点:
1.可以使用SpringBoot创建独 Spring应用程序。
2.嵌入式Tomcat、Jetty容器、无需部署WAR包。
3.提供starter简化Maven。
4.自动配置Spring和第三方库。
5.提供生产就绪特征。
6.无代码生成和XML配置。
步骤:
1.配置依赖。
2.配置web.xml,加载Spring和Spring MVC。
3.配置数据库连接。
4.配置Spring事务。
5.配置加载配置文件的读取,开启注解。
6.配置日志文件。
7.配置完成后部署Tomcat服务器。
-
快速入门
pom.xml添加依赖坐标 <!-- SpringBoot的父级依赖。只有设置了parent标签,项目才是SpringBoot项目 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> </parent> <dependencies> <!-- web启动器,加载web环境所需要的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- SpringBoot项目的打包插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 添加源代码 @Controller public class HelloController { @RequestMapping("hello") @ResponseBody public String hello(){ return "Hello SpringBoot"; } } 创建启动类 //SpringBoot 启动类 @SpringBootApplication public class Starter{ public static void main(String[] args) { SpringApplication.run(Starter.class, args); } } 注意:启动类在启动时会扫描注解(@Controller、@Service、@Repository、@Component),扫描位置为同包及其子包下的注解,所以启动类的位置应放置于根包目录下。 @SpringBootApplication组合注解 @SpringBootConfiguration: 包含@Configuration,用于定义一个配置类。 @EnableAutoConfiguration: SpringBoot会自动根据jar包的依赖来自动配置项目。 @ComponentScan: 告诉Spring哪个packages的注解标识的类会被Spring自动扫描并且装入bean容器。
-
核心配置
1.Banner图标自定义 Spring Boot项目启动时默认加载 src/main/resources目录下的 banner.txt图标文件,如果该目录文件未提供,则使用Spring Boot默认。 http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something 2.Banner图标关闭 @SpringBootApplication public class StarterApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(StarterApplication .class); //设置 banner 图标关闭 springApplication.setBannerMode(Banner.Mode.OFF); springApplication.run(); } } 3.配置文件 Spring Boot默认会读取全局配置文件,配置文件名固定为application.properties或application.yml, 放置在src/main/resource 资源目录下,使用配置文件来修改SpringBoot自动配置的默认值。 application.properties文件 ## 项目启动端口号配置 server.port=8989 ## 项目访问上下文路径 server.servlet.context-path=/mvc ## 数据源配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/hr? useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root application.yml文件 ## 端口号 上下文路径 server: port: 8989 servlet: context-path: /mvc ## 数据源配置 spring: datasource: type: com.mchange.v2.c3p0.ComboPooledDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/hr username: root password: root 4.Starter坐标 Web starter 使用Spring MVC来构建RESTful Web应用,并使用Tomcat作为默认内嵌容器 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> Freemarker Starter & Thymeleaf starter 集成视图技术,引入Freemarker Starter , Thymeleaf Starter <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> JavaMail邮件发送Starter <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 引入AOP环境 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 5.自动化配置 SpringBoot Starter坐标版本查看 以环境搭建spring-boot-starter-web坐标来简单分析SpringBoot自动化配置过程。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <!--父类项目统一对项目依赖版本统一控制! --> <version>2.2.2.RELEASE</version> </parent> Spring Boot自动化配置 Spring Boot的项目一般都会有*Application的入口类,入口类中提供main方法,这是一个标准的Java应用程序的入口方法。 Spring Boot通过maven中的starter导入了所需场景下的jar包,并通过主启动类上的@SpringBootApplication中的@EnableAutoConfiguration读取了 类路径下的META- INF/spring.factories下EnableAutoConfiguration的配置类,这些配置类使用@ConditionalOnClass来标注,根据@ConditionalOnClass标注的约束条件来引入自动化的环境配置。`
-
Profile配置
Profile是Spring用来针对不同环境对不同配置提供支持的全局Profile配置使用application- {profile}.yml。 application-dev.yml开发环境配置文件 server: port: 8989 application-test.yml测试环境配置文件 server: port: 9999 application-prod.yml生产环境配置文件 server: port: 8686 application.yml 主配置文件 ## 环境选择配置 spring: profiles: active: dev
-
日志配置
日志的输出对于系统bug定位无疑是一种比较有效的方式,也是项目后续进入生产环境后快速发现错误解决错误的一种有效手段。Spring Boot 默认使用LogBack日志系统,如果不需要更改为其他日志系统如Log4j2等,则无需多余的配置,LogBack默认将日志打印到控制台上。 如果要使用LogBack,原则上是需要添加dependency依赖的。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> spring-boot-starter或者spring-boot-starter-web ,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging的依赖。 1.项目中日志信息输出 Starter启动类中添加Log日志类,控制台打印日志信息。 @SpringBootApplication public class Starter { private static Logger logger = LoggerFactory.getLogger(Starter.class); public static void main(String[] args) { logger.info("SpringBoot 应用开始启动..."); SpringApplication.run(Starter.class); } } 2.日志输出格式配置 application.yml文件 logging: pattern: console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger- %msg%n" level: debug file: path: "." name: "springboot.log"
-
Freemarker视图集成
SpringBoot内部支持Freemarker视图技术的集成,并提供了自动化配置类FreeMarkerAutoConfiguration。 1.Starter坐标引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 2.添加Freemarker配置信息 Freemarker默认默认视图路径resources/templates目录(由自动化配置类FreemarkerProperties决定),该目录可以进行在application.yml中进行修改。 spring: freemarker: suffix: .ftl content-type: text/html #响应格式 charset: UTF-8 template-loader-path: classpath:/views/ 3.编写IndexController控制器转发视图 @Controller public class IndexController { @RequestMapping("index") public String index(){ return "index"; } } 4.views目录下添加index.ftl视图
-
Thymeleaf视图集成
SpringBoot支持多种视图技术集成,并且SpringBoot官网推荐使用Thymeleaf作为前端视图页面。 1.starter坐标引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 2.添加Thymeleaf配置信息 Thymeleaf默认默认视图路径resources/templates目录(由自动化配置类ThymeleafProperties 类决定),该目录可以进行在application.yml中进行修改。 ## 环境选择配置 spring: thymeleaf: prefix: classpath:/html/ ## 关闭 thymeleaf 页面缓存 cache: false 3.编写IndexController控制器转发视图 @Controller public class IndexController { @RequestMapping("index") public String index(Model model){ //设置请求域的值 model.addAttribute("msg","Hello SpringBoot"); return "index"; } } 4.html目录下添加index.html视图 修改Thymeleaf模板默认存放路径 (在resources目录下创建html文件夹)
-
SpringBoot静态资源访问
可以在resources资源目录下存放web应用静态资源文件。 默认静态资源路径 在resources目录下创建static或者public目录,存放images、js、css等静态资源文件。 自定义静态资源路径 在spring.resources.static-locations后面追加一个配置classpath:/os/ spring: # 修改默认的静态寻址资源目录 多个路径之间用逗号隔开 resources: static-locations: classpath:/public/,classpath:/static/,classpath:/os/
-
SpringBoot应用打包与部署
1.Jar包部署 1.配置打包命令 idea下配置clean compile package -Dmaven.test.skip=true执行打包命令,target目录得到待部署的项目文件。 2.部署并访问 打开本地dos窗口,执行java -jar命令部署已打好的jar包文件。命令如下: java -jar jar包所在目录 2.war包部署 1.pom.xml修改 应用类型修改 由于入门项目构建的项目默认为jar应用,所以这里打war需要作如下修改 <groupId>com.xxxx</groupId> <artifactId>SpringBoot01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> 内嵌tomcat忽略 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- SpringBoot项目的打包插件 --> <build> <!--配置生成的war文件名--> <finalName>springboot</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 2.Starter修改 @SpringBootApplication public class Starter extends SpringBootServletInitializer { private static Logger logger = LoggerFactory.getLogger(Starter.class); public static void main(String[] args) { logger.info("SpringBoot 应用开始启动..."); SpringApplication.run(Starter.class); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Starter.class); } } 3.打包操作 执行命令,生成对应的war包. 4.部署并访问 将生成的war包放到tomcat的webapps内,再通过外部tomcat部署并访问。
-
SpringBoot整合Mybatis
1.环境整合配置 pom.xml添加核心依赖 application.yml整合配置 2.源代码添加 po包下创建JavaBean对象的属性和get set方法 dao包下创建接口定义方法 resources/mappers下创建SQL映射文件使用sql语句 service包下使用@Service编写方法提供的功能 controller包下使用@Controller调用service层下的方法 使用@SpringBootApplication @MapperScan("dao包路径")启动入口
-
SpringBoot数据访问操作
1.查询操作 UserDao接口添加查询的方法 SQL映射文件配置sql的select查询语句 UserService使用查询方法 UserController使用@GetMapping连接使用路径 2.添加操作 UserDao接口添加添加的方法 SQL映射文件配置sql的insert添加语句 添加commons-lang3依赖,用来使用StringUtils工具类 AssertUtil工具类用来判断结果是否为true 如果结果为true,抛出异常 ParamsException自定义异常 设置成功或失败的代码和消息 UserService使用添加方法(使用AssertUtil工具类判断条件) 1.参数校验,是否非空 2.判断数据库中是否有同名的数据 3.添加用户操作方法 4.判断是否添加成功 ResultInfo定义成功的代码、消息、结果属性 UserController使用@PutMapping连接使用路径 3.修改操作 UserDao接口添加修改的方法 SQL映射文件配置sql的update修改语句 UserService使用修改方法 1.user参数非空判断 2.通过name查询数据库,判断是否有同名的账户存在 未查到,直接修改 查到了,必须是自己的信息才能修改,如果查到别人的那就不能修改 3.执行修改操作,判断是否修改成功 UserController使用@PostMapping连接使用路径 4.删除操作 UserDao接口添加删除的方法 SQL映射文件配置sql的delete删除语句 UserService使用删除方法 1.校验参数id是否存在 2.校验删除的数据是否存在 UserController使用@DeleteMapping连接使用路径 5.分页条件查询操作 UserQuery定义当前页、每页显示的数量、查询条件属性 UserDao接口添加分页查询的方法(使用List<>泛型) SQL映射文件配置sql的select查询语句 UserService通过指定参数使用分页查询方法 UserController使用@GetMapping连接使用路径
-
SpringBoot应用热部署
热部署,就是在应用正在运行的时候升级软件(增加业务/修改bug),却不需要重新启动应用。 在原理上是使用了两个ClassLoader,一个ClassLoader加载那些不会改变的类(第三方 Jar 包),另一个ClassLoader加载会更改的类,称为restart ClassLoader, 这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。 热部署环境配置与测试: 1.配置DevTools环境 修改Pom文件,添加DevTools依赖,同时在plugin中添加devtools生效标志 注意:devtools以实现页面热部署(即页面修改后会立即生效,这个可以直接在 application.properties文件中配置spring.thymeleaf.cache=false来实现), 实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。因为其采用的虚拟机机制,该项重启是很快的。 2.全局配置文件配置 在application.yml中配置spring.devtools.restart.enabled=false,此时restart类加载器还会初始化,但不会监视文件更新。
-
SpringBoot单元测试
通过它能够快速检测业务代码功能的正确与否。 1.pom.xml测试依赖添加 2.Service业务方法测试 3.控制层接口方法测试
-
全局异常与事务控制
1.事务支持 在使用Jdbc作为数据库访问技术时,Spring Boot框架定义了基于jdbc的PlatformTransactionManager接口的实现DataSourceTransactionManager,并在Spring Boot应用启动时自动进行配置。 声明式事务配置 @Transactional(propagation = Propagation.REQUIRED) 2.全局异常处理 SpringMvc中对异常统一处理提供了相应处理方式,推荐使用的是实现接口HandlerExceptionResolver的方式,对代码侵入性较小。 @ControllerAdvice 该注解组合了@Component注解功能,最常用的就是作为全局异常处理的切面类,同时通过该注解可以指定包扫描的范围。 @ControllerAdvice约定了几种可行的返回值,如果是直接返回model类的话,需要使用@ResponseBody进行json转换。 @ExceptionHandler 在处理异常时标注在方法级别,代表当前方法处理的异常类型有哪些具体应用以Restful接口为例,测试保存用户接口。 全局异常应用 1.异常抛出与全局异常捕获 异常抛出:UserService查询业务方法,抛出ParamExceptions异常。 全局异常捕获:全局异常处理类GlobalExceptionHandler定义。 @ControllerAdvice定义在类级别上 2.特定异常处理 通过@ExceptionHandler(value = Exception.class)标注方法处理特定异常
-
SpringBoot数据校验 - Validation
Spring Boot中对请求数据进行校验,相关概念如下: JSR303:JSR303是一项标准,只提供规范不提供实现,规定一些校验规范即校验注解, 如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下。JSR-349是其升级版本,添加了一些新特性。 Hibernate Validation:Hibernate Validation是对这个规范的实现,并增加了一些其他校验注解, 如@Email,@Length,@Range 等等。 Spring Validation:Spring Validation对Hibernate Validation进行了二次封装,在Spring MVC模块中添加了自动校验,并将校验信息封装进了特定的类中。 环境配置 以程序中引入spring-boot-starter-web会一并依赖spring-boot-starter-validation(使用的依赖)到项目中。 校验相关注解 @AssertFalse 可以为null,如果不为null的话必须为false @AssertTrue 可以为null,如果不为null的话必须为true @DecimalMax 设置不能超过最大值 @DecimalMin 设置不能超过最小值 @Digits 设置必须是数字且数字整数的位数和小数的位数必须在指定范围内 @Future 日期必须在当前日期的未来 @Past 日期必须在当前日期的过去 @Max 最大不得超过此最大值 @Min 最大不得小于此最小值 @NotNull 不能为null,可以是空 @Min 最大不得小于此最小值 @Pattern 必须满足指定的正则表达式 @Size 集合、数组、map等的size()值必须在指定范围内 @Email 必须是email格式 @Length 长度必须在指定范围内 @NotBlank 字符串不能为null,字符串trim()后也不能等于“” @NotEmpty 不能为null,集合、数组、map等size()不能为0;字符串 trim()后可以等于“” @Range 值必须在指定范围内 @URL 必须是一个URL