01-SpringBoot注解

Spring Boot 注解

Spring 常用注解配置

注 解 含 义
@Configuration 定义一个类是 Spring 配置类
@Bean 配置自定义的 Bean,如 DruidDataSource
@ComponentScan 组件扫描器,扫描标记有 @Component、@Controller、@Service、@Repository 注解的类
@PropertySource 加载 properties 配置文件
@Import 用来组合多个配置类

Spring 常用注解

注 解 注 解 含 义
@Component 定义一个 Bean 加载到 Spring 容器中
@Controller Web 请求入口类标记
@Service Service 类标记
@Repository Dao 类标记接口
@Autowired 自动注入
@Qualifier Bean 的别名设置
@PostConstruct 作为初始化回调方法的替代注解
@PreDestroy 作为销毁回调方法的替代注解
@Lazy 延迟加载的注解
@Scope 制定 Bean 的作用范围,单例 或 多例
@Primary 当出现多个同类型的 Bean 时用来标记首选 Bean
@Value 用于获取 Spring 配置文件中的值

Spring MVC 的请求流程

SpringMVC.

根据上图所示,Spring MVC 的请求流程如下:

  1. 用户向前端控制器(DispatcherServlet)发起请求,该控制器会过滤不能访问的用户请求。
  2. 前端控制器通过处理器映射器将 URL 匹配到相应的 Controller 映射的组件上,即返回处理器(Handler)。
  3. 返回处理器之前处理设置的拦截器
  4. DispatcherServlet 收到返回的处理器后,通过处理适配器(HandlerAdapter)来访问处理器,并处理用户请求。
  5. 执行处理器将 ModelAndView 对象作为结果返回给 HandlerAdapter
  6. 通过 HandlerAdapterModelAndView 对象返回给前端控制器。
  7. 前端控制器请求视图解析器(ViewResolver)进行视图解析,根据逻辑视图名解析为真正的视图(JSPFreemakerHTML),即根据 ModelAndView 对象中存放的视图名称进行查找,找到对应的页面后形成视图对象。
  8. 将视图对象返回给前端控制器。
  9. 视图渲染,将 ModelAndView 对象中的数据放入 Request 域中,让页面渲染数据。
  10. 将渲染数据后的视图返回给用户,完成整个请求。

Spring Boot 注解

@SpringBootApplication

@SpringBootApplication 注解标记本类是 Spring Boot 的启动类,执行这个类的 main() 方法即可启动 Spring Boot 项目。

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

@SpringBootConfiguration

继承自 @Configuration,用于标注当前类属于配置类,其注解会将类中声明的一个或多个以 @Bean 注解标记的方法的返回值初始化并加载到 Spring 的 IoC 容器中,Bean 的名称为方法名

@Configuration

  1. 配置类里面使用 @Bean 注解标注在方法上给容器注册组件,默认也是单实例的。
    • 给 @Bean 标注的方法传入了对象参数,这个参数的值就会自动从容器中找
  2. 配置类本身也是组件
  3. proxyBeanMethods:代理 bean 的方法
    • Full(proxyBeanMethods = true)【保证每个 @Bean 方法被调用多少次返回的组件都是单实例的】
    • Lite(proxyBeanMethods = false)【每个 @Bean 方法被调用多少次返回的组件都是新创建的】
    • 组件依赖必须使用 Full 模式(默认),其他时候使用 Lite 模式。
  1. 基本使用
/*					Configuration使用示例
 *
 *  1. 配置类里面使用 @Bean 注解标注在方法上给容器注册组件,默认也是单实例的。
 *  2. 配置类本身也是组件。
 *  3. proxyBeanMethods:代理 bean 的方法
 *      Full(proxyBeanMethods = true)【保证每个 @Bean 方法被调用多少次返回的组件都是单实例的】
 *      Lite(proxyBeanMethods = false)【每个 @Bean 方法被调用多少次返回的组件都是新创建的】
 *      组件依赖必须使用 Full 模式(默认),其他时候使用 Lite 模式。
 *
 */
// @Configuration:告诉 Spring Boot 这是一个配置类 ==等价于== 配置文件
@Configuration(proxyBeanMethods = true)
public class BeansConfig {

    /*
     *  Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象。
     */
    // @Bean:给容器中添加组件。
    //  组件 id:方法名
    //  组件类型:返回类型
    //  组件在容器中的实例:返回值
    @Bean
    public User user01() {
        User user = new User("软柠柠吖", 21);
        // user 组件依赖了 Pet 组件
        user.setPet(tomcatPet());
        return user;
    }

    @Bean("tom") // 给组件指定 id
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }
}
//				@Configuration测试代码如下

// @SpringBootApplication 注解标记本类是 Spring Boot 的启动类,
//  执行这个类的 main() 方法即可启动 Spring Boot 项目。
@SpringBootApplication // 主程序类、主配置类
public class SpringbootStudyApplication {
    public static void main(String[] args) {
        // 1. 返回我们的 IoC 容器
        ConfigurableApplicationContext ioc =
                SpringApplication.run(SpringbootStudyApplication.class, args);
        // 2. 查看容器里面的组件
        for (String name : ioc.getBeanDefinitionNames()) {
            System.out.println(name);
        }
        // 3. 从容器中获取组件
        Pet tom01 = ioc.getBean("tom", Pet.class);
        Pet tom02 = ioc.getBean("tom", Pet.class);
        System.out.println(tom01 == tom02);

        // 4. com.rnny.config.BeansConfig$$EnhancerBySpringCGLIB$$91e94998@428299bd
        BeansConfig bean = ioc.getBean(BeansConfig.class);
        System.out.println(bean);

        // 如果 @Configuration(proxyBeanMethods = true) 则代理对象调用方法,
        //  Spring Boot 总会检查这个组件是否在容器中有。保持组件单实例
        User user01 = bean.user01();
        User user02 = bean.user01();
        System.out.println(user01 == user02);

        // 组件依赖
        System.out.println("用户的宠物:" + (user01.getPet() == tom01));
    }
}
  1. Full 模式与 Lite 模式最佳实战
  • 配置的类组件之间无依赖关系,用 Lite 模式加速容器启动过程,减少判断。

  • 配置的类组件之间有依赖关系,方法会被调用得到之前单实例组件,用 Full 模式。

@EnableAutoConfiguration

借助 @Import 的支持,将所有符合自动配置条件的 Bean 的定义加载到 IoC 容器中。

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

@AutoConfigurationPackage

自动配置包

指定了默认的包规则。

@Import(AutoConfigurationPackages.Registrar.class) // 给容器中导入一个组件
public @interface AutoConfigurationPackage {}

// 利用 Registrar 给容器中导入一系列组件
// 将指定的一个包下的所有组件导入进来,哪个包下呢?
//	SpringbootStudyApplication 主程序所在的包下。

@Import(AutoConfigurationImportSelector.class)

  1. 利用 getAutoConfigurationEntry(annotationMetadata); 给容器中批量导入一些组件。
  2. 调用 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); 获取到所有需要导入到容器中的配置类(组件)。
  3. 利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader):得到所有的组件。
  4. META-INF/spring.factories 位置来加载一个文件。
    • 默认扫描我们当前系统里面所有 META-INF/spring.factories 位置的文件。
    • spring-boot-autoconfigure-2.3.4.RELEASE.jar 包里面也有 META-INF/spring.factories

image-20221108160827288.

文件里面写死了 spring-boot 一启动就要给容器中加载的所有配置类
spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

按需开启自动配置项

注意:虽然我们 127 个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration,最终按照条件装配规则@Conditional),按需配置

@ComponentScan

用于自动扫描并加载符合条件的组件(如 @Component 和 @Repository 等)或者 Bean 的定义,将 Bean 的定义加载到 IoC 容器中,因此 SpringBoot 的启动类最好放在根包下,因为默认不指定根包。

@Import

@Import({ }):自动创建组件并将组件加载到 IoC 容器中,默认组件的名字就是全类名。

// @Import({User.class, XmlEscapers.class})
//  给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名。
@Import({User.class, XmlEscapers.class})
@Configuration  // 告诉 SpringBoot 这是一个配置类 ==等价于== 配置文件
public class MyImportConfig {}

@Conditional

条件装配:满足 Conditional 指定的条件,则进行组件注入。

@Configuration
// 	当 Pet.class 类型的组件在容器中注册过时,加载该配置类
// @ConditionalOnBean(Pet.class) 
// 	当 Pet.class 类型的组件没有在容器中注册过时(缺少该类型的组件),加载该配置类
@ConditionalOnMissingBean(Pet.class)
public class MyConditionalConfig {}

Conditional 继承树:

image-20221108084735226.

@ImportResource

原生配置文件引入:导入 Spring 的配置文件并使其生效。

@Configuration
//	@ImportResource:导入 Spring 的配置文件并使其生效。
@ImportResource("classpath:beans.xml")
public class MyImportResourceConfig {}

@ConfigurationProperties

配置属性(配置绑定)

将 application.properties 或 application.yml 文件中的内容封装到 JavaBean 中,以供随时使用。

@Component + @ConfigurationProperties

适用场景:自己写的 JavaBean,适合用 @Component。

注意:只有在 IoC 容器中的组件,才会拥有 SpringBoot 提供的强大功能。

/*
    只有在 IoC 容器中的组件,才会拥有 SpringBoot 提供的强大功能。
 */
@Component
@ConfigurationProperties("mycar")
public class Car {
    private String brand;
    private Integer price;
}

@EnableConfigurationProperties + @ConfigurationProperties

适用场景:第三方组件,无法修改源代码,适合适用 @EnableConfigurationProperties。

@EnableConfigurationProperties 作用:

  1. 开启对应类的配置绑定功能。
  2. 将该类型组件自动注册到 IoC 容器中。
@Configuration
@EnableConfigurationProperties({Car.class})
// 1、开启 Car 配置绑定功能
// 2、把这个 Car 这个组件自动注册到容器中
public class MyConfig {
}

@RestController

@RestController 表示本类是一个控制器(Controller)的入口类,其作用相当于 @Controller + @ResponseBody,且返回 JSON 数据。

@RestController
public class HelloController {
    
    @GetMapping("/hi")
    public String hi() {
        return "success";
    }
}
posted @ 2022-11-09 22:44  软柠柠吖  阅读(27)  评论(0编辑  收藏  举报