IOC 也就是“控制反转”了,不过更流行的叫法是“依赖注入”(DI - Dependency Injection)。听起来挺高深,其实实现起来并不复杂。下面就看看如何来实现这个轻量级 IOC 框架。
从实例出发,先看看以下 Action 代码。
@Bean
public class ProductAction extends BaseAction {
@Inject
private ProductService productService;
@Request("GET:/product/{id}")
public Result getProductById(long productId) {
if (productId == 0) {
return new Result(ERROR_PARAM);
}
Product product = productService.getProduct(productId);
if (product != null) {
return new Result(OK, product);
} else {
return new Result(ERROR_DATA);
}
}
}
以上使用了两个自定义注解:@Bean 与 @Inject。 在 ProductAction 类上标注了 @Bean 注解,表示该类会交给“容器”处理,以便加入依赖注入框架。
在 produceService 字段上标注了 @Inject 注解,表示该字段将会被注入进来,而无需 new ProductServiceImpl(),实际上 new 这件事情不是我们做的,而是框架做的,也就是说控制权正好反过来了,所以“依赖注入(DI)”也称作“控制反转(IoC)”。
那么,应该如何实现依赖注入框架呢?首先还是看看下面的 BeanHelper 类吧。
public class BeanHelper {
private static final Map, Object> beanMap = new HashMap, Object>();
static {
try {
// 获取并遍历所有的 Bean(带有 @Bean 注解的类)
List> beanClassList = ClassHelper.getClassListByAnnotation(Bean.class);
for (Class> beanClass : beanClassList) {
// 创建 Bean 实例
Object beanInstance = beanClass.newInstance();
// 将 Bean 实例放入 Bean Map 中(键为 Bean 类,值为 Bean 实例)
beanMap.put(beanClass, beanInstance);
}
// 遍历 Bean Map