目录
1.什么是bean
2.获取bean
3.bean的作用域
4.第三方bean
5.Bean的生命周期
6.Bean的种类
7.为什么使用Bean?
1.什么是bean
Bean是Java世界中的一种组件,用于封装数据和逻辑,以便在应用程序中重用和维护。它不仅可以装在数据,还可以包含业务逻辑,甚至连接到数据库的操作。这样的设计让开发工作变得更加模块化,提高了代码的可重用性(由于封装的特性,Bean可以被多个程序或多个项目中复用,提高了开发效率。)和可维护性。通常情况下,Bean由私有属性和公有的访问方法(getter和setter)组成。这种结构让外部代码只能通过指定的接口与Bean交互,而不能直接访问内部状态,从而确保了数据的封装性和安全性。
在Spring框架中,Bean是由Spring IoC容器来管理的对象。IoC即控制反转,是一种设计原则,用来减少代码之间的依赖关系。通过依赖注入的方式,Spring容器负责将依赖对象提供给需要的Bean,这样就降低了组件之间的耦合度。
2.获取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)
上述所说的(spring项目启动时,会把其中的bean都创建好)还会受到作用域延迟初始化的影响,这里主要针对于默认的单例非延迟加载的bean而言。
3.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属性。
4.第三方bean
@Bean
如果要管理bean对象来自第三方(不是自定义的)、是无法用@Component及衍生注解声明bean的,就需要用到@Bean注解。
若要管理这些第三方的bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。
不建议在启动类中添加其他代码,要保证其纯净性。
@SpringBootApplition
public class SpringBootWebConfig2Applition{
@Bean//将方法返回值交给IOC容器管理,成为IOC容器的bean对象
public SAXReader saxReader(){
return new SAXReader();
}
}
config包下创建类
@Configuration
public class CommonConfig{
@Bean
public SAXReader saxReader(){
return new SAXReader();
}
}
注意事项:
- 通过@Bean注解的name注解或value可以声明bean的名称,如果不指定,默认bean的名称就是方法名
- 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
5.Bean的生命周期
- 通过BeanDefinition获取bean的定义信息
- 通过构造函数实例化bean
- bean的依赖注入
- 处理Aware接口(BeanNameAware,BeanFactoryAware,ApplicationContextAware)
- Bean的后置处理器BeanPostProcessor——前置
- 初始化方法(InitializingBean,init-method)
- Bean的后置处理器BeanPostProcessor——后置
- 销毁Bean
6.Bean的种类
在Java的世界里,有几种不同类型的Bean:
-
实体Bean(Entity Bean):通常用于表示数据库中的数据表,每个实体Bean对应表中的一行记录。
-
会话Bean(Session Bean):用户与系统交互时,会话Bean保存用户信息,充当的是用户的会话对象。
-
消息驱动Bean(Message-Driven Bean):用于处理异步消息,常与JMS(Java Message Service)一起使用。
7.为什么使用Bean?
使用Bean的好处包括但不限于:
-
解耦:Bean的使用减少了代码间的直接依赖,使得各部分更容易理解和维护。
-
提高可测试性:由于Bean是独立的组件,可以单独对Bean进行测试,提升整体代码的可测试性。
-
增强灵活性:Bean可以被任何支持Java的平台重用和扩展,这为应用程序提供了更大的灵活性。