zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    View Code

    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);
            }
        }
    }
    View Code
  • 相关阅读:
    枚举工具类:封装判断是否存在这个枚举
    MYSQL插入emoji报错解决方法Incorrect string value
    文件大小转换带上单位工具类(文件byte自动转KBMBGB)
    mysql 统计七天数据并分组
    mybatis plus 和 druid 版本导致LocalDateTime 不兼容问题
    Layui弹框中select下拉列表赋值回显
    查看环境版本
    Linux 常用命令
    安装jdk14的坑
    modbus_tk解析
  • 原文地址:https://www.cnblogs.com/bjlhx/p/7658313.html
Copyright © 2011-2022 走看看