spring 最顶级接口 beanfactory详解

一、简介

1. 什么是BeanFactory

BeanFactory是Spring框架中的一个接口,它是一个工厂类,用来创建和管理Spring中的Bean对象。BeanFactory接口定义了Spring容器的基本规范和行为,它提供了一种机制来将配置文件中定义的Bean实例化、配置和管理起来。

2. BeanFactory的作用

BeanFactory的主要作用是提供Bean的创建、配置、初始化和销毁等基本操作,它可以根据配置文件或注解来创建并管理Bean实例,并提供了各种方法来获取和操作Bean实例。

3. BeanFactory的实现类

BeanFactory接口有多个实现类,其中最常用的是XmlBeanFactory和DefaultListableBeanFactory。XmlBeanFactory是通过XML文件来配置Bean的实例化、配置和管理的,而DefaultListableBeanFactory则是通过Java代码来配置Bean的实例化、配置和管理的。下面我们将详细介绍BeanFactory的使用。

二、BeanFactory的使用

1. BeanFactory的创建

BeanFactory的创建有三种方式:XML配置方式、Java配置方式和注解配置方式。

1)XML配置方式

在使用XML配置方式时,需要在配置文件中定义Bean的实例化、配置和管理信息。下面是一个简单的XML配置文件示例:

<?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.xsd">

    <bean id="userService" class="com.example.UserService">
        <property name="userDao" ref="userDao"/>
    </bean>

    <bean id="userDao" class="com.example.UserDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
       <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

</beans>

在上面的示例中,定义了3个Bean:userService、userDao和dataSource。其中,userService和userDao之间存在依赖关系,userService依赖于userDao,而userDao又依赖于dataSource。

2)Java配置方式

在使用Java配置方式时,需要编写Java代码来定义Bean的实例化、配置和管理信息。下面是一个简单的Java配置类示例:

@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        UserService userService = new UserService();
        userService.setUserDao(userDao());
        return userService;
    }

    @Bean
    public UserDao userDao() {
        UserDao userDao = new UserDaoImpl();
        userDao.setDataSource(dataSource());
        return userDao;
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }

}

在上面的示例中,使用了@Configuration注解来标识该类是一个配置类,并使用@Bean注解来定义Bean的实例化、配置和管理信息。在AppConfig类中,定义了3个Bean:userService、userDao和dataSource。其中,userService和userDao之间存在依赖关系,userService依赖于userDao,而userDao又依赖于dataSource。

3)注解配置方式

在使用注解配置方式时,需要在Bean类上添加相应的注解来标识该类是一个Bean,并进行相应的配置信息。下面是一个简单的注解配置类示例:

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }

}

在上面的示例中,使用了@Configuration注解来标识该类是一个配置类,并使用@ComponentScan注解来指定需要扫描的包。在AppConfig类中,定义了一个Bean:dataSource。在该Bean中,使用了@Bean注解来标识该方法返回一个Bean实例,并进行了相应的配置信息。需要注意的是,在使用注解配置方式时,需要保证被注解标识的类在扫描范围内,否则该类将不会被Spring容器管理。

2. BeanFactory的配置

在BeanFactory的配置中,主要包括Bean的定义、依赖和属性等方面。

1)Bean的定义

在Bean的定义中,主要包括Bean的类型、ID和作用域等方面。下面是一个简单的Bean定义示例:

<bean id="userService" class="com.example.UserService" scope="singleton"/>

在上面的示例中,定义了一个ID为userService,类型为com.example.UserService,作用域为singleton的Bean。

2)Bean的依赖

在Bean的依赖中,主要包括Bean之间的依赖关系和依赖注入方式等方面。下面是一个简单的Bean依赖示例:

<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.example.UserDaoImpl">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

在上面的示例中,userService依赖于userDao,而userDao又依赖于dataSource。在userService中,使用了标签来注入userDao的实例,而在userDao中,同样使用了标签来注入dataSource的实例。

3)Bean的属性

在Bean的属性中,主要包括Bean的各种属性信息,如普通属性、集合属性和引用属性等。下面是一个简单的Bean属性示例:

<bean id="userService" class="com.example.UserService">
    <property name="name" value="John"/>
    <property name="age" value="30"/>
    <property name="hobbies">
        <list>
            <value>reading</value>
            <value>writing</value>
            <value>traveling</value>
        </list>
    </property>
    <property name="userDao" ref="userDao"/>
</bean>

在上面的示例中,定义了一个userService的Bean,并设置了name、age、hobbies和userDao等属性。其中,name和age是普通属性,而hobbies是集合属性,它包含了三个值:reading、writing和traveling。userDao是引用属性,它依赖于另一个Bean实例。

3. BeanFactory的初始化

在BeanFactory的初始化中,主要包括BeanFactoryAware接口、InitializingBean接口和init-method属性等方面。

1)BeanFactoryAware接口

如果一个Bean实现了BeanFactoryAware接口,那么它将能够获取到当前Bean所在的BeanFactory实例。下面是一个简单的BeanFactoryAware接口示例:

public class MyBean implements BeanFactoryAware {

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

}

在上面的示例中,MyBean实现了BeanFactoryAware接口,并重写了setBeanFactory()方法。该方法将传入的BeanFactory实例保存到了类成员变量beanFactory中。

2)InitializingBean接口

如果一个Bean实现了InitializingBean接口,那么它将能够在Bean实例化后、依赖注入后、属性设置后进行一些初始化操作。下面是一个简单的InitializingBean接口示例:

public class MyBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        // do something after bean initialization
    }

}

在上面的示例中,MyBean实现了InitializingBean接口,并重写了afterPropertiesSet()方法。该方法将在Bean实例化、依赖注入和属性设置后被调用,可以在该方法中进行一些初始化操作。

3)init-method属性

如果一个Bean配置了init-method属性,那么在Bean实例化、依赖注入和属性设置后,该方法将被调用来进行一些初始化操作。下面是一个简单的init-method属性示例:

<bean id="myBean" class="com.example.MyBean" init-method="init">

在上面的示例中,定义了一个id为myBean的Bean,并配置了init-method属性为init。在Bean实例化、依赖注入和属性设置后,Spring容器将调用MyBean类中的init()方法进行初始化操作。

4. BeanFactory的销毁

在BeanFactory的销毁中,主要包括DisposableBean接口和destroy-method属性等方面。

1)DisposableBean接口

如果一个Bean实现了DisposableBean接口,那么它将能够在Bean销毁前进行一些操作。下面是一个简单的DisposableBean接口示例:

public class MyBean implements DisposableBean {

    @Override
    public void destroy() throws Exception {
        // do something before bean destruction
    }

}

在上面的示例中,MyBean实现了DisposableBean接口,并重写了destroy()方法。该方法将在Bean销毁前被调用,可以在该方法中进行一些清理操作。

2)destroy-method属性

如果一个Bean配置了destroy-method属性,那么在Bean销毁前,该方法将被调用来进行一些清理操作。下面是一个简单的destroy-method属性示例:

<bean id="myBean" class="com.example.MyBean" destroy-method="cleanup">

在上面的示例中,定义了一个id为myBean的Bean,并配置了destroy-method属性为cleanup。在Bean销毁前,Spring容器将调用MyBean类中的cleanup()方法进行清理操作。

三、BeanFactory的扩展

1. BeanFactoryPostProcessor

BeanFactoryPostProcessor是BeanFactory的扩展点之一,它允许在BeanFactory实例化、配置和初始化Bean之前对BeanFactory进行一些修改。下面是一个简单的BeanFactoryPostProcessor示例:

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // do something to modify the beanFactory
    }

}

在上面的示例中,定义了一个MyBeanFactoryPostProcessor类,它实现了BeanFactoryPostProcessor接口,并重写了postProcessBeanFactory()方法。在该方法中,可以对传入的beanFactory进行一些修改操作。

2. BeanPostProcessor

BeanPostProcessor是BeanFactory的扩展点之一,它允许在Bean实例化、依赖注入和属性设置之后对Bean进行一些修改。下面是一个简单的BeanPostProcessor示例:

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // do something before bean initialization
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // do something after bean initialization
        return bean;
    }

}

在上面的示例中,定义了一个MyBeanPostProcessor类,它实现了BeanPostProcessor接口,并重写了postProcessBeforeInitialization()和postProcessAfterInitialization()方法。在这两个方法中,分别可以在Bean实例化、依赖注入和属性设置之前和之后对Bean进行一些修改操作。

四、总结

本文从BeanFactory的简介、使用、扩展以及扩展点等方面介绍了BeanFactory的相关知识点。BeanFactory作为Spring框架中的一个核心组件,可以提供Bean的创建、配置、初始化和销毁等基本操作,同时还提供了多种扩展机制,使得开发人员可以通过BeanFactory对Spring框架进行灵活的扩展和定制。

 

HTML 8377 字节 378 单词 214 行

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值