徐州网站开发信息百度收录的网站多久更新一次
Bean是什么
Bean 是指 Java 中的可重用软件组件,容器会根据提供的元数据来创建和管理这些 Bean,也包括它们之间的依赖关系。Spring 容器对 Bean 并没有太多的要求,无须实现特定接口或依赖特定库,只要是最普通的 Java 对象即可,这类对象也被称为 POJO(Plain Old Java Object)。
JavaBeans 是 Java 中一种特殊的类,可以将多个对象封装到一个对象(Bean)中。特点是可序列化,提供无参构造器,提供 Getter 方法和 Setter 方法访问对象的属性。 一个 Bean 的定义中,会包含如下部分,
- Bean 的名称,一般是 Bean 的 id,也可以为 Bean 指定别名(alias);
- Bean 的具体类信息,这是一个全限定类名;
- Bean 的作用域,是单例(singleton)还是原型(prototype);
- 依赖注入相关信息,构造方法参数、属性以及自动织入(autowire)方式;
- 创建销毁相关信息,懒加载模式、初始化回调方法与销毁回调方法。
Bean 的依赖关系
依赖注入,Spring 容器管理依赖就是管理 Bean 之间的依赖。
两种基本注入方式
1. 基于构造方法的注入,是通过构造方法来注入依赖。对应的 XML 配置文件需要使用 <constructor-arg/> 传入构造方法所需的内容。<constructor-arg/> 的可配置属性如下,
属性
作用
value
要传给构造方法参数的值
ref
要传给构造方法参数的 Bean ID
type
构造方法参数对应的类型
index
构造方法参数对应的位置,从 0 开始计算
name
构造方法参数对应的名称
2. 基于 Setter 方法的注入,是通过 Bean 的 Setter 方法来注入依赖。
用代码实现两种注入方式,如下,
public class Hello { private String name; public Hello(String name) { this.name = name; } public String hello() { return "Hello World! by " + name; } }// 通过构造方法配置 Bean // 使用 <constructor-arg/> 传入构造方法所需的内容 // <constructor-arg> 中有不少属性可以配置 <?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="hello" class="learning.spring.helloworld.Hello"> <constructor-arg value="Spring"/> </bean> </beans>// 通过 Setter 方法配置 Bean // <property/> 中的 value 属性是直接注入的值,用 ref 属性则可注入其他 Bean <bean id="..." class="..."> <property name="xxx"> <!-- 直接定义一个内部的Bean --> <bean class="..."/> </property> <property name="yyy"> <!-- 定义依赖的Bean --> <ref bean="..."/> </property> <property name="zzz"> <!-- 定义一个列表 --> <list> <value>aaa</value> <value>bbb</value> </list> </property> </bean>
自动织入(autowire)
手动配置依赖在 Bean 少时还能接受,当 Bean 的数量变多后,这种配置就会变得非常繁琐。让 Spring 容器替我们自动进行依赖注入,这种机制就叫自动织入。自动织入有几种模式,如下,
名称 | 说明 |
no | 不进行自动织入 |
byName | 根据属性名查找对应的 Bean 进行自动织入 |
byType | 根据属性类型查找对应的 Bean 进行自动织入 |
constructor | 同 byType,但用于构造方法注入 |
在 <bean/> 中可以通过 autowire 属性来设置使用何种自动织入方式,也可以在 <beans/> 中设置 default-autowire 属性指定默认的自动织入方式,Spring Framework 2.0也可以直接使用@Autowired注解。
自动织入时需要注意以下事项,
- 开启自动织入后,仍可以手动设置依赖,手动设置的依赖优先级高于自动织入;
- 自动织入无法注入基本类型和字符串;
- 对于集合类型的属性,自动织入会把上下文里找到的 Bean 都放进去,但如果属性不是集合类型,有多个候选 Bean 就会有问题。
为了避免第三点问题,可以将 <bean/> 的 autowire-candidate 属性设置为 false,也可以在期望的候选 Bean 的 <bean/> 中将 primary 设置为 true,这表明在多个候选 Bean 中该 Bean 是主要的(如果使用基于 Java 类的配置方式,我们可以通过选择 @Primary 注解实现一样的功能)。
指定 Bean 的初始化顺序
Spring 容器会根据依赖情况自动调整 Bean 的初始化顺序。有时 Bean 之间的依赖并不明显,容器可能无法按预期初始化,这时可以自己指定 Bean 的依赖顺序。<bean/> 的 depends-on 属性可以指定当前 Bean 还要依赖哪些 Bean(基于 Java 类的配置方式支持 @DependsOn 注解实现一样的功能)。
Bean 的三种配置方式
Spring 容器的元数据配置本质上就是配置 Bean(AOP 和事务的配置背后也是配置各种 Bean),Bean的配置姿势就显得比较重要了。
Spring Framework 提供了不同风格的配置方式,这几种方式没有明确的优劣之分,很多时候也可以混合使用。
1. 早期仅支持 XML 配置方式;
2. Spring Framework 2.0 引入了基于注解的配置方式;
3. Spring Framework 3.0 又增加了基于 Java 类的配置方式。
基于 XML 文件的配置
Spring Framework 提供了 <beans/> Schema 配置 Bean,需要配合使用 ApplicationContext 类把 Bean 配置注入到容器中。
基于注解的配置
Spring Framework 2.0 引入了 @Required 注解,Spring Framework 2.5 又引入了 @Autowi