春天 - 应用程序上下文
Spring IoC 容器负责对象的整个生命周期的实例化、接线、配置和管理。 BeanFactory 和 ApplicationContext 代表 Spring IoC Containers。 ApplicationContext 是 BeanFactory 的子接口。 BeanFactory 提供基本功能,推荐用于轻量级应用程序,如移动和小程序。除了企业特定的功能外,ApplicationContext 还提供基本功能,如下所示:
- 通过解析属性文件将事件发布到注册的侦听器。
- 访问应用程序组件的方法。
- 支持国际化。
- 以通用方式加载文件资源。
Note: It is because of these additional features, developers prefer to use ApplicationContext over BeanFactory.
ApplicationContext 实现类
Spring针对不同的需求提供了不同类型的Application容器,下面将在后面与声明一起描述,最后提供一个例子,通过图示帮助完成实现部分。容器如下:
- AnnotationConfigApplicationContext 容器
- AnnotationConfigWebApplicationContext
- XmlWeb应用程序上下文
容器 1: AnnotationConfigApplicationContext
AnnotationConfigApplicationContext 类是在 Spring 3.0 中引入的。它接受与@Configuration,@Component和JSR-330兼容类注释类。 AnnotationConfigApplicationContext 的构造函数接受一个或多个类。例如,在下面的声明中,两个配置类Appconfig 和 AppConfig1作为参数传递给构造函数。当作为参数传递时,在较晚的类中定义的 bean 将覆盖较早的类中的相同类型和名称的 bean。例如,AppConfig 和 AppConfig1 具有相同的 bean 声明。 AppConfig1 中定义的 bean 覆盖 AppConfig 中的 bean。
语法:声明
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class, AppConfig1.class);
Note: Add the following to the properties file in the IDE to allow the spring to override beans.
spring.main.allow-bean-definition-overriding=true
容器 2: AnnotationConfigWebApplicationContext
AnnotationConfigWebApplicationContext 类是在 Spring 3.0 中引入的。它类似于 Web 环境的 AnnotationConfigApplicationContext。它接受用@Configuration、@Component 和 JSR-330 兼容类注释的类。这些类可以通过register() 方法注册 或将基本包传递给scan() 方法。当我们在 web.xml 中配置 ContextLoaderListener servlet 侦听器或 DispatcherServlet 时,可以使用此类。从 Spring 3.1 开始,可以通过实现 WebApplicationInitializer(web.xml 的替代方案)使用Java代码实例化此类并将其注入到 DispatcherServlet。
例子
// Class
// Implementing WebApplicationInitializer
public class MyWebApplicationInitializer implements WebApplicationInitializer {
// Servlet container
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
context.setServletContext(container);
// Servlet configuration
}
}
容器 3: XmlWebApplicationContext
Spring MVC 基于 Web 的应用程序可以完全使用 XML 或Java代码进行配置。配置这个容器类似于 AnnotationConfigWebApplicationContext 容器,这意味着我们可以在 web.xml 或使用Java代码配置它。
// Class
// Implementing WebApplicationInitializer
public class MyXmlWebApplicationInitializer implements WebApplicationInitializer {
// Servlet container
public void onStartup(ServletContext container) throws ServletException {
XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocation("/WEB-INF/spring/applicationContext.xml");
context.setServletContext(container);
// Servlet configuration
}
}
容器 4: FileSystemXmlApplicationContext
FileSystemXmlApplicationContext 用于从文件系统或 URL 加载基于 XML 的 Spring 配置文件。我们可以使用Java代码获取应用程序上下文。它对于独立环境和测试工具很有用。以下代码显示了如何创建容器并使用 XML 作为元数据信息来加载 bean。
插图:
String path = "Documents/demoProject/src/main/resources/applicationcontext/student-bean-config.xml";
ApplicationContext context = new FileSystemXmlApplicationContext(path);
AccountService accountService = context.getBean("studentService", StudentService.class);
容器 5: ClassPathXmlApplicationContext
FileSystemXmlApplicationContext 用于从类路径加载基于 XML 的 Spring 配置文件。我们可以使用Java代码获取应用程序上下文。它对于独立环境和测试工具很有用。以下代码显示了如何创建容器并使用 XML 作为元数据信息来加载 bean。
插图:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/student-bean-config.xml");
StudentService studentService = context.getBean("studentService", StudentService.class);
现在,让我们实现相同的展示示例,如下所示:
执行:
- 使用 Spring Initializer 创建一个 Spring 项目。
- 在com.gfg.demo.domain下创建 Student 类
- 相似地, com.gfg.demo.config包下的 AppConfig 类。
- 根处的主应用程序类包含容器的创建。
- 最后,在创建 SpringBoot 项目时,主类中默认提供了SpringApplication.run()方法。
例子
步骤 1:使用 Spring Initializer 创建一个 Spring 项目,如下图所示。
第二步:在com.gfg.demo.domain下创建Student类 和 com.gfg.demo.config包下的AppConfig 类。了AppConfig是包含所有使用Java配置中配置的Java bean的配置类。 Student 类是 POJO 类。
- 第 1 类: AppConfig 类
@Configuration
// Class
public class AppConfig {
@Bean
// Method
public Student student() {
return new Student(1, "Geek");
}
}
- 班级2:学生班
// Class
public class Student {
// member variables
private int id;
private String name;
// Constructor 1
public Student() {}
// Constructor 2
public Student(int id, String name) {
this.id = id;
this.name = name;
}
// Method of this class
// @Override
public String toString() {
return "Student{" + "id=" + id + ", name='" + name + '\'' + '}';
}
}
第 3 步:现在根目录下的 Main Application 类包含容器的创建。
// Class
// @SpringBootApplication
public class DemoApplication {
// Main driver method
public static void main(String[] args) {
// SpringApplication.run(DemoApplication.class, args);
// Creating its object
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Student student = context.getBean(Student.class);
// Print and display
System.out.println(student);
}
}
第四步: SpringBoot项目创建时,主类默认提供了SpringApplication.run()方法。它创建容器,创建 bean,管理这些 bean 的依赖注入和生命周期。 这是使用@SpringBootApplication 注释完成的。
// Main driver method
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
Student student = context.getBean(Student.class);
// Print adn display
System.out.println(student);
}