初学Spring Boot 必须要知道的事

简介: Spring Boot简介Spring Boot 核心功能Spring Boot的优缺点SpringBoot 常用注解和原理

Spring Boot简介


Spring Boot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。


Spring Boot 核心功能


1.独立运行的 Spring 项目

Spring Boot 可以以 jar 包的形式独立运行,运行一个 Spring Boot 项目只需通过 java–jar xx.jar 来运行。

2.内嵌 Servlet 容器

Spring Boot 可选择内嵌 Tomcat、Jetty 或者 Undertow,这样我们无须以 war 包形式部署项目。

3.提供 starter 简化 Maven 配置

Spring 提供了一系列的 starter pom 来简化 Maven 的依赖加载,例如,当你使用了spring-boot-starter-web 时,会自动加入如图 1 所示的依赖包。

4.自动配置 Spring

Spring Boot 会根据在类路径中的 jar 包、类,为 jar 包里的类自动配置 Bean,这样会极大地减少我们要使用的配置。当然,Spring Boot 只是考虑了大多数的开发场景,并不是所有的场景,若在实际开发中我们需要自动配置 Bean,而 Spring Boot 没有提供支持,则可以自定义自动配置。

5.准生产的应用监控

Spring Boot 提供基于 http、ssh、telnet 对运行时的项目进行监控。

6.无代码生成和 xml 配置

Spring Boot 的神奇的不是借助于代码生成来实现的,而是通过条件注解来实现的,这是 Spring 4.x 提供的新特性。Spring 4.x 提倡使用 Java 配置和注解配置组合,而 Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。


Spring Boot的优缺点


1.优点

快速构建项目。

对主流开发框架的无配置集成。

项目可独立运行,无须外部依赖Servlet容器。

提供运行时的应用监控。

极大地提高了开发、部署效率。

与云计算的天然集成。

2.缺点

版本迭代速度很快,一些模块改动很大。

由于不用自己做配置,报错时很难定位。

网上现成的解决方案比较少。


SpringBoot 常用注解和原理


以下注解来源于网上,仅汇总后供本人初学时查阅


一、启动注解 @SpringBootApplication

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    // ... 此处省略源码
}


查看源码可发现,@SpringBootApplication是一个复合注解,包含了@S

pringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解


@SpringBootConfiguration 注解,继承@Configuration注解,主要用于加载配置文件


@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

@EnableAutoConfiguration 注解,开启自动配置功能

@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成

@ComponentScan 注解,主要用于组件扫描和自动装配

@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。


二、Controller 相关注解


@Controller

控制器,处理http请求。

@RestController 复合注解

查看@RestController源码


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     * @since 4.0.1
     */
    @AliasFor(annotation = Controller.class)
    String value() default "";
}


从源码我们知道,@RestController注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式.


@RequestBody


通过HttpMessageConverter读取Request Body并反序列化为Object(泛指)对象


@RequestMapping


@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上


@GetMapping用于将HTTP get请求映射到特定处理程序的方法注解

注解简写:@RequestMapping(value = “/say”,method = RequestMethod.GET)等价于:@GetMapping(value = “/say”)


GetMapping源码


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {
//...
}


是@RequestMapping(method = RequestMethod.GET)的缩写

@PostMapping用于将HTTP post请求映射到特定处理程序的方法注解


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.POST)
public @interface PostMapping {
    //...
}


是@RequestMapping(method = RequestMethod.POST)的缩写


三、取请求参数值

@PathVariable:获取url中的数据


@Controller
@RequestMapping("/User")
public class HelloWorldController {
    @RequestMapping("/getUser/{uid}")
    public String getUser(@PathVariable("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}


@RequestParam:获取请求参数的值


@Controller
@RequestMapping("/User")
public class HelloWorldController {
    @RequestMapping("/getUser")
    public String getUser(@RequestParam("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}


@RequestHeader 把Request请求header部分的值绑定到方法的参数上

@CookieValue 把Request header中关于cookie的值绑定到方法的参数上


四、注入bean相关


@Repository

DAO层注解,DAO层中接口继承JpaRepository,需要在build.gradle中引入相关jpa的一个jar自动加载。

Repository注解源码


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";
}


@Service


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";
}


@Service是@Component注解的一个特例,作用在类上

@Service注解作用域默认为单例

使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean

@Service用于标注服务层组件,表示定义一个bean

@Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写

@Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字


@Scope作用域注解


@Scope作用在类上和方法上,用来配置 spring bean 的作用域,它标识 bean 的作用域


@Scope源码


@


Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
    /**
     * Alias for {@link #scopeName}.
     * @see #scopeName
     */
    @AliasFor("scopeName")
    String value() default "";
    @AliasFor("value")
    String scopeName() default "";
    ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}


属性介绍

value


singleton   表示该bean是单例的。(默认)
prototype   表示该bean是多例的,即每次使用该bean时都会新建一个对象。
request     在一次http请求中,一个bean对应一个实例。
session     在一个httpSession中,一个bean对应一个实例。

proxyMode


DEFAULT         不使用代理。(默认)
NO              不使用代理,等价于DEFAULT。
INTERFACES      使用基于接口的代理(jdk dynamic proxy)。
TARGET_CLASS    使用基于类的代理(cglib)。


@Entity实体类注解

@Table(name =“数据库表名”),这个注解也注释在实体类上,对应数据库中相应的表。

@Id、@Column注解用于标注实体类中的字段,pk字段标注为@Id,其余@Column。


@Bean产生一个bean的方法

@Bean明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。支持别名@Bean(“xx-name”)


@Autowired 自动导入


@Autowired注解作用在构造函数、方法、方法参数、类字段以及注解上

@Autowired注解可以实现Bean的自动注入


@Component

把普通pojo实例化到spring容器中,相当于配置文件中的


虽然有了@Autowired,但是我们还是要写一堆bean的配置文件,相当麻烦,而@Component就是告诉spring,我是pojo类,把我注册到容器中吧,spring会自动提取相关信息。那么我们就不用写麻烦的xml配置文件了


五、导入配置文件

@PropertySource注解

引入单个properties文件:


@PropertySource(value = {"classpath : xxxx/xxx.properties"})


引入多个properties文件:


@PropertySource(value = {"classpath : xxxx/xxx.properties","classpath : xxxx.properties"})


@ImportResource导入xml配置文件

可以额外分为两种模式 相对路径classpath,绝对路径(真实路径)file


注意:单文件可以不写value或locations,value和locations都可用


相对路径(classpath)


引入单个xml配置文件:


@ImportSource("classpath : xxx/xxxx.xml")

@ImportResource导入xml配置文件

可以额外分为两种模式 相对路径classpath,绝对路径(真实路径)file


注意:单文件可以不写value或locations,value和locations都可用


相对路径(classpath)


引入单个xml配置文件:


@ImportSource("classpath : xxx/xxxx.xml")

引入多个xml配置文件:

@ImportSource(locations={"classpath : xxxx.xml" , "classpath : yyyy.xml"})


绝对路径(file)


引入单个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/dubbo.xml”})

引入多个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/application.xml” , “file : d:/hellxz/dubbo.xml”})

取值:使用@Value注解取配置文件中的值


@Value("${properties中的键}")
private String xxx;


@Import 导入额外的配置信息

功能类似XML配置的,用来导入配置类,可以导入带有@Configuration注解的配置类或实现了ImportSelector/ImportBeanDefinitionRegistrar。

使用示例


@SpringBootApplication
@Import({SmsConfig.class})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}


六、事务注解 @Transactional

在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式


编程式事务管理:

编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

声明式事务管理:

建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用


七、全局异常处理

@ControllerAdvice 统一处理异常

@ControllerAdvice 注解定义全局异常处理类


@ControllerAdvice
public class GlobalExceptionHandler {
}


@ExceptionHandler 注解声明异常处理方法


@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    String handleException(){
        return "Exception Deal!";
    }
}


相关文章
|
6天前
|
存储 安全 Java
精通 Spring Boot 系列 14
精通 Spring Boot 系列 14
14 0
|
6天前
|
Java Spring
精通 Spring Boot 系列 11
精通 Spring Boot 系列 11
30 0
|
6天前
|
前端开发 Java 文件存储
精通 Spring Boot 系列 06
精通 Spring Boot 系列 06
34 0
|
6天前
|
JSON Java fastjson
精通 Spring Boot 系列 05
精通 Spring Boot 系列 05
22 0
|
7月前
|
Cloud Native Java Go
《Spring Boot前世今生》
《Spring Boot前世今生》
29 0
|
10月前
|
Java Spring
Spring Boot 3.0
Spring Boot 3.0
582 0
|
11月前
|
存储 JSON 安全
Spring Boot 安全
1.概述 在后端来说,安全主要就是控制用户访问,让对应权限的用户能访问到对应的资源,主要是两点: 认证 授权 认证,确定是谁。 授权,核实权限。 每个安全框架其实都是为了实现这两点。 目前常用的实现方式有如下几种: token JWT oauth spring security 前三种是理念,最后一种是开箱即食的框架。 2.token 2.1.理论 token ,也叫“令牌”,是验证用户身份的凭证。token的组成具有随意性,能标识用户身份即可。
101 0
|
12月前
|
开发框架 Java 开发者
spring boot介绍
spring boot介绍
|
XML 前端开发 IDE
5 分钟快速理解 Spring Boot
前言 Spring 是 Java 开发人员接触最多的框架,包括我在内的很多小伙伴只是对 Spring 进行简单使用,为了深入了解 Spring,我在 2020 年 6 月底的时候开始了 Spring 探索之路,并开设了《重学 Spring》专栏,到目前为止已经更新了 51 篇,内容涵盖了 Spring IOC、Spring AOP、Spring MVC 等内容,详细的介绍了 Spring 的核心特性与底层原理,也希望在读的小伙伴能更上一层楼。
76 0
5 分钟快速理解 Spring Boot
|
Java Spring 容器
spring boot到底帮我们做了那些事?
要是想在spring boot初始化的时候搞点事情的化,那么有3种方法: 1.创建ApplicationContextInitializer的实现类 2.创建ApplicationListener的实现类 3.创建ApplicationRunner和CommandLineRunner的实现类
spring boot到底帮我们做了那些事?