码迷,mamicode.com
首页 > 编程语言 > 详细

Spring 梳理 - JavaConfig、SCI、SPI

时间:2018-12-02 22:50:29      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:div   jar   love   ann   mvc   []   解耦   initial   www   

  1. 总结:spring  依据“java的SPI(Service Provider Interface)机制”和“servlet容器的SCI(ServletContainerInitializer)接口”,通过SpringServletContainerInitializer实现spring组件和servlet容器解耦,解耦后,spring组件可以直接使用spring提供的WebApplicationInitializer接口,实现类似SCI功能,通过实现WebApplicationInitializer,可以向servlet容器添加servlet,listener等。实际开发中,不直接使用WebApplicationInitializer,而使用Spring提供的AbstractAnnotationConfigDispatcherServletInitializer(继承了WebApplicationInitializer)
    1. Servlet 3.0 规范和 Spring DispatcherServlet 配置
        在 Servlet 3.0 的环境中,容器会在 classpath 中寻找继承了 javax.servlet.ServletContainerInitializer 接口的类,用它来配置 servlet 容器。
        Spring 提供了一个继承这个接口的类 SpringServletContainerInitializer,在这个类中,它会寻找任何继承了 WebApplicationInitializer 接口的类并用其来配置 servlet 容器。Spring 3.2 提供了一个继承了 WebApplicationInitializer 接口的基类 AbstractAnnotationConfigDispatcherServletInitializer。所以,你的 servlet 配置类只需要继承 AbstractAnnotation-ConfigDispatcherServletInitializer,就会被发现而用于 servlet 容器的配置。
    2. 参考:[Servlet3.0研究之ServletContainerInitializer接口 - 夫礼者的专栏 - CSDN博客: https://blog.csdn.net/lqzkcx3/article/details/78507169]
    3. 参考:[java中的SPI机制 - 司刚军的个人专栏 - CSDN博客: https://blog.csdn.net/sigangjun/article/details/79071850]
    4. 参考:[JavaSPI机制学习笔记 - 琴水玉 - 博客园: http://www.cnblogs.com/lovesqcc/p/5229353.html]
    5. 参考:[Servlet3.0研究之ServletContainerInitializer接口 - 夫礼者的专栏 - CSDN博客: https://blog.csdn.net/lqzkcx3/article/details/78507169]
    6. Service Provider Interface:

      java spi的具体使用如下  :

      当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 

      基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。

      jdk提供服务实现查找的一个工具类:java.util.ServiceLoader

  2. 使用JavaConfig普通web应用(非MVC)
    1. public class App {
          public static void main(String[] args) {
              ApplicationContext context = new AnnotationConfigApplicationContext(
                      AppConfig.class);
              CustomerBo customer = (CustomerBo) context.getBean("customer");
              customer.printMsg("Hello 1");
              SchedulerBo scheduler = (SchedulerBo) context.getBean("scheduler");
              scheduler.printMsg("Hello 2");
          }
      
      }
      
      
      ##############
      
      import org.springframework.context.annotation.Configuration;
      import org.springframework.context.annotation.Import;
      @Configuration
      
      @Import({ CustomerConfig.class, SchedulerConfig.class })
      
      public class AppConfig {
      }
      
      ##############
      
      @Configuration
      public class CustomerConfig {
          @Bean(name="customer")
          public CustomerBo customerBo(){
              return new CustomerBo();
          }
      }
      
      ##############
      public class SchedulerBo {
          public void printMsg(String msg) {
              System.out.println("SchedulerBo : " + msg);
      
          }
      }

       

Spring 梳理 - JavaConfig、SCI、SPI

标签:div   jar   love   ann   mvc   []   解耦   initial   www   

原文地址:https://www.cnblogs.com/jiangtao1218/p/10055209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!