目录
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">-->
<!-- <!– set注入 –>-->
<!-- </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读取配置文件的方式