Bean
Bean的配置
Spring容器支持XML和Properties两种格式的配置文件。常用XML配置文件。可以通过XML文件来注册并管理Bean之间的依赖关系。
<--!通用配置-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
< beans>元素的常用属性/元素
XML配置文件的根元素是< beans>,下面将介绍一些常用的属性:
- id:Bean的唯一标识符,相当于实例名
- name:与id属性效果一致。利于Spring容器中对Bean配置
- class:指定Bean的具体实现类,完整类名。
- scope:设置Bean实例的作用域
- constructor-arg:子元素。用来设置构造器注入。index属性指定构造参数的序号(0开始),type属性指定参数类型,ref或value指定值。
- property:子元素。调用setter方法注入。name指定属性,value指定值。ref类似value,另外可以指定Spring容器的Bean。
- ref:指定Bean中某个实例的引用
- value:指定值
- list:用于封装List或数组的依赖注入
- set:用于封装Set类型的依赖注入
- map:用于封装Map类型的依赖注入
- entry:Map元素的子元素,设置键值对
Bean的实例化
在Spring容器中实例化Bean有三种方式:构造器实例化、静态工厂实例化、实例工厂实例化。最常用的就是构造器实例化。
构造器实例化
Spring容器通过Bean对应类中的默认无参构造方法来实例化Bean。例如:
- 创建一个Bean1类
- 配置applicationContext.xml文件
- 创建测试类
静态工厂实例化
static factory实例化,创建一个工具类,里面包含了一个静态方法,专门用new来实例化对象。然后在配置文件中,创建Bean的实例时,添加一个factory-method属性。用于指定工具类中的方法。例如:
- 创建一个工具类
- 配置文件
- 测试类
实例工厂实例化
实例化工厂实例化,大致思路和static factory实例化方式一致,创建的不再时静态方法,而是实例方法。然后,在配置文件中创建Bean的实例。最后,在创建一个Bean 添加属性factory-bean指定上述创建的Bean实例,其次添加属性factory-method指定执行Bean中的哪个方法。例如:
- 创建工具类
- 配置文件
- 测试类
Bean的作用域
Bean的作用域说明配置文件中创建Bean的实例作用范围,以及是否会创建多个相同的实例。有如下7中作用域,其中singleton和prototype为常用类型:
- singleton(单例):默认作用域。无论有多少个Bean引用它,始终指向同一个对象。
- prototype(原型):每次获取Bean,都会创建一个新的Bean实例
- request:同一个HTTP请求中,容器会返回Bean的同一个实例。不同的HTTP请求中,容器会产生一个新的Bean。且Bean仅在当前请求中有效
- session:同一个HTTP Session中,容器会返回Bean的同一个实例。不同的HTTP Session中,容器会产生一个新的Bean。且Bean仅在HTTP Session中有效
- globalSession:在一个全局HTTP Session中,返回同一个实例。仅在portlet上下文时有效。
- application:为每个ServletContext对象创建一个实例。仅在Web相关的ApplicationContext中生效。
- websocket:为每个websocket对象创建一个实例。仅在Web相关的ApplicationContext中生效。
singleton作用域
默认作用域。singleton作用域对于无会话状态的Bean(如Dao组件、Service组件)来说,是不错的选择。
- 工具类
- 配置文件
- 测试类
prototype作用域
对需要保持会话状态的Bean,应该使用prototype作用域。每请求一个Bean都会创建一个新的实例。使用方法类似上文,不再赘述。
Bean的生命周期
Spring容器可以管理singleton作用域的Bean的生命周期,Spring容器可以知道Bean何时被创建、初始化及销毁。对于prototype作用域的Bean,Spring容器只管创建实例。下面将介绍Bean的生命周期:
- 根据配置信息调用Bean构造方法或工厂方法实例化Bean
- 利用依赖注入完成属性注入
- 如果Bean实现了BeanNameAware接口,则Spring调用Bean的setBeanName()方法传入当前Bean的id值。
- 如果Bean实现了BeanFactoryAware接口,则Spring调用Bean的setBeanFactory()方法传入当前工厂实例的引用。
- 如果Bean实现了ApplicationContextAware接口,则Spring调用Bean的setApplicationContext()方法传入当前ApplicationContext实例的引用。
- 如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法postProcessBeforeInitialzation()对Bean进行加工操作。Spring的AOP操作就是用它是实现的
- 如果Bean实现了InitializingBean接口,则Spring调用Bean的afterPropertiesSet()方法
- 如果在配置文件中通过init-method属性指定了初始化方法,则调用该初始化方法
- 如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法postProcessAfterInitialization()。此时Bean已经可以被应用系统所使用
- 如果在< bean>中指定作用域scope=“singleton”,则将该Bean放入Spring IoC缓存中,同时触发对Bean的生命周期管理。若作用域为prototype,则由调用者管理该Bean的生命周期。
- 如果Bean实现了DisposableBean接口,则Spring会调用destory()方法将Spring中的Bean销毁。如果在配置文件中destory-method指定了销毁方法,则Spring调用该方法销毁Bean
Bean的装配方式
Bean的装配就是依赖注入,即依赖注入方式。Spring支持基于XML装配、基于Annotation(注解)装配和自动装配。基于Annotation装配最为常用
基于XML装配
基于XML的装配有两种方式:设值注入(setter方法)和构造器注入。
设值注入(setter方法)
设值注入,Spring会调用Bean的默认构造方法来创建Bean的对象,再通过反射机制,调用setter方法完成属性的注入。< bean>元素的子元素中使用 < property>为每一个属性注入值
构造器注入
构造器注入就比较直接了,直接调用对应的构造器实例化的同时完成属性注入。< bean>元素的子元素< constructor-arg>来定义构造器每一个参数。
基于XML装配的练习
- 创建用户类
- 配置文件
- 创建测试类
基于Annotation装配
Spring Annotation装配分为两类注解:1、对Bean的注解,即< bean id="" class="*"/>,完成实例化注解。2、对属性的注解,即< property name="" value=""/>,完成依赖注入。
- @Component
可以使用此注解描述Spring中的Bean,可以用在任何层次。但为了更清晰直观的表达在哪一个层次上的注解。细分以下几种
- @Repository
专门用作数据访问层(DAO层)注解,效果与@Component一致
- @Service
专门用作业务层(Service层)注解,效果与@Component一致
- @Controller
专门用作控制层(Controller层)注解,效果与@Component一致。
- @Autowired
用于对属性的注入。默认按照Bean的类型进行装配。
- @Resource
默认按照Bean的实例名完成进行装配。name指定实例名,type指定Bean类名。
- @Qualifier
与@Autowired配合使用,将默认按照Bean类名装配修改为按实例名装配。Bean的实例名由@Qualifier注解的参数指定。
基于Annotation装配的练习
- @Repository注解类
- @Service、@Resource注解类
- @Controller注解类
- 配置文件
- 测试类
上文中,配置文件中还需额外配置Bean的实例,比较麻烦。使用如下,即可配置Spring自动扫描指定路径下的Bean类
基于自动装配
可以通过设置< bean>元素中autowirte属性自动完成注入。
autowirte属性有如下几个值:
- default:由< bean>元素的上级标签< beans>的default-autowirte属性值确定
- byName:根据属性名自动装配
- byType:根据数据类型自动装配
- constructor:根据构造函数参数的数据类型,自动装配
- no:不使用自动装配。
<!--上述通用语句不再赘述-->
<bean id="userDao" class="********"/>
<bean id="userService" class="******"
autowire="byName"/>
<!--autowire意思就是,如果UserService类某个属性的名字和配置文件中设置< bean>的实例名相同,则自动注入-->
@syl 2021/07/20 周二 16:50 晴 31°