Java EE中的依赖注入

时间:2014-09-29 00:59:10

标签: java-ee cdi

我想,对于一个可以注射的课程,任何课程都必须注释。但我看到一个示例演示了一个简单的REST服务,其中注入了没有任何注释的类。 HelloService没有注释。这是豆吗?它的生命周期范围怎么样?

 /**
 * A simple CDI service which is able to say hello to someone
 * 
 * @author Pete Muir
 * 
 */
public class HelloService {

String createHelloMessage(String name) {
    return "Hello " + name + "!";
}
}


/**
 * A simple REST service which is able to say hello to someone using HelloService Please     take a look at the web.xml where JAX-RS
 * is enabled And notice the @PathParam which expects the URL to contain /json/David or     /xml/Mary
 * 
 * @author bsutter@redhat.com
 */

@Path("/")
public class HelloWorld {
@Inject
HelloService helloService;

@POST
@Path("/json/{name}")
@Produces("application/json")
public String getHelloWorldJSON(@PathParam("name") String name) {
    System.out.println("name: " + name);
    return "{\"result\":\"" + helloService.createHelloMessage(name) + "\"}";
}

@POST
@Path("/xml/{name}")
@Produces("application/xml")
public String getHelloWorldXML(@PathParam("name") String name) {
    System.out.println("name: " + name);
    return "<xml><result>" + helloService.createHelloMessage(name) + "</result></xml>";
}
}

这个例子中的另一个问题是,为什么它使用&#34;你好&#34;在web.xml中?没有任何类被定义为&#34; hello&#34;,并且没有任何名为&#34; hello&#34;的目录。在项目中。

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <!-- One of the ways of activating REST Servises is adding these lines.
     The server is responsible for adding the corresponding servlet automatically.
     The class org.jboss.as.quickstarts.html5rest.HelloWorld class has the
     annotation @Path("/") to receive the REST invocation -->
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
</web-app>

2 个答案:

答案 0 :(得分:3)

您没有提到这是Jave EE 6还是7,而且您也没有包含beans.xml文件。

在Java EE 6中,如果存在META-INF/beans.xml,则可以注入具有公共默认构造函数的任何类,然后自动成为托管CDI bean。在Java EE 7中,bean-discovery-mode="all"中的beans.xml可以实现同样的效果,请参阅this question

答案 1 :(得分:1)

要使REST服务bean能够注入其他服务,您应该使用CDI bean或EJB bean作为REST服务实现bean。如果您没有指定REST实现bean的类型,则它取决于提供者,将使用哪种实现。通常默认情况下它不是可注入的。

通常在大多数情况下,使用@Named for CDI bean实现和@Stateless for EJB实现。