【Java】Spring Bean有几种配置方式?

2023-12-14 19:35:19

定义 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,再去选择具体的创建策略。

文章来源:https://blog.csdn.net/weixin_63144583/article/details/134998654
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。