Spring容器-BeanFactory和ApplicationContext使用详解
作者:郝学胜 发布时间:2022-03-20 07:02:45
将BeanFactory和ApplicationContext作为容器使用
在Spring中,BeanFactory和ApplicationContext是容器的两种实现方式,可以使用它们来管理对象的生命周期以及实现依赖注入等功能。下面我们来分别演示一下BeanFactory和ApplicationContext子类的使用方式。
BeanFactory容器
BeanFactory是Spring容器中最基本的接口,它提供了定义和管理bean的基本方式。使用BeanFactory容器的步骤如下:
1.定义一个Bean对象
public class HelloBean {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void sayHello() {
System.out.println("Hello " + message);
}
}
2.在Spring的配置文件中声明一个bean对象
<beans>
<bean id="helloBean" class="com.example.HelloBean">
<property name="message" value="World" />
</bean>
</beans>
3.使用BeanFactory容器获取bean对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
HelloBean helloBean = (HelloBean) beanFactory.getBean("helloBean");
helloBean.sayHello();
ApplicationContext容器
ApplicationContext是BeanFactory的子接口,它是Spring容器的另一种实现方式。和BeanFactory容器相比,ApplicationContext容器提供了更加丰富的功能,例如国际化支持、事件发布、资源管理等。使用ApplicationContext容器的步骤如下: 1.定义一个Bean对象
public class HelloBean {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void sayHello() {
System.out.println("Hello " + message);
}
}
2.在Spring的配置文件中声明一个bean对象
<beans>
<bean id="helloBean" class="com.example.HelloBean">
<property name="message" value="World" />
</bean>
</beans>
3.使用ApplicationContext容器获取bean对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
HelloBean helloBean = (HelloBean) applicationContext.getBean("helloBean");
helloBean.sayHello();
Spring内嵌Web容器的过程
在Spring中,ApplicationContext容器有多个子类,其中包括了用于WEB开发的子类。这些子类可以直接启动Tomcat、Jetty等Web容器,使得我们可以在不使用第三方Web容器的情况下,直接在Spring应用内启动Web应用。下面以SpringBoot的Web容器启动为例,来说明ApplicationContext子类的具体源代码实现过程。 我们先来看一下SpringBoot的启动类:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在这个启动类中,我们使用了SpringBoot提供的@SpringBootApplication注解。这个注解是一个组合注解,包含了多个其他注解,其中一个注解就是@Import({ ServletWebServerFactoryAutoConfiguration.class, WebMvcAutoConfiguration.class })。这个注解的作用是向Spring容器中注册两个自动配置类:ServletWebServerFactoryAutoConfiguration和WebMvcAutoConfiguration。
接着我们来看一下ServletWebServerFactoryAutoConfiguration这个类:
@Configuration(proxyBeanMethods = false)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(Servlet.class)
@ConditionalOnMissingBean(value = { ServletWebServerFactory.class, WebServerFactoryCustomizerBeanPostProcessor.class })
public class ServletWebServerFactoryAutoConfiguration {
@Bean
public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(
ObjectProvider<WebServerFactoryCustomizerBeanPostProcessor> webServerFactoryCustomizerBeanPostProcessor) {
return new ServletWebServerFactoryCustomizer(
webServerFactoryCustomizerBeanPostProcessor.getIfAvailable(Collections::emptyList));
}
@Bean
@ConditionalOnMissingBean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(
ObjectProvider<TomcatConnectorCustomizer> connectorCustomizers,
ObjectProvider<TomcatContextCustomizer> contextCustomizers, Environment environment) {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setEnvironment(environment);
factory.setTomcatConnectorCustomizers(connectorCustomizers.orderedStream().collect(Collectors.toList()));
factory.setTomcatContextCustomizers(contextCustomizers.orderedStream().collect(Collectors.toList()));
return factory;
}
}
可以看到,这个类标记为@Configuration注解,表示它是一个配置类。这个类提供了TomcatServletWebServerFactory这个bean定义,它利用Tomcat作为Web容器。这个类还提供了一个servletWebServerFactoryCustomizer的bean定义,它会在Web容器启动前对Web容器进行自定义的配置。
除了ServletWebServerFactoryAutoConfiguration之外,还有一些其他的自动配置类。例如:
HttpEncodingAutoConfiguration:自动配置请求和响应的编码过滤器。
DispatcherServletAutoConfiguration:自动配置一个DispatcherServlet,它用于处理Web请求。
在SpringBoot启动时,会将这些自动配置类都加载到Spring容器中。最终,我们就可以使用ApplicationContext容器来获取Web容器实例,代码如下:
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
int port = environment.getProperty("server.port", Integer.class, 8080);
return factory -> {
factory.setPort(port);
};
}
@Bean
public ServletWebServerFactory servletContainer() {
return applicationContext.getBean(ServletWebServerFactory.class);
}
可以看到,这个代码中直接调用了ApplicationContext容器的getBean方法,来获取ServletWebServerFactory这个bean实例。
来源:https://juejin.cn/post/7225083372435357752


猜你喜欢
- 这一篇文章介绍SpringBoot应用修改默认打jar形式部署为打war包形式,部署到外部Tomcat。SpringBoot应用默认打包成为
- 目录概述LRU 的原理LRU 算法的实现LRU 算法描述LRU 算法代码实现方法一方法二方法三总结概述LRU 算法全称为 Least Rec
- 一、题目描述题目实现:网络资源的断点续传功能。二、解题思路获取要下载的资源网址显示网络资源的大小上次读取到的字节位置以及未读取的字节数输入下
- 一、项目背景1、介绍:最近在springboot项目中需要做一个阿里云OSS图片上传功能点,将OSS图片上传代码提取到公共工具类中,为了方便
- 文章描述这个效果可能很多人都在抖音看到过,即把一个短视频,转成数字、字母等乱码组成的形式进行播放。开发环境.NET Framework版本:
- 关于Android 6.0Android老版本网络请求:1,HttpUrlConnection2,Apache Http ClientAnd
- 开发环境 android studio 3.0.1 已支持 kotlin1、定义接口interface CallBack{ fun call
- springboot读取配置文件到静态工具类通常我们读取配置文件可以用@Value注解和@Configuration,@Configurat
- protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类
- 基础部分1. FastJson 简介Fastjson是一个Java库,可用于将Java对象转换为JSON表示。它也可以被用来将一个JSON字
- 对于因为编程错误而导致的异常,或者是不能期望程序捕获的
- Csv文件基本的属性csv文件可以在excel或者wps中以表格形式打开,本质上是每一列以,逗号为分隔符的一种格式,在C#中操作可以把他当做
- Android手机震动抖动效果的实现(1)布局文件如下<RelativeLayout xmlns:android="http
- 本文实例讲述了Java擦除和转换。分享给大家供大家参考,具体如下:一 点睛在严格的泛型代码里,带泛型声明的类总应该带着类型参数。
- 封装在如何理解面向对象这篇文章中,提到所谓的封装就是“功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可。”。但你得清楚一点,那就
- 1. JAVA源文件的命名JAVA源文件名必须和源文件中所定义的类的类名相同。2. Package的命名Package名的第一部分应是小写A
- 原来的测试类的注解:@RunWith(SpringRunner.class)@SpringBootTest一直没法自动注入,后来在@Spri
- 一、返回一般数据类型比如要根据 id 属性获得数据库中的某个字段值。mapper 接口:// 根据 id 获得数据库中的 username
- 1、准备工作首先需要有一个用于旋转的图片需要考虑如何开始、结束、加速、减速2、加速减速原理本次的动画采用RotateAnimation,初始
- StringRedisTemplate与RedisTemplate区别点两者的关系是StringRedisTemplate继承RedisTe