Spring框架的作用
主要解决了创建对象和管理对象的问题。 (IoC 控制反转)
在使用Spring框架后,当需要某个对象时,直接通过Spring获取此对象即可。
Spring可以保证类的对象的唯一性,使得各组件出现依赖关系时,不会创建多个相同的对象。
由于Spring会创建很多个对象并管理起来,开发者需要时直接获取即可,所以,Spring也通常被称之为“Spring容器”。
通过Spring创建并管理对象–组件扫描
Spring提供了组件扫描的机制,它可以扫描指定的包,并查找此包及其子孙包下是否存在组件类,
判定组件类的标准是类上是否存在组件注解,基础的组件注解有:
@Component
@Controller
@Service
@Repository
在Spring框架的解释中,以上4个注解是完全等效的,只是语义不同。
所以,当某个类需要被Spring框架创建对象时,需要:
- 确保这个类在组件扫描的范围之内
- 确保这个类添加了组件注解
提示:在Spring Boot项目中,默认就已经配置好了组件扫描,扫描的根包就是创建项目时已存在的包。
通过Spring创建并管理对象–@Bean方法
在Spring框架的使用中,如果某个类添加了@Configuration
注解,则此类将是“配置类”。
注意:配置类也必须在组件扫描的范围内。
在配置类中,可以自行添加一些方法,在方法上添加@Bean
注解,则此方法会被Spring自动调用,且方法返回的对象也会被Spring管理。
在同一个配置类中,允许存在多个@Bean
方法。
关于方法的声明:
- 访问权限:应该是
public
- 返回值类型:你希望Spring管理的对象的类型
- 方法体:应该正确的返回与声明匹配的对象
- 方法名称:自定义
所以,当某个类需要被Spring框架管理对象时,需要:
- 在配置类中添加
@Bean
方法,使用此方法返回需要被管理的对象
如何选择创建并管理对象的方式
仅自定义的类型可以使用组件扫描的方式,当然,自定义的类型也可以使用@Bean
方法的做法,但是不推荐。
非自定义的类型不可以使用组件扫描的方式(因为你没有办法在这些类型上添加组件注解),只能使用@Bean
方法的做法。
自动装配
当某个属性需要值时,或被Spring调用的方法需要参数值时,Spring框架会自动从容器中查找符合的对象,自动为属性或方法的参数赋值。
在属性上,添加@Autowired
注解,即可使得Spring尝试自动装配。
组件扫描
在Spring框架中,通过@ComponentScan
注解,即可配置组件扫描
在Spring Boot项目中,默认即存在的类(有main()
方法的那个类)上添加了@SpringBootApplication
注解,此注解的源代码中包含@ComponentScan
。
在Spring Boot项目中,无论是执行默认即存在的类的main()
方法,还是执行带@SpringBootTest
注解的类中的测试方法,都会加载整个项目的配置,所以,组件扫描是已启动的。
在
@SpringBootApplication
的声明上有@ComponentScan
,则@SpringBootApplication
具有@ComponentScan
的效果。在
@SpringBootApplication
的声明上有@ComponentScan
,则@ComponentScan
可称之为@SpringBootApplication
的元注解。
自动装配
当Spring尝试实现自动装配时,会从Spring容器中查找合适的对象,关于“合适”的判定标准,首先,类型必须匹配,如果匹配类别的Bean有多个,必须保证名称匹配才可以正确装配。
关于名称匹配:被自动装配的属性名称,与Bean的名称相同。
关于Bean的名称:如果类名的第1个字母是大写的,且第2个字母是小写的,则Bean的名称是将类名首字母改为小写,例如BrandRepositoryImpl
的Bean名称就是brandRepositoryImpl
,否则,Bean名称就是类名。