Spring中的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>,下面将介绍一些常用的属性:

  1. id:Bean的唯一标识符,相当于实例名
  2. name:与id属性效果一致。利于Spring容器中对Bean配置
  3. class:指定Bean的具体实现类,完整类名。
  4. scope:设置Bean实例的作用域
  5. constructor-arg:子元素。用来设置构造器注入。index属性指定构造参数的序号(0开始),type属性指定参数类型,ref或value指定值。
  6. property:子元素。调用setter方法注入。name指定属性,value指定值。ref类似value,另外可以指定Spring容器的Bean。
  7. ref:指定Bean中某个实例的引用
  8. value:指定值
  9. list:用于封装List或数组的依赖注入
  10. set:用于封装Set类型的依赖注入
  11. map:用于封装Map类型的依赖注入
  12. entry:Map元素的子元素,设置键值对

Bean的实例化

在Spring容器中实例化Bean有三种方式:构造器实例化、静态工厂实例化、实例工厂实例化。最常用的就是构造器实例化

构造器实例化

Spring容器通过Bean对应类中的默认无参构造方法来实例化Bean。例如:

  1. 创建一个Bean1类
    在这里插入图片描述
  2. 配置applicationContext.xml文件
    在这里插入图片描述
  3. 创建测试类
    在这里插入图片描述

静态工厂实例化

static factory实例化,创建一个工具类,里面包含了一个静态方法,专门用new来实例化对象。然后在配置文件中,创建Bean的实例时,添加一个factory-method属性。用于指定工具类中的方法。例如:

  1. 创建一个工具类
    在这里插入图片描述
  2. 配置文件
    在这里插入图片描述
  3. 测试类
    在这里插入图片描述

实例工厂实例化

实例化工厂实例化,大致思路和static factory实例化方式一致,创建的不再时静态方法,而是实例方法。然后,在配置文件中创建Bean的实例。最后,在创建一个Bean 添加属性factory-bean指定上述创建的Bean实例,其次添加属性factory-method指定执行Bean中的哪个方法。例如:

  1. 创建工具类
    在这里插入图片描述
  2. 配置文件
    在这里插入图片描述
  3. 测试类
    在这里插入图片描述

Bean的作用域

Bean的作用域说明配置文件中创建Bean的实例作用范围,以及是否会创建多个相同的实例。有如下7中作用域,其中singleton和prototype为常用类型

  1. singleton(单例):默认作用域。无论有多少个Bean引用它,始终指向同一个对象。
  2. prototype(原型):每次获取Bean,都会创建一个新的Bean实例
  3. request:同一个HTTP请求中,容器会返回Bean的同一个实例。不同的HTTP请求中,容器会产生一个新的Bean。且Bean仅在当前请求中有效
  4. session:同一个HTTP Session中,容器会返回Bean的同一个实例。不同的HTTP Session中,容器会产生一个新的Bean。且Bean仅在HTTP Session中有效
  5. globalSession:在一个全局HTTP Session中,返回同一个实例。仅在portlet上下文时有效
  6. application:为每个ServletContext对象创建一个实例。仅在Web相关的ApplicationContext中生效。
  7. websocket:为每个websocket对象创建一个实例。仅在Web相关的ApplicationContext中生效。

singleton作用域

默认作用域。singleton作用域对于无会话状态的Bean(如Dao组件、Service组件)来说,是不错的选择。

  1. 工具类
    在这里插入图片描述
  2. 配置文件
    在这里插入图片描述
  3. 测试类
    在这里插入图片描述

prototype作用域

对需要保持会话状态的Bean,应该使用prototype作用域。每请求一个Bean都会创建一个新的实例。使用方法类似上文,不再赘述。

Bean的生命周期

Spring容器可以管理singleton作用域的Bean的生命周期,Spring容器可以知道Bean何时被创建、初始化及销毁。对于prototype作用域的Bean,Spring容器只管创建实例。下面将介绍Bean的生命周期:

  1. 根据配置信息调用Bean构造方法或工厂方法实例化Bean
  2. 利用依赖注入完成属性注入
  3. 如果Bean实现了BeanNameAware接口,则Spring调用Bean的setBeanName()方法传入当前Bean的id值。
  4. 如果Bean实现了BeanFactoryAware接口,则Spring调用Bean的setBeanFactory()方法传入当前工厂实例的引用。
  5. 如果Bean实现了ApplicationContextAware接口,则Spring调用Bean的setApplicationContext()方法传入当前ApplicationContext实例的引用。
  6. 如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法postProcessBeforeInitialzation()对Bean进行加工操作。Spring的AOP操作就是用它是实现的
  7. 如果Bean实现了InitializingBean接口,则Spring调用Bean的afterPropertiesSet()方法
  8. 如果在配置文件中通过init-method属性指定了初始化方法,则调用该初始化方法
  9. 如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法postProcessAfterInitialization()。此时Bean已经可以被应用系统所使用
  10. 如果在< bean>中指定作用域scope=“singleton”,则将该Bean放入Spring IoC缓存中,同时触发对Bean的生命周期管理。若作用域为prototype,则由调用者管理该Bean的生命周期。
  11. 如果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装配的练习

  1. 创建用户类
    在这里插入图片描述
  2. 配置文件
    在这里插入图片描述
  3. 创建测试类
    在这里插入图片描述

基于Annotation装配

Spring Annotation装配分为两类注解:1、对Bean的注解,即< bean id="" class="*"/>,完成实例化注解。2、对属性的注解,即< property name="" value=""/>,完成依赖注入。

  1. @Component

可以使用此注解描述Spring中的Bean,可以用在任何层次。但为了更清晰直观的表达在哪一个层次上的注解。细分以下几种

  • @Repository

专门用作数据访问层(DAO层)注解,效果与@Component一致

  • @Service

专门用作业务层(Service层)注解,效果与@Component一致

  • @Controller

专门用作控制层(Controller层)注解,效果与@Component一致。

  1. @Autowired

用于对属性的注入。默认按照Bean的类型进行装配。

  • @Resource

默认按照Bean的实例名完成进行装配。name指定实例名,type指定Bean类名。

  • @Qualifier

与@Autowired配合使用,将默认按照Bean类名装配修改为按实例名装配。Bean的实例名由@Qualifier注解的参数指定。

基于Annotation装配的练习

  1. @Repository注解类
    在这里插入图片描述
  2. @Service、@Resource注解类
    在这里插入图片描述
  3. @Controller注解类
    在这里插入图片描述
  4. 配置文件
    在这里插入图片描述
  5. 测试类
    在这里插入图片描述

上文中,配置文件中还需额外配置Bean的实例,比较麻烦。使用如下,即可配置Spring自动扫描指定路径下的Bean类
在这里插入图片描述
在这里插入图片描述

基于自动装配

可以通过设置< bean>元素中autowirte属性自动完成注入。
autowirte属性有如下几个值:

  1. default:由< bean>元素的上级标签< beans>的default-autowirte属性值确定
  2. byName:根据属性名自动装配
  3. byType:根据数据类型自动装配
  4. constructor:根据构造函数参数的数据类型,自动装配
  5. no:不使用自动装配。
	<!--上述通用语句不再赘述-->
	<bean id="userDao" class="********"/>
	<bean id="userService" class="******"
		autowire="byName"/>
	<!--autowire意思就是,如果UserService类某个属性的名字和配置文件中设置< bean>的实例名相同,则自动注入-->

@syl 2021/07/20 周二 16:50 晴 31°

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值