public class AppTest {@Testpublic void test01(){//使用spring容器创建对象//1.指定spring配置文件的名称String config = "beans.xml";//2.创建表示spring容器的对象.这个对象叫做ApplicationContext//ApplicationContext就表示spring容器,通过容器对象就能使用对象了ApplicationContext}}
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {...}
所以ApplicationContext是一个接口,就是因为是一个接口,所以要有一个实现类
Ctrl+H查看结构
ApplicationContext(interface)|_ConfigurableApplicationContext(interface)|__AbstractApplicationContext(abstract class)|___AbstractRefreshableApplicationContext(abstract class)|____AbstractXmlApplicationContext(abstract class)|_____FileSystemXnlApplicationContext(class)(配置文件放在其他盘中的配置文件,可以用这个)|_____ClassPathXmlApplicationContext(class)(开发中主要用这个)|___GenericApplicationContext(class)|____GenericXmlApplicationContext(class)|____StaticApplicationContext(class)|____GenericGroovyApplicationContext(class)|____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);**文件时创建的
