• Java开发学习(九)IOC之核心容器


    这里所说的核心容器,大家可以把它简单的理解为ApplicationContext,前面虽然已经用到过,但是并没有系统的介绍过,接下来咱们从以下几个问题入手来下容器的相关知识:

    • 如何创建容器?

    • 创建好容器后,如何从容器中获取bean对象?

    • 容器类的层次结构是什么?

    • BeanFactory是什么?

    一、环境准备

    在解决上述问题之前,先来准备下环境:

    • 创建一个Maven项目

    • pom.xml添加Spring的依赖

      <dependencies>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
              <version>5.2.10.RELEASE</version>
          </dependency>
      </dependencies>
    • resources下添加applicationContext.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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
      </beans>
    • 添加BookDao和BookDaoImpl类

      public interface BookDao {
          public void save();
      }
      public class BookDaoImpl implements BookDao {
          public void save() {
              System.out.println("book dao save ..." );
          }
      }
    • 创建运行类App

      public class App {
          public static void main(String[] args) {
              ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
              BookDao bookDao = (BookDao) ctx.getBean("bookDao");
              bookDao.save();
          }
      }

    最终创建好的项目结构如下:

    二、容器

    2.1 容器的创建方式

    案例中创建ApplicationContext的方式为:

    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

    这种方式翻译为:类路径下的XML配置文件

    除了上面这种方式,Spring还提供了另外一种创建方式为:

    ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");

    这种方式翻译为:文件系统下的XML配置文件

    使用这种方式,运行,会出现如下错误:

    从错误信息中能发现,这种方式是从项目路径下开始查找applicationContext.xml配置文件的,所以需要将其修改为文件具体的路径所在

    说明:大家练习的时候,写自己的具体路径。这种方式虽能实现,但是当项目的位置发生变化后,代码也需要跟着改,耦合度较高,不推荐使用。

    2.2 Bean的三种获取方式

    方式一,就是上面代码中获取的方式:

    BookDao bookDao = (BookDao) ctx.getBean("bookDao");

    这种方式存在的问题是每次获取的时候都需要进行类型转换,有没有更简单的方式呢?

    方式二:

    BookDao bookDao = ctx.getBean("bookDao",BookDao.class);

    这种方式可以解决类型强转问题,但是参数又多加了一个,相对来说没有简化多少。

    方式三:

    BookDao bookDao = ctx.getBean(BookDao.class);

    这种方式就类似我们之前所学习依赖注入中的按类型注入。必须要确保IOC容器中该类型对应的bean对象只能有一个。

    2.3 容器类层次结构

    (1)在IDEA中双击shift,输入BeanFactory,如果没找到的话请勾选Include non-project items选项

    (2)点击进入BeanFactory类,ctrl+h,就能查看到如下结构的层次关系

    从图中可以看出,容器类也是从无到有根据需要一层层叠加上来的。

    2.4 BeanFactory的使用

    使用BeanFactory来创建IOC容器的具体实现方式为:

    public class AppForBeanFactory {
        public static void main(String[] args) {
            Resource resources = new ClassPathResource("applicationContext.xml");
            BeanFactory bf = new XmlBeanFactory(resources);
            BookDao bookDao = bf.getBean(BookDao.class);
            bookDao.save();
        }
    }

    为了更好的看出BeanFactoryApplicationContext之间的区别,在BookDaoImpl添加如下构造函数:

    public class BookDaoImpl implements BookDao {
        public BookDaoImpl() {
            System.out.println("constructor");
        }
        public void save() {
            System.out.println("book dao save ..." );
        }
    }

    如果不去获取bean对象,打印会发现:

    • BeanFactory是延迟加载,只有在获取bean对象的时候才会去创建

    • ApplicationContext是立即加载,容器加载的时候就会创建bean对象

    • ApplicationContext要想成为延迟加载,只需要按照如下方式进行配置

      <?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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"  lazy-init="true"/>
      </beans>

    三、核心容器总结

    3.1 容器相关

    • BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载

    • ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载

    • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能

    • ApplicationContext接口常用初始化类

      • ClassPathXmlApplicationContext(常用)

      • FileSystemXmlApplicationContext

    3.2 bean相关

    其实整个配置中最常用的就两个属性idclass

    3.3 依赖注入相关

     

  • 相关阅读:
    一段asp程序中效率极低的代码,造成连接数据库超时
    古月照今尘
    with C# Code run on Dynamicx AX 2009
    Using X++ Code export to methods list of Class
    Useing X++ code saved as full Screen Resolution Image
    Find out field list(EDT) on a AX Table
    进制转换
    with tableId and fieldname get to the field value on a Common table records
    Set focus on the dialog field
    Label in Dynamics AX 2009
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/16324399.html
Copyright © 2020-2023  润新知