I am using weld
,a RI of CDI as dependency injection component in my JSF-EJB-JPA web app. I see in my project we have empty beans.xml in META-INF/beans.xml
in ejb.jar
and WEB-INF/beans.xml
in my WAR. I don't get it why we need to keep empty beans.xml
when there nothing defined in that file?
相关问题
- Delete Messages from a Topic in Apache Kafka
- Jackson Deserialization not calling deserialize on
- How to maintain order of key-value in DataFrame sa
- StackExchange API - Deserialize Date in JSON Respo
- Difference between Types.INTEGER and Types.NULL in
1
A completely empty
beans.xml
is the same as having abeans.xml
inside the archive with the following content:Because of bean-discovery-mode="all" the archive will be scanned for beans. No need to annotate them.
2
A non-existent
beans.xml
it is the same as having abeans.xml
inside the archive with the following content:Because of bean-discovery-mode="annotated" the archive will be scanned for beans between classes that are annotated (e.g.
@Dependent
). All other classes will be ignored, therefore cannot be injected as beans.3
A third option is to declare bean-discovery-mode="none" in which case the server never scans the archive for beans.
4
Now for the case on which you want to load a class as a bean but you cannot access the archive (e.g. external library) and the class is not annotated, the solution is to use a Producer methods (with or without qualifiers).
It is used in certain limited situations
http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html
Some CDI features like decorators would be declared in this file
CDI needs to scan all the classes of a bean archive at start-up and fire a bunch of events because almost any class is automatically a managed bean (read more here), even if it doesn't have any annotations.
This would incur quite a bit of overhead, especially for jar files that are not meant to have any beans, and it is therefore beneficial to explicitly indicate which bean archives should be scanned by including the
beans.xml
.