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

前言

Spring经历了以下几个阶段:java

第一阶段:xml配置web

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

第二阶段:注解配置数据库

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

第三阶段:java配置安全

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

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

 

@ Configuration和@Bean注解

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

一、@Configuration 做用于类上,至关于一个xml配置文件;测试

二、@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")

相关文章
相关标签/搜索