📜  春天 - 应用程序上下文

📅  最后修改于: 2022-05-13 01:54:51.499000             🧑  作者: Mango

春天 - 应用程序上下文

Spring IoC 容器负责对象的整个生命周期的实例化、接线、配置和管理。 BeanFactory 和 ApplicationContext 代表 Spring IoC Containers。 ApplicationContext 是 BeanFactory 的子接口。 BeanFactory 提供基本功能,推荐用于轻量级应用程序,如移动和小程序。除了企业特定的功能外,ApplicationContext 还提供基本功能,如下所示:

  • 通过解析属性文件将事件发布到注册的侦听器。
  • 访问应用程序组件的方法。
  • 支持国际化。
  • 以通用方式加载文件资源。

ApplicationContext 实现类

Spring针对不同的需求提供了不同类型的Application容器,下面将在后面与声明一起描述,最后提供一个例子,通过图示帮助完成实现部分。容器如下:

  1. AnnotationConfigApplicationContext 容器
  2. AnnotationConfigWebApplicationContext
  3. XmlWeb应用程序上下文

容器 1: AnnotationConfigApplicationContext



AnnotationConfigApplicationContext 类是在 Spring 3.0 中引入的。它接受与@Configuration,@ComponentJSR-330兼容类注释类。 AnnotationConfigApplicationContext 的构造函数接受一个或多个类。例如,在下面的声明中,两个配置类Appconfig 和 AppConfig1作为参数传递给构造函数。当作为参数传递时,在较晚的类中定义的 bean 将覆盖较早的类中的相同类型和名称的 bean。例如,AppConfig 和 AppConfig1 具有相同的 bean 声明。 AppConfig1 中定义的 bean 覆盖 AppConfig 中的 bean。

语法:声明

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class, AppConfig1.class);
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);
}