ITPub博客

首页 > 应用开发 > Java > 好程序员分享SpringBoot须掌握的注解

好程序员分享SpringBoot须掌握的注解

原创 Java 作者:好程序员IT 时间:2019-06-05 15:11:05 0 删除 编辑

前言

Spring 经历了如下几个阶段 :

第一阶段: xml 配置

在 Spring 1.x 时代,使用 Spring 开发满眼都是 xml 配置的 Bean ,随着项目的扩大,我们需要把 xml 配置文件放到不同的配置文件里,那时需要频繁的在开发的类和配置文件之间进行切换

第二阶段:注解配置

在 Spring 2.x  时代,随着 JDK1.5 带来的注解支持, Spring 提供了声明 Bean 的注解(例如 @Component 、 @Service ),大大减少了配置量。主要使用的方式是应用的基本配置(如数据库配置)用 xml ,业务配置用注解

第三阶段: java 配置

Spring 3.0  引入了基于  Java  的配置能力,这是一种类型安全的可重构配置方式,可以代替  XML 。我们目前刚好处于这个时代, Spring4.x 和 Spring Boot 都推荐使用 Java 配置。

所有这些 xml 配置都代表了开发时的损耗。   因为在思考  Spring  特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间 。 Spring Boot  让这一切成为了过去。 Spring Boot  简化了基于 Spring 的应用开发,只需要 “run” 就能创建一个独立的、生产级别的 Spring 应用。 Spring Boot 为 Spring 平台及第三方库提供开箱即用的设置(提供默认设置),这样我们就可以简单的开始。多数 Spring Boot 应用只需要很少的 Spring 配置。我们可以使用 SpringBoot 创建 java 应用,并使用 java –jar  启动它,或者采用传统的 war 部署方式。这也是 SpringBoot 让 越来越多的开发人员使用的主要原因之一。下面我们就来详细讲解 Spring Boot 几个很重要的注解: @Configuration , @Bean , @SpringBootApplication , @ComponentScan

 

@  Configuration 和 @Bean 注解

Spring 的 Java 配置方式是通过 @Configuration 和 @Bean 这两个注解实现的,这两个注解是从 Spring3.0 之后就开始有了:

1 、 @Configuration 作用于类上,相当于一个 xml 配置文件;

2 、 @Bean 作用于方法上,相当于 xml 配置中的 <bean> ;

案例

@Configuration

public class DemoConfigure {

    @Bean

    public User userBean(){

        User user=new User();

        user.setAge(100);

        user.setName("jack");

        user.setPwd("123");

        return user;

    }

}

 

 

测试如下:

package com.example.springboot01;

import com.example.springboot01.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot01ApplicationTests {

  @Autowired
  private User user;
  @Test
  public void contextLoads() {
      System.out.println(user);
  }

}

 

 

打印:

User{name='jack', pwd='123', age=100}

@SpringBootApplication

@SpringBootApplication 注解源码如下:

 

    package org.springframework.boot.autoconfigure;

    @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 是一个复合注解,包括 @ComponentScan ,和 @SpringBootConfiguration , @EnableAutoConfiguration 。

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

- @EnableAutoConfiguration 的作用启动自动的配置, @EnableAutoConfiguration 注解的意思就是 Springboot 根据你添加的 jar 包来配置你项目的默认配置,比如根据 spring-boot-starter-web ,来判断你的项目是否需要添加了 webmvc 和 tomcat ,就会自动的帮你配置 web 项目中所需要的默认配置。

- @ComponentScan ,扫描当前包及其子包下被 @Component , @Controller , @Service , @Repository 注解标记的类并纳入到 spring 容器中进行管理。是以前的 <context:component-scan> (以前使用在 xml 中使用的标签,用来扫描包)。

  

@SpringBootApplication 指定扫描某些包

@SpringBootApplication 注解默认扫描的是当前类所在的包和子包。自己可以通过属性来设置扫描其他的包,设置了之后默认值就不在有用。

@SpringBootApplication(scanBasePackageClasses = {TestConfig.class,TestController.class})
通过设置 scanBasePackageClasses 属性来制定,只扫描哪些配置类( @Configuration 注解的类)。

或者如下设置:

@SpringBootApplication(scanBasePackageClasses = {Springboot01Application.class,TestConfig.class})
指定扫描这些类所在的包和子包。

设置不自动装配

springboot 的自动配置可以帮我们节省很多时间 , 但是有时候如果我们不想在引入依赖包的情况自动配置 , 则可以通过相关设置取消

在 @SpringBootApplication ( exclude   =  { JpaRepositoriesAutoConfiguration . class , RedisAutoConfiguration . class }) 注解内部将不需要自动配置的依赖通过 exclude 参数指定即可 , 可以指定多个类

所有自动配置的类全都在: org.springframework.boot.autoconfigure 包下。只能排出自动配置的类。

@ComponentScan

@ComponentScan 注解在 Spring 的注解中也起到到相当重要的作用,它可以自定义 Spring 扫描的包,也就是它默认会扫描标注了 @Controller 、 @Service 、 @Component 以及 @Repository 注解的类,并实例化这些组件到 SpringIOC 容器中,它有个配置属性: basePackages ,也就是指定扫描的包,如果不知道,它会默认扫描配置了该注解的类的包所在的路径(包括子包)。我们看 @SpringBootConfiguration 注解的源码中有段代码:

@AliasFor (

  annotation   =   ComponentScan . class ,

  attribute   =   "basePackages"

)

String [] scanBasePackages () default  {};

scanBasePackages 属性,指定到了 @ComponentScan 注解的 basePackages 属性,所有在 SpringBoot 中,我们同样可以通过 scanBasePackages 属性指定包扫描的路径(如不指定,会默认扫描主程序类所在的包路径以及子包下的类):

@SpringBootApplication(scanBasePackages = "com.seagetech.springbootdemo")


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913892/viewspace-2646751/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
欢迎关注公众号:好程序员特训营 web前端教程分享 723729549 大数据教程分享 703503210

注册时间:2019-03-20

  • 博文量
    539
  • 访问量
    410802