Java动态获取某个接口下所有的实现类对象集合

简介: Java动态获取某个接口下所有的实现类对象集合

场景:MyServiceImpl1 和 MyServiceImpl2 都实现了 MyService接口

@Service
public class MyServiceImpl1 implements MyService {
    @Override
    public Type getType() {
        return Type.ONE;
    }
    // ...
}

@Service
public class MyServiceImpl2 implements MyService {
    @Override
    public Type getType() {
        return Type.TWO;
    }
    // ...
}

方式1,通过set注入

@Component
public class InitializeTest {
 
    private static Map<Type, MyService> myServiceMap = new LinkedHashMap<>();
 
    @Autowired(required = false)
    public void setMyServices(List<MyService> services) {
        myServiceMap.clear();
        for (MyService service : services) {
            myServiceMap.put(service.getType(), service);
        }
    }
 
    public static MyService getMyServiceByType(Type type) {
        return myServiceMap.get(type);
    }
}

方式2, 通过反射获取同一包下的,都实现了MyService接口的实现类

@Component
public class MyCommandRunner implements CommandLineRunner {
 
    @Autowired
    private ApplicationContext applicationContext;
 
    private static Map<Type, MyService> myServiceMap = new LinkedHashMap<>();
 
    @Override
    public void run(String... args) {
        // MyCommandRunner 与实现了MyService接口的实现类位于同一包下
        Reflections reflections = new Reflections(this.getClass().getPackage().getName());
        Set<Class<? extends MyService>> myClasses = reflections.getSubTypesOf(MyService.class);
        for (Class<? extends MyService> myClass : myClasses) {
            MyService myService = applicationContext.getBean(monitor);
            myServiceMap.put(myService.getType(), myService);
        }
    }
 
    public static MyService getMyServiceByType(Type type) {
        return myServiceMap.get(type);
    }
}
目录
相关文章
|
4天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
11 2
|
4天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
8天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
41 4
|
9天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
9天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
10 0
|
Java
Java动态代理模式jdk和cglib(上)
Java动态代理模式jdk和cglib(上)
112 0
Java动态代理模式jdk和cglib(上)
|
Java 数据库连接 Spring
Java动态代理模式jdk和cglib(下)
Java动态代理模式jdk和cglib(下)
81 0
|
6天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
15天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
2天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
15 9