获取bean
- 默认情况下,在Spring项目启动时,会把bean都创建好(但是还会受到作用域及延迟初始化的影响)放在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)
-
- 根据name获取bean
具体实现代码及运行结果如下
具体代码
-
@Autowired ApplicationContext applicationContext; // 自动注入IOC容器对象 @Test public void GetBean() { // 根据bean的名称获取 DeptController bean1 = (DeptController) applicationContext.getBean("deptController"); System.out.println(bean1); // 根据bean的类型获取 DeptController bean2 = applicationContext.getBean(DeptController.class); System.out.println(bean2); // 根据bean的名称以及类型获取 DeptController bean3 = applicationContext.getBean("deptController", DeptController.class); System.out.println(bean3); }
运行结果
在SpringBoot项目中设置bean对象
在Spring Boot中,可以使用注解来定义和配置Bean。常用的注解包括:
- @Component:用于标识一个普通的Bean类。
- @Service:用于标识一个服务类,通常用于业务逻辑的处理。
- @Repository:用于标识一个数据访问类,通常用于数据库操作。
- @Controller:用于标识一个控制器类,通常用于处理HTTP请求。
除了以上常用的注解外,还有一些特殊用途的注解,如:
- @Configuration:用于标识一个配置类,通常用于配置Bean的创建和依赖关系。
- @Autowired:用于自动注入依赖的Bean。
- @Value:用于注入配置属性的值。
通过使用这些注解,可以将普通的Java类转化为Spring Bean,使其由Spring容器进行管理。Spring容器会负责创建、初始化和销毁这些Bean,并处理它们之间的依赖关系。在应用程序中,可以通过注入Bean来使用其提供的功能和服务。
bean作用域
- Spring支持5种作用域,后三种在web环境才生效
-
作用域 说明 singleton 容器内同名称的bean只有一个实例(单例)默认 prototype 每次使用该bean时会创建新的实例(非单例) request 每个全球范围内会创建新的实例(web环境下,了解) session 每个会话范围内会创建新的实例(web环境下,了解) application 每个应用范围内会创建新的实例(web环境下,了解) -
可以通过@Scope注解来进行配置作用域
注意事项
-
默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时,才会创建该bean对象)。
-
prototype的bean,每一次使用该bean时都会创建一个新的实例。
-
实际开发过程中,绝大部分的bean是单例的,也就是说绝大部分bean不需要配置scope属性。
具体代码及效果
- scope为默认值singleton
-
@Test public void GetBean() { // 根据bean的名称获取 for (int i = 1; i < 5; i++) { DeptController bean1 = (DeptController) applicationContext.getBean("deptController"); System.out.println(bean1); } }
-
-
运行结果(都是同一个bean对象)
- scope为prototype
- 运行结果(每一次都会创建一个新的实例对象)
第三方bean
- 对于第三方的类,我们无法在其代码中加入注解来将其添加到IOC容器中去。
- 如果要管理的bean来自第三方(不是自定义的),是无法使用@Component及其衍生注解来说明bean的,就需要用到@Bean注解,通过@Bean注解的name/value属性指定bean名称,如果未指定,默认是方法名。
具体实现
- 在SpringBoot项目的启动类中加上一个方法,在该方法中创建第三方类的对象并且返回该对象,并且在该方法上加入@Bean注解(但是这种方式不建议)
-
public class TliasApplication { public static void main(String[] args) { SpringApplication.run(TliasApplication.class, args); } @Bean // todo 将发放返回值交给IOC容器管理,称为IOC容器的bean对象 public SAXReader saxReader() { return new SAXReader(); } }
-
- 若要管理第三方的bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。当应用程序启动时,Spring Boot会自动扫描并加载所有带有特定注解的配置类
- 具体实现如下
-
@Configuration public class BeanConfig { @Bean // todo 将发放返回值交给IOC容器管理,称为IOC容器的bean对象 public SAXReader saxReader() { return new SAXReader(); } }
-
如果在配置第三方类时要进行依赖注入的话,就可以在创建的方法中设置要注入的对象类型及其名称,然后Spring容器会继续自动装配
-
具体代码
-
@Configuration public class BeanConfig { @Bean // todo 将发放返回值交给IOC容器管理,称为IOC容器的bean对象 public SAXReader saxReader(DeptService deptService) { return new SAXReader(); } }
-
-
注意事项
- 通过@Bean注解的name/value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名
- 如果第三方bean需要依赖其它的bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配、
- 项目中自定义的,使用@Component及其衍生注解
- 项目中第三方引入的,使用@Bean注解