这里介绍Spring下的SPI机制

基本实践
Spring SPI借鉴了Java SPI的设计思想。其通过spring.factories方式来实现SPI机制。实现在不修改框架源码的前提下提供框架的扩展性。具体地,我们先来定义一个SPI接口
1 2 3 4 5 6 7
   | package com.aaron.application.SpringSpi.BasicSpiDemo;
  public interface Greet {     void hello();
      void bye(); }
   | 
 
然后提供下述3个实现类:CatGreet、DogGreet、PigGreet
1 2 3 4 5 6 7 8 9 10 11 12 13
   | package com.aaron.application.SpringSpi.BasicSpiDemo;
  public class CatGreet implements Greet{     @Override     public void hello() {         System.out.println("<Cat> : Hello...");     }
      @Override     public void bye() {         System.out.println("<Cat> : Bye...");     } }
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13
   | package com.aaron.application.SpringSpi.BasicSpiDemo;
  public class DogGreet implements Greet {     @Override     public void hello() {         System.out.println("<Dog> : Hello...");     }
      @Override     public void bye() {         System.out.println("<Dog> : Bye...");     } }
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13
   | package com.aaron.application.SpringSpi.BasicSpiDemo;
  public class PigGreet implements Greet {     @Override     public void hello() {         System.out.println("<Pig> : Hello...");     }
      @Override     public void bye() {         System.out.println("<Pig> : Bye...");     } }
   | 
 
然后,在src/main/resources/META-INF路径下创建spring.factories文件。按行添加各SPI接口及其下的所有实现类,多个实现类间使用逗号进行分隔;当一行较长时,还可以使用 续行符反斜杠\ 来进行换行。文件内容如下所示
1 2 3 4 5 6 7 8 9
   | 
 
 
 
  com.aaron.application.SpringSpi.BasicSpiDemo.Greet = \     com.aaron.application.SpringSpi.BasicSpiDemo.PigGreet, \     com.aaron.application.SpringSpi.BasicSpiDemo.CatGreet, \     com.aaron.application.SpringSpi.BasicSpiDemo.DogGreet
 
  | 
 

现在我们来测试下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | package com.aaron.application.SpringSpi.BasicSpiDemo;
  import org.springframework.core.io.support.SpringFactoriesLoader; import java.util.List;
  public class SpringSpiBasicTest {     public static void main(String[] args) {         List<Greet> greetList = SpringFactoriesLoader.loadFactories(Greet.class, SpringSpiBasicTest.class.getClassLoader());         for (Greet greet : greetList) {             System.out.println("-----------------------");             greet.hello();             greet.bye();         }     } }
   | 
 
测试结果如下所示,符合预期
