Module jakarta.cdi

Annotation Type Produces


  • @Target({METHOD,FIELD})
    @Retention(RUNTIME)
    @Documented
    public @interface Produces

    Identifies a producer method or field. May be applied to a method or field of a bean class.

    A producer method must be a non-abstract method of a managed bean class or session bean class. A producer method may be either static or non-static. If the bean is a session bean, the producer method must be either a business method of the EJB or a static method of the bean class.

     public class Shop {
        @Produces @ApplicationScoped 
        @Catalog @Named("catalog") 
        List<Product> getProducts() { ... }
        ...
     }
     

    A producer field must be a field of a managed bean class or session bean class. A producer field may be either static or non-static. If the bean is a session bean, the producer field must be a static field of the bean class.

     public class Shop { 
        @Produces @ApplicationScoped 
        @Catalog @Named("catalog") 
        List<Product> products = ...;
        ...
     }
     

    If a producer method sometimes returns a null value, or if a producer field sometimes contains a null value when accessed, then the producer method or field must have scope @Dependent.

    A producer method return type or producer field type may not be a type variable.

    If the producer method return type or producer field type is a parameterized type, it must specify an actual type parameter or type variable for each type parameter.

    If the producer method return type or producer field type is a parameterized type with a type variable, it must have scope @Dependent.

    A producer method may have any number of parameters. All producer method parameters are injection points.

     public class OrderFactory {
     
         @Produces
         @ConversationScoped
         public Order createCurrentOrder(Shop shop, @Selected Product product) {
             Order order = new Order(product, shop);
             return order;
         }
     
     }
     

    A bean may declare multiple producer methods or fields.

    Producer methods and fields are not inherited by bean subclasses.

    Interceptors and decorators may not declare producer methods or fields.

    Author:
    Gavin King, Pete Muir
    See Also:
    Disposes