Bootstrap

Spring源码-可刷新和不可刷新的ApplicationContext详解

目录

1.ClassPathXmlApplicationContext 是可刷新的

步骤1:在ClassPathXmlApplicationContext的refresh()方法之前不修改spring.xml文件

​步骤2:在ClassPathXmlApplicationContext的refresh()方法之修改spring.xml文件

2.AnnotationConfigApplicationContext是不可以刷新的

2.1下AnnotationConfigApplicationContext的使用

3.AnnotationConfigWebApplicationContext(集成了config的作用,也能读取配置文件的内容)


1.ClassPathXmlApplicationContext 是可刷新的

spring容器的refresh()方法:刷新重启spring容器,然后去重新读取配置文件spring.xml的内容

 

步骤1:在ClassPathXmlApplicationContext的refresh()方法之前不修改spring.xml文件

 如下:

 SpringTestApplicationTests类
package com.wd;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@SpringBootTest
class SpringTestApplicationTests {

    @Test
    void contextLoads() {
    }

    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        Object user = applicationContext.getBean("user");
        System.out.printf(user.toString());

        applicationContext.refresh();
        Object user1 = applicationContext.getBean("user");
        System.out.printf(user1.toString());

    }

}

spring.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="user" class="com.wd.model.User">
        <!-- set注入 -->
    </bean>

<!--    <bean id="user01" class="com.wd.model.User">-->
<!--        &lt;!&ndash; set注入 &ndash;&gt;-->
<!--    </bean>-->


</beans>

1.1先从ClassPathXmlApplicationContext 中获取user,是能获取到的,

1.2debug模式到ClassPathXmlApplicationContext的 refresh()刷新方法(此处先不剖析Spring源码的refresh()方法),然后再从容器中获取user,仍然是可以获取到的。


步骤2:在ClassPathXmlApplicationContext的refresh()方法之修改spring.xml文件

2.1先从ClassPathXmlApplicationContext 中获取user,是能获取到的,

 

2.2debug模式到ClassPathXmlApplicationContext的 refresh()刷新方法之前,先去修改spring.xml文件(将user注释掉 ) 

 

结果依然可以获取到user,为什么?

原因:因为我改的是.java文件,我应该是改的是target里面编译的.class文件,于是我就重新跑一边,去修改执行在执行reflesh()方法之前去修改编译后的文件

 再去容器中获取bean的时候就报错了,容器中没有该bean对象。

 结论:

        ClassPathXmlApplicationContext.refresh()方法能够去刷新容器,修改配置文件后,容器重新去读取配置文件的内容,然后再将最新的配置文件的内容加载到容器中。

2.AnnotationConfigApplicationContext是不可以刷新的

结论:AnnotationConfigApplicationContext是不支持reflesh()方法:

2.1下AnnotationConfigApplicationContext的使用

学习借鉴地址:

spring注解开发AnnotationConfigApplicationContext的使用

配置类Config:
package com.wd.config;

import com.wd.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {

    @Bean(name = "user")
    public User user(){
        User user = new User();
        return user;
    }
}
SpringTestApplicationTests类:
package com.wd;

import com.wd.config.Config;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@SpringBootTest
class SpringTestApplicationTests {

    @Test
    void contextLoads() {
    }

    public static void main(String[] args) {
//        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        AnnotationConfigApplicationContext annotation = new AnnotationConfigApplicationContext(Config.class);
        Object user = annotation.getBean("user");
        System.out.printf(user.toString());

        annotation.refresh();// 刷新容器,然后去重新读取配置文件spring.xml的内容
        Object user1 = annotation.getBean("user");
        System.out.printf(user1.toString());

    }

}

Config类里面定义的user是能够获取到的

3.AnnotationConfigWebApplicationContext(集成了config的作用,也能读取配置文件的内容)

        AnnotationConfigWebApplicationContext 可以像AnnotationConfigApplicationContext读取配置类的方式,也可以像ClassPathXmlApplicationContext读取配置文件的方式

;