跟学视频:黑马JavaWeb课程
Bean管理
获取Bean
默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。应用程序在运行时需要依赖什么bean对象,就直接进行依赖注入就可以了
在Spring容器中提供了一些方法,可以主动从IOC容器中获取到Bean对象
- 根据name获取bean
Object getBean(String name)
- 根据类型获取Bean
<T> T getBean(class<T> requiredType)
- 根据name和类型获取Bean
<T> T getBean(String name, Class<T> requiredType)
@SpringBootTest
class SpringbootWebConfig2ApplicationTests {@Autowiredprivate ApplicationContext applicationContext; //IOC容器对象//获取bean对象@Testpublic void testGetBean(){//根据bean的名称获取DeptController bean1 = (DeptController) applicationContext.getBean("deptController");//根据bean的类型获取DeptController bean2 = applicationContext.getBean(DeptController.class);//根据bean的名称 及 类型获取DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);}
}
Bean作用域
在Spring中支持五种作用域,后三种在web环境才生效:
| 作用域 | 说明 |
|---|---|
| singleton | 容器内同名称的bean只有一个实例(单例)(默认) |
| prototype | 每次使用该bean时会创建新的实例(非单例) |
| request | 每个请求范围内会创建新的实例(web环境中) |
| session | 每个会话范围内会创建新的实例(web环境中) |
| application | 每个应用范围内会创建新的实例(web环境中) |
可以通过@Scope注解来进行配置作用域:
@Scope("prototype")
@RestController
@RequestMapping("/depts")
public class DeptController{}
注意事项:
- 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)
- prototype的bean,每一次使用该bean的时候都会创建一个新的实例
- 实际开发中,绝大部分的Bean是单例的,即绝大部分Bean不需要配置Scope属性
第三方Bean
如果要管理的Bean对象来自第三方(不是自定义的),是无法用@Component及其衍生注解声明Bean的,就需要用到@Bean注解
若要管理第三方Bean对象,建议对这些Bean进行集中分类配置,可以通过@Configuration注解声明一个配置类
@Configuration //配置类 (在配置类当中对第三方bean进行集中的配置管理)
public class CommonConfig {//声明第三方bean@Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean//通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名public SAXReader reader(DeptService deptService){System.out.println(deptService);return new SAXReader();}
}
在方法上加上一个@Bean注解,Spring 容器在启动的时候,它会自动的调用这个方法,并将方法的返回值声明为Spring容器当中的Bean对象
注意事项:
- 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名(一般不指定)
- 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配