@SpringBootApplication
@SpringBootApplication
看作是 @Configuration
、@EnableAutoConfiguration
、@ComponentScan
注解的集合。
@Configuration
:允许注册额外的 bean 或导入其他配置类@EnableAutoConfiguration
:启用 SpringBoot 的自动配置机制@ComponentScan
:扫描被@Component
(@Repository
,@Service
,@Controller
)注解的 bean,注解默认会扫描该类所在的包下所有的类。
自动配置机制?在启动过程中,Spring Boot会扫描应用程序的类路径,根据定义条件匹配的各种AutoConfiguration类进行自动配置。通过条件化配置和默认属性值,根据应用程序的类路径和其他条件来自动配置Spring应用程序的各种组件。自动配置的目标是让开发人员能够以最小的配置和干预自动获得功能完整的应用程序。
Spring Bean 相关
@Resource和@Autowired
-
@Autowired
:用于构造器、方法、参数或字段上,表明需要自动注入一个Bean。Spring会自动装配匹配的Bean,默认是按类型装配。 -
@Qualifier
:与@Autowired
一起使用时,指定要注入的Bean的名称,以避免与其他Bean的混淆。 -
@Primary
: 当一个类型有多个Bean时,在不使用@Qualifier
的情况下,Spring会优先选择标注了@Primary
的Bean。 -
@Resource
:来自JDK,类似于@Autowired
,但默认是按名称装配,也可以混合使用。 -
@Inject
:来自javax.inject包,类似于@Autowired
,属于JSR-330标准的一部分。
两者的区别
@Autowired
是Spring框架提供的注解,主要用于根据类型自动装配依赖项。行为和特性:
- 按类型装配:默认情况下,
@Autowired
按类型自动装配Bean。 - 可选依赖:如果你的依赖是可选的,可以使用
required=false
设置: - 构造器、方法或字段:可以用在构造器,属性字段或Setter方法上。
- 结合
@Qualifier
:可以和@Qualifier
结合使用以实现按名称装配。 - 作为Spring特有的注解,它更深度地集成在Spring的生态系统中,更适合与其他Spring注解一起使用。
@Resource
是JDK提供的注解,属于Java依赖注入规范(JSR-250)的一部分。行为和特性:
- 按名称装配:默认情况下,
@Resource
按名称装配。如果没有匹配到名称,再按类型装配。 - 不支持required属性:与
@Autowired
不同,@Resource
不支持required属性。 - 可以用于字段和Setter方法:虽然也可以用于构造器,但不常见。通常用在字段或Setter方法上。
- 由于是Java EE规范的一部分,它可以与其他Java EE注解(如
@PostConstruct
和@PreDestroy
)更好地配合使用。
依赖注入的优先级(重要)
在使用 @Resource
注解进行依赖注入时,优先级规则如下:
-
明确指定名称:
- 如果通过
@Resource(name="beanName")
明确指定了 Bean 的名称,那么 Spring 会首先按照名称匹配进行注入。 - 在这种情况下,
@Primary
注解不会影响注入结果。
- 如果通过
-
按字段或属性名称匹配:
- 如果没有通过 name 属性指定 Bean 的名称,Spring 会尝试按照字段或属性的名称进行匹配。
- 在这种情况下,
@Primary
注解也不会影响注入结果。
-
按类型匹配:
- 如果按名称匹配失败(包括明确指定名称和按字段名称匹配都没有找到合适的 Bean),Spring 会按类型匹配。
- 在这种情况下,如果存在多个同类型的 Bean,则
@Primary
注解会起作用,标记为@Primary
的 Bean 将被优先注入。
在使用 @Autowired
注解进行依赖注入时,优先级规则如下:
- 按类型匹配:Spring 首先通过类型匹配找到所有符合要求的候选 Bean。如果只有一个候选 Bean,那么该 Bean 会被注入。
- 按名称匹配结合
@Qualifier
:- 如果有多个同类型的 Bean,可以使用
@Qualifier
注解来指定具体的 Bean。 @Qualifier
的值必须与一个候选 Bean 的名称匹配,匹配成功的 Bean 会被注入。- 使用
@Primary
:如果仍存在多个符合要求的 Bean,并且其中一个 Bean 标记了@Primary
,Spring 会优先选择标记了@Primary
的 Bean 进行注入。
- 如果有多个同类型的 Bean,可以使用
- 按名称匹配字段或属性名称:在没有使用
@Qualifier
时,如果存在多个候选 Bean,Spring 会尝试通过字段或属性名称进行匹配。如果找到名称匹配的 Bean,则该 Bean 会被注入。 - NoUniqueBeanDefinitionException:如果存在多个候选Bean,但没有使用
@Qualifier
指定名称,且没有标记@Primary,会抛出NoUniqueBeanDefinitionException,表明有多个Bean类型匹配但无法确定注入哪个。
在使用
@Bean
方法中的参数 进行依赖注入时,默认的行为与@Autowired
注解的工作方式是一致的。
@Component,@Repository,@Service, @Controller
一般使用 @Autowired
注解让 Spring 容器自动装配 bean。
但要想把类标识成可用于 @Autowired
注解自动装配的 bean 的类,可以采用以下注解实现:
-
@Component
:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。 -
@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。 -
@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。 -
@Controller
: 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
@RestController
@RestController
注解是@Controller
和@ResponseBody
的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器,更加适合目前前后端分离的架构下,返回 JSON 数据格式。
单独使用 @Controller
不加 @ResponseBody
的话一般是用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。@Controller
+@ResponseBody
返回 JSON 或 XML 形式数据
@Scope
声明 Spring Bean 的作用域
常见的 Spring Bean 的作用域:
-
singleton
: 唯一 bean 实例,Spring 中的 bean 默认都是单例的。 -
prototype
: 每次请求都会创建一个新的 bean 实例。 -
request
: 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。 -
session
: 每一个 HTTP Session 会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效
@Configuration
用来声明配置类,可以使用 @Component
注解替代,不过使用@Configuration
注解声明配置类更加语义化。
常见的 HTTP 请求类型
5 种常见的请求类型:
GET
:请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)
@GetMapping(“users”) 等价于@RequestMapping(value=“/users”,method=RequestMethod.GET)
POST
:在服务器上创建一个新的资源。举个例子:POST /users(创建学生)
@PostMapping(“users”) 等价于@RequestMapping(value=“/users”,method=