定义 Spring Bcan 的3 种方式分别是:基于XML 的方式配置、基于注解扫播方式配置、基于元数据类的配置。
SpringBean是Spring中最基本的组成单元,Spring 官方文档对 Bean 的解释是这样的:
In Spring, the objects that form the backbone of your application and that are managed by theSpring loC container are called beans. A bean is an object that is instantiated, assembled, and managedby a Spring IoC container.
翻译过来就是:
在Spring中,构成应用程序主并由SpringIoC容器管理的对象被称为Bean。Bean是一个由SpringIoC容器实例化、组装和管理的对象。
从官方定义中,我们可以提取出以下信息
1)Bean 是对象,一个或者多个不限定
2)Bean 托管在Spring 中一个叫作IoC的容器中
3)我们的程序是由一个个 Bean 构成的。
Spring 是通过声明式配置的方式来定义 Bean的,所有创建Bean需要的前置依赖或者参数都通过配置文件先声明,Spring 启动以后会解析这些声明好的配置内容。
式
那么,我们该如何定义Spring 中的 Bean呢?一般来说,Spring Bean的定义配置有3种方法。
1)基于XML的方式配置,这种配置方式主要适用于以下两类场景
(1)Bean 实现类来自第三方类库,比如 DataSource 等。
(2)需要定义命名空间的配置,如 context、aop、mvc等。
举个例子,来看一段代码。
<beans>
<import resource="resource1.xml"/>//导入其他配置文件Bean 的定义
<import resource="resource2,xmI" />
<bean id="userService" class="com.gp.s.UserService" init-method="init" destory-method="destory">
</bean>
<bean id="message”class="java.lang.String">
<constructor-arg index="o" value="test"></constructor-arg>
</bean>
</beans>
这段代码是标准的 Spring 配置内容,首先导入一个叫作 resourcel.xm标准配置文件。然后,导入第二个标准配置文件resource2.xml。接着,定义一个叫作 userService的 Bean,对应的类是 com.gp.s.UserService,并且声明了在userService 实例化之后要用init0方法,在userService 销毁之后调用destory0方法。
2)基于注解扫描的方式配置,这种配置方式主要适用于开发中需要引用的类,如ControleService、Dao等,配置代码如下。
<context:component-scan base-package="com.gp.s">
<!-- 包含的目标类-->
<context:include-filter type="regex” expression="com.gp.s.mall.*"/>
<!-- 排除的目标类-->
<context;exclude-filter type="aspectj"
expression="com.gp.s.mall.*Controller+"/>
</context:component-scan>
在这段配置中,context:component-scan 相当于使用了 Spring 内置的扫描注解的组@ComponentScan ,声明了需要扫描的基础包路 com.gp.s ,把所有com.gp.s.mall 下面的子包全部纳入扫描范围,并且排除了 com.gp.s.mall包面所有以Controller 结尾或者包含 Controller 结尾的类
使用 Spring 容器管理组件的 beanName 规则,默认是类名首字母变小写,可以自己修改。
Spring 主要提供了 4 种内置的注解来声明 Bean。它们分别是
@Controller (声明为控制层组件的Bean)、
@Service (声明为业务逻辑层组件的 Bcan)、
@Repository (声明为数据访间层组件的当对组件的层次难以定位的时候使用
@Component 注解来声明。Bean)
Spring 提供了4个注解,这些注解的作用与XML定义 Bean 的作用一样,都是将组件交给Spring 容器管理。组件的名称默认是类名 (首字母变小写),可以自己修改。
3)基于Java类的配置,这种配置方式主要适用于以下两类场景。
(1)需要通过代码控制对象创建逻辑的场景。
(2)实现零配置,消除XML 配置文件的场景
同样还是举个例子,来看一段代码:
@Configurationpublic
class BeansConfiguration {
@Bean
public Student student(){
Student student = new Student();student.setName("三");
student.setTeacher(teacher());
return student;
}
@Bean
public Teacher teacher(){
Teacher teacher= new Teacher();
teacher.setName("Tom");
return teacher;
}
}
通过分析这段代码,可以了解到使用基于类的配置需要以下步骤。
1)在 BeansConfiguration 类上配置@Configuration 注解,表示将 BeansConfiguration 类定义为Bean的元数据。
2)在方法上使用@Bean 注解,方法名默认就是 Bean 的名称,方法返回值就是 Bean 的实例
3)过AmnolationConfgApplicationContext 或子类来启动 Spring 容器,从而加载这些已声明好的注解配置。
总结一下,定义 Spring Bcan 的3 种方式分别是:基于XML 的方式配置、基于注解扫播方式配置、基于元数据类的配置。
那么Bcan 的配置定义好以后,Spring 又是如何加载这些 Bean 配置并创建 Bean 实例的哪:
Spring 解析这些声明好的配置内容,将这些配置内容都转化为 BeanDefinition 对多BeanDefinilion 中几平保存了配置文件中声明的所有内容,再将 BeanDefinition 保存bcanDcfinitionMap中,以beanName 作为key,以BeanDefinition 对象作为value。之后,Spring容器根据 beanName找到对应的 BeanDefinition,再去选择具体的创建策略。