SpringBoot 中的基本注解

@SpringBootApplication 注解

任何一个项目都有一个入口,在SpringBoot启动类需要有@SpringBootApplication 注解进行藐视,并且在类中定义一个main方法,main方法在运行时会读取配置文件,并加载指定资源,然后进行初始化操作.
所以:SpringBoot 项目在启动是时,首选基于启动入口类上的注解描述,进行自动配置并扫描指定包以及子包中的类进行加载.

@SpringBootTest 注解

顾名思义 SpringBoot工程中的单元测试需要使用@SpringBootTest 注解进行描述,用于告诉spring框架,次此测试类交由spring管理

@Autowired 注解

简单来说,@Autowired 注解就是告诉spring框架运行时为此属性注入一个值

 例如: 
 @SpringBootTest
public class DefauleCacheTests { 

@Autiwired

 private DefaultCache defaultCache; 

@Test

 void test DefaultCache(){
  System.out.println("defaultCache:"+ defaultCache);    
 }
输出结果为:
 defaultCache:com.cy.pj.common.cache.DefaultCache@6e33c391

@Component 注解

@Component 注解时Spring中用于描述Bean类的一个注解,用于告诉Spring这个类的实例由Spring创建,当此对象有Spring管理和创建是,会默认将对象存储到池中(Bean池)中.

@Scope 注解

@Scpoe注解 是Spring中用于定义Bean对象作用域的一个注解 常用的值有@Scope(singleton) @scpoe(prototype)

 @Scope(singleton):@Scope的默认值,单例作用域.既整个内存只有一份Bean实例,此实例创建与类延迟加载特性配置有关(@Lazy),此实例创建后生命周期会由spring框架管理. 
 @Scope(prototype): 多例作用域,每次获取都会创建新的实例,此实例会在需要的时创建,与Lazy特性无关,这个实例创建以后,并不会交给spring管理,spring可以对其初始化,但不负责销毁. 

@Lazy 注解

@Lazy 注解用于描述类,其目的是告诉Spring框架,此类支持延迟加载通常配合单例作用域(@singleton)使用
简单来说,就是它描述的类的实例,假如暂时用不到,就不要先创建实例(@Lazy(true) 默认值,适用于大对象,稀少用)

@PostConstruct 注解

@PostConstruct 注解描述的方法会在对象构建以后执行,用于执行一些初始化操作

@PreDestroy 注解

@PreDestroy 注解描述的方法会在单例对象销毁之前执行,spring容器在销毁之前,会先将容器(Bean)中的对象移除,在移除对象时,假如对象中定义了生命周期销毁方法,此时还会调用对象的生命周期销毁方法(在这样的方法中可以做一些资源释放操作)

总结

  1. @SpringBootApplication @SpringBootTest @Component
    @Lazy @scope 主要用于类上
    @PostConstruct @PreDestroy 主要用于方法上

    1. @Lazy和@PreDestroy 可以与适用于单例作用域使用 @Scope(singleton),但不适用于多例作用域@Scope(prototype).

Spring中的注解详说:

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让越来越多的开发人员使用的主要原因之一。下面我们就来详细讲解SpringBoot几个很重要的注解:@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,也就是指定扫描的包,如果不知道,它会默认扫描配置了该注解的类的包所在的路径(包括子包)。
@ComponentScan 注解默认会去扫描注解@Controller \ @Service \ @Component \ @Repository注解的类,并实例化这些组件到SpringIoC容器中.

我们看@SpringBootConfiguration注解的源码中有段代码:
@AliasFor(

 annotation = ComponentScan.class,

 attribute = "basePackages"

)

String[] scanBasePackages() default {};
scanBasePackages属性,指定到了@ComponentScan注解的basePackages属性,所有在SpringBoot中,我们同样可以通过scanBasePackages属性指定包扫描的路径(如不指定,会默认扫描主程序类所在的包路径以及子包下的类):
@SpringBootApplication(scanBasePackages = "com.seagetech.springbootdemo")


Kirc
4 声望0 粉丝