SpringBoot中的bean管理示例详解
作者:曼诺尔雷迪亚兹
一、获取bean
1.默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
根据name获取bean:
object getBean (String name)
根据类型获取bean:
<T> T getBean (Class<T> requiredType)
根据name获取bean(带类型转换) :
<T> TgetBean(String name,Class<T> requiredType)
示例:
package com.itheima; import com.itheima.controller.DeptController; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; @SpringBootTest class SpringbootWebConfig2ApplicationTests { @Autowired private ApplicationContext applicationContext; //IOC容器对象 //获取bean对象 @Test public void testGetBean() { //根据bean的名称获取 //声明一个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); }
运行结果:
上述所说的【Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于默认的单例 非延迟加载的bean而言。
二、bean作用域
spring支持五种作用域,后三种在web环境才生效:
作用域 | 说明 |
---|---|
singleton | 容器内同名称的bean只有一个实例(单例)(默认) |
prototype | 每次使用该 bean时会创建新的实例(非单例) |
request | 每个请求范围内会创建新的实例(web环境中,了解) |
session | 每个会话范围内会创建新的实例((web环境中,了解) |
application | 每个应用范围内会创建新的实例(web环境中,了解) |
1.设置作用域
可以通过@Scope
注解来进行配置作用域:
//@Lazy //延迟初始化 --延迟到第一次使用的时候 @Scope("prototype") //将作用域设置为非单例的prototype--每次调用后bean对象都不同 @RestController @RequestMapping("/depts") public class DeptController { }
默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。prototype的bean,每一次使用该bean的时候都会创建一个新的实例。实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。
三、第三方bean
常见的bean管理的类
@Component @Controller @Service @Repository
.但是存在第三方的bean–比如:引入的第三方依赖的bean,*示例:为了解析XML文件所添加到pom的依赖:
<!--Dom4j--> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency>
* test中的类:
//第三方bean的管理 @Test public void testThirdBean() throws Exception { SAXReader saxReader = new SAXReader(); //读取XML文件,下面逻辑是对XML文件的解析 Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml")); Element rootElement = document.getRootElement(); String name = rootElement.element("name").getText(); String age = rootElement.element("age").getText(); System.out.println(name + " : " + age); }
按照之前的学习,我们就需要在
SAXReader
这个类上添加@Component
注解,但是这个类是read-only
,所以不能添加注解将其变成bean对象。
如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component
及衍生注解声明bean的,就需要用到@Bean
注解。
在启动类上添加加一个新的方法,并且添加@Bean
注解:
//声明第三方bean @Bean //将当前方法的返回值对象交给Ioc容器管理,成为IOC容器bean public SAXReader saxReader() { return new SAXReader(); }
现在可以在读取XML文件的类上添加@Autowried
注解来注入这个类的bean对象:
@Autowired private SAXReader saxReader; //第三方bean的管理 @Test public void testThirdBean() throws Exception { /** * SAXReader saxReader = new SAXReader(); //读取XML文件, */ //下面逻辑是对XML文件的解析 Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml")); Element rootElement = document.getRootElement(); String name = rootElement.element("name").getText(); String age = rootElement.element("age").getText(); //输出XML中的数据(解析后) System.out.println(name + " : " + age); }
缺点:若要管理的第三方bean对象,建议对这些bean进行集中分类配置,而不是如上放在启动类中,可以通过
@Configuration
注解声明一个配置类。
- 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
- 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
到此这篇关于SpringBoot中的bean管理的文章就介绍到这了,更多相关SpringBoot bean管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!