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

Spring源码-可刷新和不可刷新的ApplicationContext详解,第1张

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配置文件



    
        
    






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读取配置文件的方式

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5718138.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存