javaspringspring-mvcspring-integrationspring-annotations

Custom annotation is not working on spring Beans


I have created my new custom annotation @MyCustomAnnotation:

@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
@Retention(RUNTIME)
public @interface MyCustomAnnotation {
}

I applied that annotation on component and bean. Here is the code,

@MyCustomAnnotation
@Component
public class CoreBusinessLogicHandler implements GenericHandler<BusinessFile> {
    // some business logic
}

And

@Configuration
public class BusinessConfig {

    @Autowired
    private CoreIntegrationComponent coreIntegrationComponent;

    @MyCustomAnnotation
    @Bean(name = INCOMING_PROCESS_CHANNEL)
    public MessageChannel incomingProcessChannel() {
        return coreIntegrationComponent.amqpChannel(INCOMING_PROCESS_CHANNEL);
    }
    
    //some other configurations
}

Now I want all the beans annotated with @MyCustomAnnotation. Here is the code:

import org.springframework.context.ApplicationContext;
    
@Configuration
public class ChannelConfig {
    
      @Autowired
      private ApplicationContext applicationContext;
    
      public List<MessageChannel> getRecipientChannel(CoreIntegrationComponent coreIntegrationComponent) {
    
      String[] beanNamesForAnnotation = applicationContext.getBeanNamesForAnnotation(MyCustomAnnotation.class);
      //Here in output I am getting bean name for CoreBusinessLogicHandler Only.

    }
}

My question is why I am not getting Bean with name 'INCOMING_PROCESS_CHANNEL' as it has @MyCustomAnnotation? If I want to get bean with name 'INCOMING_PROCESS_CHANNEL' what code changes should I do?


Solution

  • This happens because your bean does not receive this annotation as you have placed it on a "bean definition configuration". So it is available but only through BeanFactory and beanDefinitions. You can either put the annotation on your bean class or write a custom method that would do the searching using bean factory.

    See the accepted answer here.