003-搭建框架-实现IOC机制
一、实现目标
一种MVC【Model-View-Controller】一种设计模式,进行解耦。
/* * 处理客户管理相关请求 */ @Controller public class CustomerController { @Inject private CustomService customService; @Action("get:/customer") public View index(Param param) { List<Customer> customerList = customService.getCustomerList(""); return new View("customer.jsp").addModel("customerlist", customerList); } @Action("get:/customer_show") public View show(Param param) { long id = param.getLong("id"); Customer customer = customService.getCustomer(id); return new View("customer_show.jsp").addModel("customer", customer); } @Action("get:/customer_create") public View create(Param param) { return new View("customer_create.jsp"); } @Action("post:/customer_create") public Data createSumbit(Param param) { Map<String, Object> paramMap = param.getParamMap(); boolean result = customService.createCustomer(paramMap); return new Data(result); } @Action("get:/customer_edit") public View edit(Param param) { long id = param.getLong("id"); Customer customer = customService.getCustomer(id); return new View("customer_edit.jsp").addModel("customer", customer); } @Action("post:/customer_edit") public Data editSumbit(Param param) { long id = param.getLong("id"); Map<String, Object> paramMap = param.getParamMap(); boolean result = customService.updateCustomer(id, paramMap); return new Data(result); } @Action("post:/customer_delete") public Data delete(Param param) { long id = param.getLong("id"); boolean result = customService.deleteCustomer(id); return new Data(result); } }
注:
通过@Controller注解来定义Controller类;通过注解@Inject来定义成员属性;
通过@Service注解来定义Service类,通过注解@Action来定义方法;
返回View 对象标示jsp页面,Data标示JSon数据
二、代码开发
https://github.com/bjlhx15/smart-framework.git 中的chapter3和smart-framework部分
三、知识点
3.1、类加载器
package com.lhx.smart.framework.util; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileFilter; import java.net.JarURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class ClassUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ClassUtil.class); /** * 获取类加载器 * * @return */ public static ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); } /** * 加载类 * * @param className * @param isInitialized * @return */ public static Class<?> loadClass(String className, boolean isInitialized) { Class<?> cls; try { cls = Class.forName(className, isInitialized, getClassLoader()); } catch (ClassNotFoundException e) { LOGGER.error("类加载失败", e); throw new RuntimeException(e); } return cls; } /** * 获取制定报名下的所有类 * * @param packageName * @return */ public static Set<Class<?>> getClassSet(String packageName) { Set<Class<?>> classSet = new HashSet<Class<?>>(); try { Enumeration<URL> urls = getClassLoader().getResources(packageName.replace(".", "/")); while (urls.hasMoreElements()) { URL url = urls.nextElement(); if (null != url) { String protocol = url.getProtocol(); if (protocol.equals("file")) { String packagePath = url.getPath().replaceAll("%20", " "); addClass(classSet, packagePath, packageName); } else if (protocol.equals("jar")) { JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); if (jarURLConnection != null) { JarFile jarFile = jarURLConnection.getJarFile(); if (jarFile != null) { Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry jarEntry = entries.nextElement(); String jarEntryName = jarEntry.getName(); if (jarEntryName.endsWith(".class")) { String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", "."); doAddClass(classSet, className); } } } } } } } } catch (Exception e) { LOGGER.error("获取classSet 失败", e); throw new RuntimeException(e); } return classSet; } private static void addClass(Set<Class<?>> classSet, String packagePath, String packageName) { File[] files = new File(packagePath).listFiles(new FileFilter() { public boolean accept(File file) { return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory(); } }); for (File file : files) { String fileName = file.getName(); if (file.isFile()) { String className = fileName.substring(0, fileName.lastIndexOf(".")); if (StringUtils.isNotEmpty(packageName)) { className = packageName + "." + className; } doAddClass(classSet, className); } else { String subPackagePath = fileName; if (StringUtils.isNotEmpty(packagePath)) { subPackagePath = packagePath + "/" + subPackagePath; } String subPackageName = fileName; if (StringUtils.isNotEmpty(packageName)) { subPackageName = packageName + "." + subPackageName; } addClass(classSet, subPackagePath, subPackageName); } } } private static void doAddClass(Set<Class<?>> classSet, String className) { Class<?> cls = loadClass(className, false); classSet.add(cls); } }
3.2、反射工具类
package com.lhx.smart.framework.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 反射工具类 */ public final class ReflectionUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ReflectionUtil.class); /** * 创建实例 * * @param cls * @return */ public static Object newInstance(Class<?> cls) { Object instance; try { instance = cls.newInstance(); } catch (Exception e) { LOGGER.error("实例化失败", e); throw new RuntimeException(e); } return instance; } /** * 调用方法 * * @param obj * @param method * @param args * @return */ public static Object invokeMethod(Object obj, Method method, Object... args) { Object result; try { method.setAccessible(true); result = method.invoke(obj, args); } catch (Exception e) { LOGGER.error("调用方法失败", e); throw new RuntimeException(e); } return result; } public static void setFiled(Object obj, Field field, Object value) { try { field.setAccessible(true); field.set(obj, value); } catch (Exception e) { LOGGER.error("参数设置失败", e); throw new RuntimeException(e); } } }