一步一步写一个java web开发框架(6)

一步一步写一个java web开发框架(1)

一步一步写一个java web开发框架(2)

一步一步写一个java web开发框架(3)

一步一步写一个java web开发框架(4)

一步一步写一个java web开发框架(5)

承接上文,Controller中的service和dao,怎么实现自动注入呢?

先看一下页面的写法

@RequestMapping("/weike")
public class WeikeController extends GlobalController
{

	// private static final Logger logger = Logger.getLogger(WeikeController.class);

	@Resource
	private WeikeService weikeService;

	/**
	 * weike列表数据
	 * 
	 * @return JSON
	 */
	@RequestMapping("/list")
	public JSONMap getWeikeList(Param para)
	{
		String keyWord = para.getString("a");
		return getOK("dataList", weikeService.getWeikeList(keyWord));
	}
}

其中的weikeService怎么自动注入呢?

1、先把所有带@Resource的字段先找到并存储起来

private void addResource(Class<?> cla) {
		Field[] fields = cla.getDeclaredFields();
		for (Field field : fields) {
			if (field.getAnnotation(Resource.class) != null) {
				if (beanList.containsKey(cla))
					beanList.get(cla).add(new SpringBean(field));
				else {
					List<SpringBean> beans = new ArrayList<>();
					beans.add(new SpringBean(field));
					beanList.put(cla, beans);
				}
			}
		}
	}

2、通过遍历所有的class文件,找到@Resource字段的实现类

private void bindResource() {
		Set<Class<?>> keys = beanList.keySet();
		List<SpringBean> beans;
		for (Class<?> cla : keys) {
			beans = beanList.get(cla);
			for (SpringBean springBean : beans) {
				for (int i = 0; i < classList.size(); i++) {
					if (springBean.isTargetClass(classList.get(i))) {
						springBean.setTarget(classList.get(i));
						classList.remove(i);
						i--;
					}
				}
			}
		}
		classList.clear();
	}

这样关系就建立好了,然后直接去注入Action的定义类就行了。

public Object getBean(Class<?> declaringClass) {
		try {
			Object obj = declaringClass.newInstance();
			annotationInject(obj, declaringClass);
			return obj;
		} catch (Exception e) {
			logger.error("Create '" + declaringClass.getName() + "' bean faild", e);
		}
		return null;
	}
	
	private void annotationInject(Object obj, Class<?> declaringClass) throws IllegalArgumentException, IllegalAccessException {
		if (obj == null)
			return;
		List<SpringBean> beans = beanList.get(declaringClass);
		if(beans != null && !beans.isEmpty()){
			for (SpringBean bean : beans) {
				bean.setTargetValue(obj, getBean(bean.getTargetClass()));
			}
		}
	}

这样service和dao的注入就通过框架实现了,使用时只要加上注解@Resource就可以了。

下一节,主要讲用框架怎么实现预编译jsp,脱离tomcat的jsp处理机制。

猜你喜欢

转载自blog.csdn.net/zml_moxueli/article/details/81190314