栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/721833.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号