1. public class AppTest {
  2. @Test
  3. public void test01(){
  4. //使用spring容器创建对象
  5. //1.指定spring配置文件的名称
  6. String config = "beans.xml";
  7. //2.创建表示spring容器的对象.这个对象叫做ApplicationContext
  8. //ApplicationContext就表示spring容器,通过容器对象就能使用对象了
  9. ApplicationContext
  10. }
  11. }
  1. public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
  2. MessageSource, ApplicationEventPublisher, ResourcePatternResolver {...}

所以ApplicationContext是一个接口,就是因为是一个接口,所以要有一个实现类

Ctrl+H查看结构

  1. ApplicationContext(interface)
  2. |_ConfigurableApplicationContext(interface)
  3. |__AbstractApplicationContext(abstract class)
  4. |___AbstractRefreshableApplicationContext(abstract class)
  5. |____AbstractXmlApplicationContext(abstract class)
  6. |_____FileSystemXnlApplicationContext(class)(配置文件放在其他盘中的配置文件,可以用这个)
  7. |_____ClassPathXmlApplicationContext(class)(开发中主要用这个)
  8. |___GenericApplicationContext(class)
  9. |____GenericXmlApplicationContext(class)
  10. |____StaticApplicationContext(class)
  11. |____GenericGroovyApplicationContext(class)
  12. |____AnnotationApplicationContext(class)

所以上面的代码继续写是

public class AppTest {
    @Test
    public void test01(){
        //使用spring容器创建对象
        //1.指定spring配置文件的名称
        String config = "beans.xml";
        //2.创建表示spring容器的对象.这个对象叫做ApplicationContext
        //ApplicationContext就表示spring容器,通过容器对象就能使用对象了
        //ClassPathApplicationContext: 表示从类路径中去加载spring的配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);


    }

项目编译一遍后,会生成**target/classes**

所以说**ClassPathApplicationContext**这个类是从**target/classes**路径下面开始加载配置文件

**ClassPathApplicationContext****target/classes**下读取到名为**beans.xml**文件,读到里面的内容就创建对象

我们的**DI**就是做这件事,通过**spring.xml**的名字拿到对象为你所用

**\.m2\repository(本地仓库)\org\springframework\spring-context\5.3.16**,会发现我本地仓库有这个**spring-context.jar**

指定你本地仓库的目录:**...\apache-maven-3.8.4\conf\setting.xml**中的

spring的创建和执行的过程

//使用spring容器创建对象
//1.指定spring配置文件的名称
String config = "beans.xml";
//2.创建表示spring容器的对象.这个对象叫做ApplicationContext
//ApplicationContext就表示spring容器,通过容器对象就能使用对象了
//ClassPathApplicationContext: 表示从类路径中去加载spring的配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);

//从容器中获取某个对象,你要调用对象的方法
//applicationContext.getBean(String s(配置文件中的bean的id值)):最常用的重载方式
SomeService service = (SomeService) applicationContext.getBean("someService");

//使用spring创建好的对象
service.doSome();

读取文件,从文件的从上到下读取

<?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">
    <!--告诉spring创建对象
    声明bean,就是告诉spring要创建某个类的对象
    id:对象的自定义名称,唯一值。spring通过这个名称找到对象
    class: 类的全限定名称(不是接口,因为spring是反射机制,反射机制创建对象,必须使用类)
    spring就完成 SomeService someService = new SomeServiceImpl();
    spring把创建好的对象放入了map中,spring框架中会有一个map存放对象的。
    springMap.put(id的值,对象);
    例如:  springMap.put("someService",new SomeServiceImpl());

    一个bean标签声明一个对象
    -->
    <bean id="someService" class="org.chentianyu.impl.SomeServiceImpl" />
</beans>

执行到<bean id="someService" class="org.chentianyu.impl.SomeServiceImpl" />语句的时候,你的spring就会完成spring的创建工作,通过反射机制获取构造方法创建对象,并把这个对象放到Map之中。

所以是在**ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);**文件时创建的