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 的请求流程
.
根据上图所示,Spring MVC
的请求流程如下:
- 用户向前端控制器(
DispatcherServlet
)发起请求,该控制器会过滤不能访问的用户请求。 - 前端控制器通过处理器映射器将
URL
匹配到相应的Controller
映射的组件上,即返回处理器(Handler
)。 - 返回处理器之前处理设置的拦截器。
DispatcherServlet
收到返回的处理器后,通过处理适配器(HandlerAdapter
)来访问处理器,并处理用户请求。- 执行处理器将
ModelAndView
对象作为结果返回给HandlerAdapter
。 - 通过
HandlerAdapter
将ModelAndView
对象返回给前端控制器。 - 前端控制器请求视图解析器(
ViewResolver
)进行视图解析,根据逻辑视图名解析为真正的视图(JSP
、Freemaker
、HTML
),即根据ModelAndView
对象中存放的视图名称进行查找,找到对应的页面后形成视图对象。 - 将视图对象返回给前端控制器。
- 视图渲染,将
ModelAndView
对象中的数据放入Request
域中,让页面渲染数据。 - 将渲染数据后的视图返回给用户,完成整个请求。
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
- 配置类里面使用 @Bean 注解标注在方法上给容器注册组件,默认也是单实例的。
- 给 @Bean 标注的方法传入了对象参数,这个参数的值就会自动从容器中找。
- 配置类本身也是组件。
- proxyBeanMethods:代理 bean 的方法
- Full(proxyBeanMethods = true)【保证每个 @Bean 方法被调用多少次返回的组件都是单实例的】
- Lite(proxyBeanMethods = false)【每个 @Bean 方法被调用多少次返回的组件都是新创建的】
- 组件依赖必须使用 Full 模式(默认),其他时候使用 Lite 模式。
- 基本使用
/* 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));
}
}
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)
- 利用
getAutoConfigurationEntry(annotationMetadata);
给容器中批量导入一些组件。 - 调用
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
获取到所有需要导入到容器中的配置类(组件)。 - 利用工厂加载
Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader)
:得到所有的组件。 - 从
META-INF/spring.factories
位置来加载一个文件。- 默认扫描我们当前系统里面所有
META-INF/spring.factories
位置的文件。 spring-boot-autoconfigure-2.3.4.RELEASE.jar
包里面也有META-INF/spring.factories
。
- 默认扫描我们当前系统里面所有
.
文件里面写死了 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
继承树:
.
@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 作用:
- 开启对应类的配置绑定功能。
- 将该类型组件自动注册到 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";
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战