what is the purpose of including empty beans.xml in CDI implemenations projects?

对着背影说爱祢 提交于 2019-12-04 09:51:36

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.

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

1

A completely empty beans.xml is the same as having a beans.xml inside the archive with the following content:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
</beans>

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 a beans.xml inside the archive with the following content:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="annotated">

</beans>

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).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!