CDI技术第八步 动态CDI BEAN

本文介绍了CDI中的动态Bean概念,强调了将@Produces注解应用于方法以实现在运行时获取动态对象的重要性。通过一个随机提供饮料的例子,展示了如何创建一个RequestScoped的DrinkShop类,其coffee()方法返回不同饮料名称。在Servlet中使用Instance<String>接口确保每次请求都能获取新的Bean实例,从而体现动态特性。实际访问验证了不同请求会得到不同饮料的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CDI技术第八步 动态BEAN

动态Bean是什么意思呢?

就是我在运行的时候获得动态的东西。如果按我们之前将的方式来做。获得的对象并不是动态的。因为注解加在了类上面,所以在运行时期就是这个实现类,并不能改变。

动态的关键技术就是注解加上方法上,获得的Bean是方法的返回值。既然是方法,那么方法里就可以写各种代码来实现了。这就是动态。

我们可以模拟一个卖饮料的例子。

随机提供实现饮料。这里用到的关键技术就是@Produces注解。

还需要用到的一个重要接口是 javax.enterprise.inject.Instance。

因为这个可以保证动态,否则不是动态的。

废话不多说。上代码:

package com.rschy.cdiproducer;

 

import javax.enterprise.context.RequestScoped;

import javax.enterprise.inject.Produces;

@RequestScoped

public class DrinkShop {

@Produces

public String coffee() {

return System.currentTimeMillis()%2==0 ? "Coffee" : "Coco cola";

}

 

}

这个类表示是一个request作用域的对象,其方法返回值是string,这个返回的string作为一个bean被CDI容器所管理。然后我们的servlet代码就这样写。

package com.rschy.cdiproducer;

 

import java.io.IOException;

 

import javax.enterprise.inject.Instance;

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;

 

@WebServlet("/drink.html")

public class DrinkServlet extends HttpServlet {

 

private static final long serialVersionUID = 1L;

@Inject

private Instance<String> drink;

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse respthrows ServletException, IOException {

resp.getWriter().append("You got a ").append(drink.get()).append(".");

}

 

}

这里用到Instance接口泛型,可以保证每次都会去取新的对象。如果不用这个接口,改成下面的写法:

@Inject

private Instance<String> drink;

虽然能取到对象,但是对象不会变,哪怕是重新请求了,对象还是原来那个对象简单说就是你感觉到作用域无效了。这是动态CDI bean的特殊性。

我们在浏览器访问试一下:


可以看到两次访问是不同的结果了。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值