Spring BeanFactory和ApplicationContext 容器

本文介绍了 Spring IoC 容器的两种类型,即 BeanFactory 容器和 ApplicationContext 容器。BeanFactory 是简单容器,为依赖注入提供支持,采取延迟加载;ApplicationContext 是其子接口,功能更强大,默认不延迟加载。文中还给出了两种容器的代码演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring IoC 容器

Spring 提供了以下两种不同类型的容器。

  • Spring BeanFactory 容器
  • Spring ApplicationContext 容器

Spring 的 BeanFactory 容器

这是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持.
在 Spring 中,有大量对 BeanFactory 接口的实现。其中,最常被使用的是 XmlBeanFactory 类。这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用。
在资源宝贵的移动设备或者基于 applet 的应用当中, BeanFactory 会被优先选择。否则,一般使用的是 ApplicationContext,除非你有更好的理由选择 BeanFactory。

在这里插入图片描述

BeanFactory :这是一个工厂,用于生成任意bean。采取延迟加载,第一次getBean时才会初始化Bean

BeanFactory的代码演示

  • pom文件依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cc.study</groupId>
    <artifactId>spring-study</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <!-- 4个核心(beans、core、context、expression) -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source><!-- spring 3.0需要JDK1.7-->
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
  • BookService
package com.cc.study.di;
public interface BookService {
	public abstract void addBook();
}

  • BookServiceImpl
package com.cc.study.di;
public class BookServiceImpl implements BookService {
	
	// 方式1:之前,接口=实现类
    //	private BookDao bookDao = new BookDaoImpl();
	// 方式2:接口 + setter
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
	}
	@Override
	public void addBook(){
		this.bookDao.addBook();
	}

	public BookServiceImpl(){
		System.out.println("被实例化了");
	}
}

  • 配置文件
<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">
    <!--
    模拟spring执行过程
        创建service实例:BookService bookService = new BookServiceImpl()	IoC  <bean>
        创建dao实例:BookDao bookDao = new BookDaoImpl()			IoC
        将dao设置给service:bookService.setBookDao(bookDao);		DI   <property>

        <property> 用于进行属性注入
            name: bean的属性名,通过setter方法获得
                setBookDao ##> BookDao  ##> bookDao
            ref :另一个bean的id值的引用
     -->

    <!-- 创建service -->
    <bean id="bookServiceId" class="com.cc.study.di.BookServiceImpl">
        <property name="bookDao" ref="bookDaoId"></property>
    </bean>

    <!-- 创建dao实例 -->
    <bean id="bookDaoId" class="com.cc.study.di.BookDaoImpl"></bean>

</beans>
  • 配置文件位置:
    在这里插入图片描述
  • 测试

第一步利用框架提供的 XmlBeanFactory() API 去生成工厂 bean 以及利用 ClassPathResource() API 去加载在路径 CLASSPATH 下可用的 bean 配置文件。XmlBeanFactory() API 负责创建并初始化所有的对象,即在配置文件中提到的 bean。

第二步利用第一步生成的 bean 工厂对象的 getBean() 方法得到所需要的 bean。 这个方法通过配置文件中的 bean ID 来返回一个真正的对象,该对象最后可以用于实际的对象。一旦得到这个对象,你就可以利用这个对象来调用任何方法。

//BeanFactory :这是一个工厂,用于生成任意bean。采取延迟加载,第一次getBean时才会初始化Bean
    @Test
    public void demo(){
        //延迟加载
        //使用BeanFactory  --第一次调用getBean实例化
        String xmlPath = "di.xml";
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(xmlPath));
        System.out.println("配置文件被加载来");
        BookService bookService = (BookService) beanFactory.getBean("bookServiceId");
        bookService.addBook();

    }

在这里插入图片描述

可以看出采取了延迟加载,第一次getBean时才会初始化Bean。

Spring ApplicationContext 容器

ApplicationContext:是BeanFactory的子接口,功能更强大。(国际化处理、事件传递、Bean自动装配、各种不同应用层的Context实现)。当配置文件被加载,就进行对象实例化。

  • ClassPathXmlApplicationContext 用于加载classpath(类路径、src)下的xml
    • 加载xml运行时位置 --> /WEB-INF/classes/…xml
  • FileSystemXmlApplicationContext 用于加载指定盘符下的xml
    • 加载xml运行时位置 --> /WEB-INF/…xml
      通过java web ServletContext.getRealPath() 获得具体盘符

ApplicationContext 的代码演示

@Test
    public void demo(){
       //从spring容器获得
        String xmlPath = "di.xml";
       // ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\Users\\c\\Desktop\\Spring-Learning\\spring-study\\src\\main\\resources\\di.xml");
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        //BookService bookService = (BookService) applicationContext.getBean("bookServiceId");
        //通过这种方式不需要进行强制转换
        System.out.println("配置文件加载");
        BookService bookService = applicationContext.getBean("bookServiceId",BookService.class);
        bookService.addBook();
    }

在这里插入图片描述

可以看出ApplicationContext 默认没有采取延迟加载。

当然可以通过设置lazy-init="true"来设置延迟加载

<bean id="bookServiceId" class="com.cc.study.di.BookServiceImpl" lazy-init="true">
        <property name="bookDao" ref="bookDaoId"></property>
    </bean>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值