java ee cdi
这是CDI Disposer
方法的教程。 在CDI中,由于Producer
方法生成的对象随后可以注入到应用程序中,因此使用Disposer
方法,以便在其工作完成时将其删除。 Disposer
方法始终与Producer
方法匹配。
Disposer
方法使用的一个示例是当应用程序使用与数据库的连接时。 由于必须在与数据库的接口完成后关闭连接,因此使用Disposer
方法删除表示连接的对象。
在这里,我们将向您展示如何使用Disposer
方法。 我们将创建一个简单的服务。 然后,一旦结束,我们将创建一个Producer
方法以在应用程序中生成和注入服务,并创建一个Disposer
方法以清理该服务。
我们首选的开发环境是Eclipse 。 我们正在使用Eclipse Juno(4.2)版本以及Maven Integration插件版本3.1.0。 您可以从Eclipse的这里从和Maven Eclipse插件这里 。 用于Eclipse的Maven插件的安装不在本教程的讨论范围之内,因此不再讨论。 Tomcat 7是使用的应用程序服务器。
让我们开始,
1.创建一个新的Maven项目
转到文件->项目-> Maven-> Maven项目。
在向导的“选择项目名称和位置”页面中,确保未选中 “创建简单项目(跳过原型选择)”选项,单击“下一步”以继续使用默认值。
在这里,必须添加用于创建Web应用程序的Maven原型。 单击“添加原型”并添加原型。 将“ Archetype组ID”变量设置为"org.apache.maven.archetypes"
,将“ Archetype构件ID”变量设置为"maven-archetype-webapp"
,将“ Archetype版本”设置为"1.0"
。 点击“确定”继续。
在向导的“输入工件ID”页面中,您可以定义项目的名称和主程序包。 将“组ID”变量设置为"com.javacodegeeks.snippets.enterprise"
,将“工件ID”变量设置为"cdibeans"
。 上述选择组成主体工程包作为"com.javacodegeeks.snippets.enterprise.cdibeans"
和项目名称为"cdibeans"
。 将“ Package”变量设置为"war"
,以便创建一个war文件以部署到tomcat服务器。 点击“完成”退出向导并创建您的项目。
Maven项目结构如下所示:
- 它由以下文件夹组成:
- / src / main / java文件夹,其中包含应用程序动态内容的源文件,
- / src / test / java文件夹包含用于单元测试的所有源文件,
- / src / main / resources文件夹包含配置文件,
- / target文件夹包含已编译和打包的可交付成果,
- / src / main / resources / webapp / WEB-INF文件夹包含Web应用程序的部署描述符,
- pom.xml是项目对象模型(POM)文件。 包含所有项目相关配置的单个文件。
2.添加所有必要的依赖项
通过在POM编辑器的“ Pom.xml”页面上对其进行编辑,可以在Maven的pom.xml
文件中添加依赖项,如下所示:
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javacodegeeks.snippets.enterprise.cdi</groupId>
<artifactId>cdibeans</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>cdibeans Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>1.1.10.Final</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.1.7</version>
</dependency>
</dependencies>
<build>
<finalName>cdibeans</finalName>
</build>
</project>
如您所见,Maven以声明方式管理库依赖关系。 创建本地存储库(默认情况下,位于{user_home} /。m2文件夹下),所有必需的库都从公共存储库下载并放置在该库中。 此外,库内的依赖关系会自动解决和处理。
3.创建一个简单的服务
GreetingCard.java
类是具有两个方法的接口。
GreetingCard.java
package com.javacodegeeks.snippets.enterprise.cdibeans;
public interface GreetingCard {
public void sayHello();
public void sayGoodBye();
}
该服务的实现如下所示:
GreetingCardImpl.java
package com.javacodegeeks.snippets.enterprise.cdibeans.impl;
import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingCard;
public class GreetingCardImpl implements GreetingCard {
public void sayHello() {
System.out.println("Hello!!!");
}
public void sayGoodBye() {
System.out.println("GoodBye!!!");
}
}
4.在托管Bean中使用生产者和处置者
在下面的托管bean中,我们利用了上面创建的Producer
和Disposer
方法。 特别是,在GreetingCardFactory.java
类中,我们创建了一个方法方法getGreetingCard()
,该方法使用@Produces
注释进行注释。 该方法创建GreetingCardImpl
的实例。 以相同的方式,该Disposer
方法具有一个带注释@Disposes
参数。 Disposer
参数接收由生产者方法产生的对象。 当上下文结束时,将自动调用Disposer
方法。 在这里,由于我们已经创建了RequestScoped Producer
方法,因此在请求结束时将调用Disposer
方法。
GreetingCardFactory.java
package com.javacodegeeks.snippets.enterprise.cdibeans;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import com.javacodegeeks.snippets.enterprise.cdibeans.impl.GreetingCardImpl;
public class GreetingCardFactory implements Serializable {
private static final long serialVersionUID = -44416514616012281L;
@Produces
@RequestScoped
@Greetings
public GreetingCard getGreetingCard() {
GreetingCard greetingCard = new GreetingCardImpl();
greetingCard.sayHello();
return greetingCard;
}
public void disposeGreetingCard(
@Disposes @Greetings GreetingCard greetingCard) {
greetingCard.sayGoodBye();
}
}
我们可以使用限定符来提供特定bean类型的各种实现。 限定词是我们应用于Bean的注释。 限定符类型是Java批注,定义为@Target({METHOD, FIELD, PARAMETER, TYPE})
和@Retention(RUNTIME)
。
在这里,我们声明一个@Greetings
限定词,如下所示:
Greetings.java
package com.javacodegeeks.snippets.enterprise.cdibeans;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
@Qualifier
@Retention(RUNTIME)
@Target({ FIELD, TYPE, METHOD, PARAMETER })
public @interface Greetings {
}
5.运行应用程序
为了运行该应用程序,我们创建了一个简单的servlet,如下所示:
GreetingServlet.java
package com.javacodegeeks.snippets.enterprise.cdibeans.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingCard;
import com.javacodegeeks.snippets.enterprise.cdibeans.Greetings;
@WebServlet(name = "greetingServlet", urlPatterns = {"/sayHello"})
public class GreetingServlet extends HttpServlet {
private static final long serialVersionUID = 2280890757609124481L;
@Inject
@Greetings
private GreetingCard greetingCard;
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>" + "Hello ... " + "</h1>");
System.out.println(" .... " + greetingCard.toString());
}
public void destroy(){
}
}
要运行该示例,我们必须使用Maven构建项目,然后将产生的war
文件放置在tomcat的webbaps
文件夹中。 然后,我们可以继续:
http://localhost/8080/cdibeans/sayHello
结果是如下所示:
这是Java EE CDI Disposer方法的教程。 下载本教程的源代码: CDIDisposerMethodExample
翻译自: https://www.javacodegeeks.com/2013/05/java-ee-cdi-disposer-methods-example.html
java ee cdi