在本文中,我们将重点介绍CDI和Servlet 3.0。 您可以在此处看到第1部分。
让我们从CDI开始。
当我开始撰写源自该系列的文章时,我并没有考虑撰写CDI。 真诚地说,我以前从未使用过。 这篇文章的想法是使用jedis和servlet创建一个对象。 但是,当我编写应用程序时,我只是讨厌实例化bean的想法。 在我的日常工作中,我使用Spring进行依赖项注入和其他操作,但是对于此帖子,我不想添加。 因此,我决定尝试CDI,而在应用程序中添加和使用它的简单性让我感到非常惊讶。
那么,什么是CDI?
CDI是上下文和依赖注入的首字母缩写,是在javaee平台上解决DI的javaee规范。 因此,一旦在项目中将其激活,就可以使用@Inject批注轻松注入依赖项。 在CDI上,一切都是豆子,
并且几乎所有的类都可以注入。
如何激活CDI?
如果我们在Java EE应用程序服务器中运行应用程序,则只需在META-INF文件夹中添加一个空的beans.xml。 但是在诸如tomcat之类的服务器中,我们需要添加更多文件和配置:
- 在lib文件夹中添加weld-servlet.jar。 您可以从Weld网站获取它;
- 在META-INF下创建一个文件context.xml:
<?xml version="1.0" encoding="UTF-8"?> <Context> <Manager pathname=""/> <!-- disables storage of sessions across restarts --> <Resource name="BeanManager" auth="Container" type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory"/> </Context>
- 在web.xml上添加一些焊接配置:
<listener><listener-class>org.jboss.weld.environment.servlet.Listener</listener-class></listener><resource-env-ref><resource-env-ref-name>BeanManager</resource-env-ref-name><resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type></resource-env-ref>
- 然后,我们只需要在META-INF或WEB-INF上添加一个空的beans.xml。
之后,我们准备开始使用CDI进行编码。
在上一篇文章中,我们创建了一个UserDAO类,在这些方法中,我们使用Jedis类的实例执行Redis命令。 使用@Inject批注将该实例注入到UserDAO对象中。 我们可以在下面看到:
public class UserDAO {@Inject Jedis jedis;//....
}
如我们所见,注入Jedis类的实例非常简单。 如果Jedis类具有不带参数的构造函数,则将其直接注入。 但事实并非如此,因此我们使用了带有@Produces注释方法的类。 这表明这是生产者方法。 在我们的示例中,我们还使用了JedisPool,从中可以获取Jedis连接。 在这种情况下,我们有两个生产者:
- 对于JedisPool
- 其他用于Jedis连接。
Jedis生产者有一个通过@Inject注入的JedisPool实例,我们可以在下面看到它们:
JedisPoolFactory:
public class JedisPoolFactory {private String host = "localhost";private JedisPool jedisPool;@Singletonpublic @Produces JedisPool getJedisPool(){jedisPool = new JedisPool(new JedisPoolConfig(), host);return jedisPool;}public void detroy(@Disposes JedisPool jedisPool){jedisPool.destroy();}
}
在代码中,我们看到方法getJedisPool带有@Produces注释,表示它是JedisPool实例的生产者。 在这段代码中,我们还看到了另外两个注释。
- @Singleton –说返回的实例是一个单例,这意味着将只有一个此类的实例;
- @Disposes –指示销毁JedisPool实例时应调用哪个方法;
现在我们可以看到JedisConnectionFactory :
public class JedisConnectionFactory {@Injectprivate JedisPool jedisPool;@Produces public Jedis getJedis(){return jedisPool.getResource();}public void returnResource(@Disposes Jedis jedis){System.out.println("Returning jedis Connection");jedisPool.returnResource(jedis);}}
要获取Jedis实例,该类需要一个JedisPool实例。 JedisPool是通过@Inject注入的,它是由我们在上一个代码中看到的producer方法创建的。 它还有一个@Disposes ,它仅将连接返回到Pool。
因此,通过这种方式,我们可以将Jedis实例注入DAO。 然后在其他类中,我们仅使用@Inject ,就像在Service和Servlet类中看到的那样:
//UserService
@RequestScoped
public class UserService {@InjectUserDAO userDAO;
//...
}//Servlet - UserController
public class UserController extends HttpServlet {private static final long serialVersionUID = 1L;@Inject UserService userService;
//...
}
在此示例中,我们可以看到在应用程序中添加和使用CDI有多么简单。
Servlet 3.0
我们在新servlet上的主要区别在于我们不需要在web.xml中声明它们,现在我们可以简单地通过使用注释来设置servlet设置。 在示例中构建的servlet中,我们使用了注释来设置servlet的url映射。 以前已经开发过servlet的人都知道这是我们需要在web.xml上添加的配置之一。 我们可以在下面的servlet中看到它:
@WebServlet("/UserController")
public class UserController extends HttpServlet {private static final long serialVersionUID = 1L;@Inject UserService userService;
//...//.. doGet
//.. doPost}
在上面的代码中,我们说的是servlet将响应/ UserController路径。 使用此注释,我们可以添加更多配置,例如:
@WebServlet(value="/UserController", name="userServlet")
在上面的代码中,我们声明了映射和servlet名称。 还有其他注释可以简化servlet api的使用,例如@ WebInitParam,@ WebListener和@WebFilter 。 我们不会谈论它们,但是您可以找到关于它们的大量资源。 另外,由于Servlet 3.0,因此支持异步处理。
今天就这样。 欢迎任何意见或建议。
- 您可以在此处找到源代码。
翻译自: https://www.javacodegeeks.com/2013/11/simple-crud-using-servlet-3-0-redisjedis-and-cdi-part-2.html