写点什么

spring-bean 的理解

  • 2021 年 11 月 11 日
  • 本文字数:1939 字

    阅读完需:约 6 分钟

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xmlns="http://www.springframework.org/schema/beans"


xsi:schemaLocation="http://www.springframework.org/schema/beans


http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


<bean id="bean1" class="com.Bean1" />


<bean id="bean2" class="com.Bean2" />


</bean>


id:用来指明 bean 的标识符,这个标识符具有唯一性,Spring 对 bean 的管理以及 bean 之间这种依赖关系都需要这个属性


class: 指明该 bean 的具体实现类,这里不能是接口(可以是接口实现类)全路径包名.类名


Bean 在 Spring 容器中两种行为(通过 scope 来设置默认不写为 singelton)


singleton:单实例模式(默认,构造方法为 private),整个 Spring 的容器中只有一个共享实例存在(singleton)


non-singelton:每次请求该 bean,Spring 容器都会新建立一个 bean 实例,然后返回给程序(request,session,prototype)

创建 Bean 步骤

创建 XML 文件—-写入配置信息—生成 Bean 类—-加入 Bean 到配置文件


注入 Bean


-ref 元素进行标识


Ref 元素通常有两个属性:


bean:指定不在同一个 XML 文件中的 bean 的 id


<bean id="test" class="com.pb.test">


<property name="user">


<ref bean="其他的 bean 的 id"/>


</property>


</bean>


</bean>


value 和 ref 的区别:


使用 ref 元素,可以让 Spring 在部署时验证依赖的 Bean 是否真实存在


使用 value 元素,进行指定仅在创建 Bean 实例时做验证,会导致错误的延时出现,而且还会带来额外的类型转制开销


集合注入(了解 list,map, props,set)


<bean id="test" class="com.pb.test">


<property name="lists">


<list>


<value>1</value>


<value>2</value>


<value>3</value>


</list>


</property>


</bean>


<bean id="test" class="com.pb.test">


<property name="map">


<map>


<entry key="key1">


<value>value1</value>


</entry>


<entry key="key2">


<value>key2</value>


</entry>


</map>


</property>


</bean>


<bean id="test" class="com.pb.test">


<property name="props">


<props>


<prop key="key1">value1</prop>


<prop key="key2">value2</prop>


</props>


</property>


</bean>


<bean>


< property name ="interest" >


< set >


< value > 唱歌 </ value >


< value > 跳舞 </ value >


< value > 书法 </ value >


</ set >


</ property >


</bean>

容器中 Bean 的生命周期

Spring 可以管理 singleton 作用域 Bean 的生命周期,Spring 可以精确地知道 singleton 域 bean 何时被创建,何时初始化完成


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


,以及容器何时准备销毁 Bean 实例。因为,对于 singleton 作用域的 Bean,客户端的每次请求都返回同一个 Bean 实例,客户端代码不能控制 Bean 的销毁,它的生命周期都在 Spring 的掌握之中。这么一来,容器就可以管理实例化结束后(某些资源的申请)和销毁之前(进行某些资源的回收)的行为。管理 Bean 的生命周期行为主要有两个时机:注入依赖关系后,销毁实例之前;具体的管理方法如下


Spring 提供两种方式在 Bean 全部属性设置成功后执行特定行为


使用 init-method 属性(代码污染小)


在类中编写一个方法,在属性中指定该方法在依赖关系设置完成后自动执行。


实现 InitializingBean 接口(耦合较高)


编写 afterPropertiesSet()方法的具体实现


同理,若在 Bean 销毁之前,执行特定的方法,只需要①使用 destroy-method 属性②实现 DisposableBean 接口(实现 destroy()方法)


对于 prototype 作用域的 Bean,Spring 容器只负责 Bean 的创建,当容器创建实例完成后,Bean 将完全交给客户端代码管理,容器不再负责其生命周期。每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会产生一个全新的 Bean 实例交个客户端(prototype 就是这么任性),Spring 容器本省也不知道自己创建了多少个实例,更无从知道这些实例什么时候才会被销毁。


Spring 的 Bean 和 JavaBean 比较


  • 规范:Spring 容器对 Bean 没有特殊要求,不像 JavaBean 一样遵循一些规范(为每个属性提供相应的 setter 和 getter 方法),不过对于设值注入的 Bean,一定要提供 setter 方法。

  • 作用:Spring 中的 Bean 是 java 实例,java 组件,它的作用几乎无所不包,任何应用组件都被称为 Bean,而传统的 Java 应用中的 JavaBean 通常作为 DTO(数据传输对象),来封装值对象,在各层之间传递数据。

  • 生命周期:传统的 JavaBean 作为值对象传递,不接受任何容器管理其生命周期,Spring 中的 Bean 有 Spring 管理其生命周期行为。

Spring 的 Bean 继承和 java 继承的区别

Spring 中子 Bean 和父 Bean 可以是不同的类型,而 java 中的继承子类只是父类的一种特殊类型。


Spring 中 Bean 的继承是实例之间的关系,主要表现为参数值的延续,而 java 终的继承是类之间的关系,主要表现为属性,方法的延续。

评论

发布
暂无评论
spring-bean的理解