承接上文,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处理机制。