Contexts and Dependency Injection (CDI) defines a set of complementary services that help improve the structure of application code. beans.xml is used to enable CDI services for the current bean archive as well as to enable named interceptors, decorators and alternatives for the current bean archive. Bean classes of enabled beans must be deployed in bean archives. A library jar, EJB jar, application client jar or rar archive is a bean archive if it has a file named beans.xml in the META-INF directory. The WEB-INF/classes directory of a war is a bean archive if there is a file named beans.xml in the WEB-INF directory of the war. A directory in the JVM classpath is a bean archive if it has a file named beans.xml in the META-INF directory. By default, a bean archive has no enabled interceptors bound via interceptor bindings. An interceptor must be explicitly enabled by listing its class under the <interceptors> element of the beans.xml file of the bean archive. The order of the interceptor declarations determines the interceptor ordering. Interceptors which occur earlier in the list are called first. If the same class is listed twice under the <interceptors> element, the container automatically detects the problem and treats it as a deployment problem. Each child <class> element must specify the name of an interceptor class. If there is no class with the specified name, or if the class with the specified name is not an interceptor class, the container automatically detects the problem and treats it as a deployment problem. By default, a bean archive has no enabled decorators. A decorator must be explicitly enabled by listing its bean class under the <decorators> element of the beans.xml file of the bean archive. The order of the decorator declarations determines the decorator ordering. Decorators which occur earlier in the list are called first. If the same class is listed twice under the <decorators> element, the container automatically detects the problem and treats it as a deployment problem. Each child <class> element must specify the name of a decorator class. If there is no class with the specified name, or if the class with the specified name is not a decorator class, the container automatically detects the problem and treats it as a deployment problem. An alternative is a bean that must be explicitly declared in the beans.xml file if it should be available for lookup, injection or EL resolution. By default, a bean archive has no selected alternatives. An alternative must be explicitly declared using the <alternatives> element of the beans.xml file of the bean archive. The <alternatives> element contains a list of bean classes and stereotypes. An alternative is selected for the bean archive if either: the alternative is a managed bean or session bean and the bean class of the bean is listed, or the alternative is a producer method, field or resource, and the bean class that declares the method or field is listed, or any @Alternative stereotype of the alternative is listed. Each child <class> element must specify the name of an alternative bean class. If there is no class with the specified name, or if the class with the specified name is not an alternative bean class, the container automatically detects the problem and treats it as a deployment problem. If the same class is listed twice under the <alternatives> element, the container automatically detects the problem and treats it as a deployment problem. Each child <stereotype> element must specify the name of an @Alternative stereotype annotation. If there is no annotation with the specified name, or the annotation is not an @Alternative stereotype, the container automatically detects the problem and treats it as a deployment problem. If the same stereotype is listed twice under the <alternatives> element, the container automatically detects the problem and treats it as a deployment problem.