ServiceLoader: рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд DI рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдиреЗ рдХрднреА рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реЛрдЧрд╛

рд╕рд▓рд╛рдо, рджреЛрд╕реНрддреЛрдВред рдпрд╣ рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреЛ рдирдП рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЛрд░реНрд╕ рд╕рдореВрд╣ рдореЗрдВ рдкрд╣рд▓рд╛ рдкрд╛рда рд╣реЛрдЧрд╛ред рдпрд╣ рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд╢рди рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ред



рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдХрдИ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ Google Guice рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ OSGi рд╕реЗрд╡рд╛рдУрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдХрдИ рд▓реЛрдЧ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд DI рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рд╡рд╛ 11 рдпрд╛ 12 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛? рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рд╡рд╛ 6 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реИред

ServiceLoader рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдкрдВрдЬреАрдХреГрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ рдмреАрди рдФрд░ рдСрдЯреЛрд╡реЗрдб рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИред рдЖрдЗрдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рд╕рд░реНрд╡рд┐рд╕рд▓реЙрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдФрд░ рд╕рдорд╛рдирддрд╛ рдФрд░ рдЕрдВрддрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред

рд╡рд╕рдВрдд


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╕рдВрдд рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдбреАрдЖрдИ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ:

public interface SimpleService { String echo(String value); } 

рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 import org.springframework.stereotype.Component; @Component public class SimpleServiceImpl implements SimpleService { public String echo(final String value) { return value; } } 

@Component ред рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмреАрди рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдЧрд╛ред

рдФрд░ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧред

 @SpringBootApplication public class SpringExample implements CommandLineRunner { private static final Logger log = LoggerFactory.getLogger(SpringExample.class); @Autowired List<SimpleService> simpleServices; public static void main(String[] args) { SpringApplication.run(SpringExample.class, args); } public void run(final String... strings) throws Exception { for (SimpleService simpleService : simpleServices) { log.info("Echo: " + simpleService.echo(strings[0])); } } } 

SimpleService рдХреЙрдореНрдмреЛ SimpleService рдкрд░ @Autowired рдПрдиреЛрдЯреЗрд╢рди рдиреЛрдЯ рдХрд░реЗрдВред рдПрдиреЛрдЯреЗрд╢рди @SpringBootApplication рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реЗрдо рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ SpringExample рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдП SpringExample ред

ServiceLoader


рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рддреБрд░рдВрдд рд╕реЗрд╡рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ:

 import com.google.auto.service.AutoService; @AutoService(SimpleService.class) public class SimpleServiceImpl implements SimpleService { public String echo(final String value) { return value; } } 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо @AutoService рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг "рд░рдЬрд┐рд╕реНрдЯрд░" рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ javac рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ ( рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ: maven рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП @AutoService рдпреБрдХреНрдд, рдЧреБрдВрдЬрд╛рдЗрд╢ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ - рдкреНрд░рджрд╛рди рдХреА рдЧрдИ) :

META-INF/services/io.github.efenglu.serviceLoader.example.SimpleService

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

io.github.efenglu.serviceLoader.example.SimpleServiceImpl

рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд╕реЗрд╡рд╛ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдФрд░ рдореБрдЦреНрдп рд╡рд░реНрдЧ:

 public class ServiceLoaderExample { public static void main(String [] args) { final ServiceLoader<SimpleService> services = ServiceLoader.load(SimpleService.class); for (SimpleService service : services) { System.out.println("Echo: " + service.echo(args[0])); } } } 

ServiceLoader.load рдкрджреНрдзрддрд┐ рдХреЛ ServiceLoader.load рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ServiceLoader рдЙрджрд╛рд╣рд░рдг рд╕реЗрд╡рд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП Iterable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, for each рд▓реВрдк рдХреЗ for each services рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдХреНрдпрд╛?


рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреА рд╣реИрдВред рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рддреЛ рдХреНрдпреЛрдВ рд╡рд╕рдВрдд рдХреЗ рдмрдЬрд╛рдп ServiceLoader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?

рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ


рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╕рд░рд▓ рд╡рд╕рдВрдд рдЙрджрд╛рд╣рд░рдг рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдкреЗрдбрд╝ рдХреЛ рджреЗрдЦреЗрдВ:

 [INFO] -----------< io.github.efenglu.serviceLoader:spring-example >----------- [INFO] Building spring-example 1.0.X-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ spring-example --- [INFO] io.github.efenglu.serviceLoader:spring-example:jar:1.0.X-SNAPSHOT [INFO] +- org.slf4j:slf4j-api:jar:1.7.25:compile [INFO] +- org.springframework:spring-context:jar:4.3.22.RELEASE:compile [INFO] | +- org.springframework:spring-aop:jar:4.3.22.RELEASE:compile [INFO] | +- org.springframework:spring-core:jar:4.3.22.RELEASE:compile [INFO] | | \- commons-logging:commons-logging:jar:1.2:compile [INFO] | \- org.springframework:spring-expression:jar:4.3.22.RELEASE:compile [INFO] +- org.springframework.boot:spring-boot-autoconfigure:jar:1.5.19.RELEASE:compile [INFO] +- org.springframework.boot:spring-boot:jar:1.5.19.RELEASE:compile [INFO] \- org.springframework:spring-beans:jar:4.3.22.RELEASE:compile 

рдФрд░ ServiceLoader рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

 [INFO] io.github.efenglu.serviceLoader:serviceLoader-example:jar:1.0.X-SNAPSHOT ## Only provided dependencies for the auto service annotation [INFO] \- com.google.auto.service:auto-service:jar:1.0-rc4:provided [INFO] +- com.google.auto:auto-common:jar:0.8:provided [INFO] \- com.google.guava:guava:jar:23.5-jre:provided [INFO] +- com.google.code.findbugs:jsr305:jar:1.3.9:provided [INFO] +- org.checkerframework:checker-qual:jar:2.0.0:provided [INFO] +- com.google.errorprone:error_prone_annotations:jar:2.0.18:provided [INFO] +- com.google.j2objc:j2objc-annotations:jar:1.1:provided [INFO] \- org.codehaus.mojo:animal-sniffer-annotations:jar:1.14:provided 

рдпрджрд┐ рд╣рдо рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ ServiceLoader рдХреА рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд╣реА рд╣реИ, рдЙрд╕реЗ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ-рдЖрдзрд╛рд░рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдорд╣рддреНрд╡ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЧрддрд┐


рдХрдВрд╕реЛрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, ServiceLoader рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдордп рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдРрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред рдпрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рдХреА рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛, рд╕реНрдХреИрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдмрдбрд╝реЗ рдврд╛рдВрдЪреЗ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реИред

рд╕реНрдореГрддрд┐


рдпрд╛рджрджрд╛рд╢реНрдд рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╕рдВрдд рдкреНрд░рд╕рд┐рджреНрдз рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ DI рдХреЗ рд▓рд┐рдП ServiceLoader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓


рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░ рдХреЛрдб рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереАред ServiceLoader рдПрдХ рдРрд╕рд╛ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдмрд╛рд╣рд░реА рдХреЛрдб рдХреЛ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ "рдПрдХреНрд╕реЗрд╕" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЛ рд╕реАрдорд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЕрдиреБрдореЛрджрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╕рдорд░реНрдерди рддрдВрддреНрд░ рд╣реИред рд╡рд╕рдВрдд рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдбреАрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рддрдХ рдЖрдк рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ)ред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╡рд╕рдВрдд рдПрдХ рдорд╣рд╛рди рдЪреАрдЬ рд╣реИред рдЗрд╕рдХреА рд╕реЗрд╡рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреА рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдХрднреА рд╕реЗрд╡рд╛рд▓реЙрдбрд░ рдореЗрдВ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм ServiceLoader рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рд░рд▓, рдЫреЛрдЯрд╛, рддреЗрдЬ рдФрд░ рд╣рдореЗрд╢рд╛ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдореЗрд░реЗ рдЧрд┐рдЯ рд░реЗрдкреЛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдбред

рд╡рд╣ рд╕рдм рд╣реИред рдХреЛрд░реНрд╕ рдкрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ !

Source: https://habr.com/ru/post/hi457440/


All Articles