为啥将内部类注入同一个外部类中的另一个内部类不起作用?

Posted

技术标签:

【中文标题】为啥将内部类注入同一个外部类中的另一个内部类不起作用?【英文标题】:Why injecting inner-class into another inner-class in the same outer-class does not work?为什么将内部类注入同一个外部类中的另一个内部类不起作用? 【发布时间】:2019-06-11 04:30:45 【问题描述】:

我有一个类,里面有两个内部类。我用@Service 注释了外部类,用@Component 注释了两个内部类。 InnerClassA 是 @Autowired 到 OuterClass 中,InnerClassB 是 @Autowired 到 InnerClassA 中。 即使所有三个 bean 都已初始化,但 InnerClassA 中的 innerClassB 为空。

@Service
public class ChatService
    @Autowired
    private ChatServerUtils chatServerUtils;
    @Autowired
    private PushNotificationHelper pushNotificationHelper;

    @Component
    public class PushNotificationHelper
        @Autowired
        private ChatServerUtils chatServerUtils; //this is null
        @Autowired
        private PushService pushService;

        @Async
        public void sendPushNotifications(Group group)
            Map<String, Integer> notificationData= new HashMap<>();
            Map<String, CompletableFurure<Integer>> unreadCountFutures = new ArrayList<>();
            for(Member member : group)
                CompletableFurure<Integer> unreadCountFuture = chatServerUtils.getUnreadCount(group, member);
                unreadCountFutures.put(member.getId(), unreadCountFuture);
            
            for(Map.Entry<String, CompletableFurure<Integer>> entry : unreadCountFutures.entrySet())
                notificationData.put(entry.getKey(), entry.getValue().get());
            
            pushService.sendNotifications(notificationData);
        
    

    @Component
    public class ChatServerUtils
        @Async
        public CompletableFuture<Integer> getUnreadCount(Group group, Member member)
            ...
        
    

更多信息: 外部类是一个聊天服务,它处理与聊天用户、消息和组相关的事情。还有另一个发送推送通知的服务。当消息被发送到组时,我必须向组中的所有用户发送推送通知。在向推送通知服务发送请求之前,我必须联系外部聊天服务器并获取每个群组成员的未读消息计数。聊天服务器的 API 不支持单次调用获取所有用户的未读计数。由于这是一个耗时的过程,我需要异步进行。这就是为什么我必须将这些方法移动到单独的类中(以使用@Async)。除了 ChatServiceUtil 类中显示的方法之外,PushNotificationHelper 和 ChatService 都使用了更多方法。

【问题讨论】:

请提供完整的课程代码以了解问题 您需要将内部类作为内部类吗?由于外部类和两个内部类之间的联系,不将它们中的每一个都作为自己的类似乎有点奇怪。如果您可以发布更多关于如何使用链接内部类和外部类的概念的信息,可能会更容易为您提供准确的答案。 您现在可以检查一下吗? @SahilBhalla 您现在可以检查一下吗? @MirkoBrandt 【参考方案1】:

使用外部ChatService 类中的chatServerUtils 变量怎么样?由于PushNotificationHelperChatService 封装,它应该可以访问私有变量。

除此之外,我仍然认为您的代码没有理由从这种内部/外部类构造中受益。您说您有多个内部类从外部类中使用的方法,但是如果您将外部类注入它们,这些内部类仍然可以使用这些方法。对我来说,您似乎应该仔细研究一下您的代码架构,并重新考虑其中的一些。 如果您不想这样做,我希望我的上述建议对您有所帮助。

【讨论】:

我尝试使用外部类ChatService 中的chatServiceUtils,但它仍然为空。我怀疑由于sendPushNotifications 是异步执行的,因此注入外部类的属性不可用。据我所知,spring 创建了一个PushNotificationHelper 的代理来异步运行它。 我使用这种外部类内部类样式的动机是将与 chatService 相关的东西保留在单个类中。 我建议为此使用软件包。您可以有一个名为 chatService 的包,并且与聊天服务相关的每个类都存储在那里。我只会将内部类用作一个只包含一些变量并且仅供外部类使用的小类。您的内部类将来可能会被 ChatService 以外的其他类使用,并且它们也具有相当多的功能。因此,我强烈建议您将它们作为自己的类,不要被这个问题拖太久。 是的。我现在知道了。非常感谢@MirkoBrandt 没问题很高兴我能帮忙

以上是关于为啥将内部类注入同一个外部类中的另一个内部类不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

内部类

成员内部类不可以有静态属性

为啥内部类的private变量可被外部类直接访问

JAVA中的内部类

内部类

内部类