@Bean
    @ConditionalOnMissingBean(name = NotificationSender.BEAN_NAME)
    @RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
    public NotificationSender notificationSender(
        final ObjectProvider<List<NotificationSenderExecutionPlanConfigurer>> configurerProviders) {
        val configurers = Optional.ofNullable(configurerProviders.getIfAvailable()).orElseGet(ArrayList::new);
        val results = configurers
            .stream()
            .map(cfg -> {
                LOGGER.trace("Configuring notification sender [{}]", cfg.getName());
                return cfg.configureNotificationSender();
            })
            .sorted(Comparator.comparing(NotificationSender::getOrder))
            .collect(Collectors.toList());
        return new DefaultNotificationSender(results);
    }
This is {@link CasCoreNotificationsAutoConfiguration}.

@author Misagh Moayyed
@since 5.0.0
core/cas-server-core-notifications/src/main/java/org/apereo/cas/config/CasCoreNotificationsAutoConfiguration.java