7.2. 使用 Jakarta 上下文和依赖注入来开发应用程序
Jakarta Contexts 和 Dependency Injection 在开发应用程序、重用代码、在部署或运行时修改代码以及单元测试方面为您提供巨大的灵活性。
我们ld 为应用程序开发提供了一个特殊模式。启用后,可以使用某些内置工具,协助 Jakarta Contexts 和 Dependency Injection 应用程序的开发。
开发模式不应在生产环境中使用,因为它可能会对应用的性能造成负面影响。在部署到生产环境之前,务必禁用开发模式。
为 Web 应用程序启用开发模式:
对于 web 应用程序,将 servlet 初始化参数 org.jboss.weld.development 设置为 true :
使用管理 CLI 为 JBoss EAP 启用开发模式:
通过将 development-mode 属性设置为 true,可以为部署的所有应用程序全局启用 Weld 开发模式:
/subsystem=weld:write-attribute(name=development-mode,value=true)
/subsystem=weld:write-attribute(name=development-mode,value=true)
7.2.1. 默认 Bean 发现模式 复制链接链接已复制到粘贴板!
Bean 存档的默认 bean 发现模式被 标注。此类 Bean 存档 被认为是隐式 Bean 存档。
如果 注解 了 bean 发现模式,则:
-
不会发现没有
bean 定义注解且不是 Bean 类会话 Bean 类的 Bean 类。 - 不在会话 Bean 上以及 bean 类没有 Bean 定义注释的制作者方法不会发现。
- 不在会话 Bean 上以及 bean 类没有 Bean 定义注解的制作者字段不会被发现。
- 不在会话 Bean 上且 bean 类没有 Bean 定义注解的推理器方法不会被发现。
- 不在会话 Bean 上以及 bean 类没有 Bean 定义注解的观察方法不会发现。
只有将发现模式设置为 all 时,Contexts 和 Dependency Injection 部分中的所有示例才有效。
Bean 定义注解
Bean 类可以具有一个 定义注解的 Bean,以便能够将其放置在应用程序中的任何位置,如 bean 存档中所定义。Bean 类中带有 Bean 定义注解,这被认为是隐式 Bean。
Bean 定义注解集合包含:
-
@ApplicationScoped、@SessionScoped、@ConversationScoped和@RequestScoped注释. - 所有其他普通范围类型.
-
@interceptor和@Decorator注释. -
所有 stereotype 注释,即标有
@Stereotype 的注释。 -
@Dependent范围注释.
如果在 Bean 类上声明其中一个注释,则 bean 类被认为具有 Bean 定义注释。
示例:Bean 定义注解
为确保与其他 JSR-330 实施以及 Jakarta 上下文和依赖注入规范兼容,除 @Dependent 外,所有伪作用注释都不是定义注释。但是,stereotype 注释(包括伪范围注释)是 Bean 定义注解。
7.2.2. 从扫描过程中排除 Bean 复制链接链接已复制到粘贴板!
排除过滤器由 bean 归档的 beans.xml 文件中的 <exclude> 元素定义为 子项。默认情况下,排除过滤器处于活动状态。如果 exclude 过滤器包含以下内容,则 exclude 过滤器将变为不活跃:
<scan> 元素的
-
名为
<if-class-available>的子元素及name属性,并且 bean 存档的类加载器无法为该名称加载类,或者 -
名为
<if-class-not-available>的子元素及name属性,bean 存档的类加载器可以为该名称加载类,或者 -
名为
<if-system-property>且带有name属性的子元素,没有为该名称定义系统属性,或者 -
名为
<if-system-property>的子元素带有name属性和 value 属性,没有为该名称定义具有该值的系统属性。
如果过滤器活跃,则该类型不在发现中,且:
- 被发现的类型的完全限定名称与 exclude 过滤器的 name 属性的值匹配,或者
- 被发现类型的软件包名称与 exclude 过滤器的 name 属性的值匹配,或者后缀为 ".*"。
- 被发现类型的软件包名称以 exclude 过滤器的 name 属性值开头
例 7.1. 示例: beans.xml 文件
使用 @Vetoed 标注 Jakarta EE 组件是安全的,防止它们被视为 Bean。事件不会触发标有 @Vetoed 的 任何类型,也不会在标有 @Vetoed 的软件包中触发。如需更多信息,请参见 @Vetoed。
7.2.3. 使用注入来扩展实施 复制链接链接已复制到粘贴板!
您可以使用注入来添加或更改现有代码的功能。
以下示例为现有类添加了转换功能,并假定您已有一个 Welcome 类,它具有方法 buildPhrase。buildPhrase 方法将城市名称用作参数,并输出一个短语,如"Welcome to Boston!"。
这个示例将假设的转换 器 对象注入到 Welcome 类中。Translator 对象可以是 Jakarta Enterprise Beans 无状态 Bean 或其他类型的 bean,它可以将句子从一个语言转换为另一种语言。在这个示例中,转换 器用于 转译整个问候语,而不修改原始 Welcome 类。Translator 在调用 buildPhrase 方法之前注入。
示例:将一个翻译器 Bean 注入 欢迎 类