2025/12/25 17:16:32
网站建设
项目流程
织梦网做网站步骤,北京设计网站,网站的ftp信息,水冷眸WordPress1 对比组件核心用途主要应用场景过滤器 (Filter)在请求到达Servlet之前或响应返回客户端之前#xff0c;对原始的ServletRequest和ServletResponse进行预处理或后处理。字符编码设置、敏感词过滤、URL级别的权限认证、请求日志记录。12拦截器 (Interceptor)在请求进…1 对比组件核心用途主要应用场景过滤器 (Filter)在请求到达Servlet之前或响应返回客户端之前对原始的ServletRequest和ServletResponse进行预处理或后处理。字符编码设置、敏感词过滤、URL级别的权限认证、请求日志记录。12拦截器 (Interceptor)在请求进入Controller方法前后以及视图渲染前后对请求进行拦截和处理。它基于Spring的反射机制。权限认证、审计日志、请求参数预处理、响应数据包装。12切面 (AOP)通过“切面”技术在不修改目标方法代码的情况下横向切入业务逻辑实现功能的扩展和解耦。它基于动态代理如JDK Proxy或CGLIB。方法级别的权限控制、日志记录、事务管理、缓存操作、方法执行时间监控。13ControllerAdvice全局异常处理和数据绑定/预处理专门用于增强Controller层。也是基于AOP统一的全局异常处理、统一的数据格式化、统一的请求参数预处理。13使用过程中需要注意执行顺序和和优先级。2 Servlet在Java Web应用程序中Servlet是处理HTTP请求和响应的核心组件Servlet的生命周期:1 加载和实例化当服务器启动时会加载web.xml中配置的Servlet或者在注解为WebServlet的类。服务器将为每个Servlet创建一个实例。2. 初始化在Servlet实例创建后会调用init(ServletConfig config)方法进行初始化。这个方法通常用于执行仅需执行一次的初始化操作比如加载资源文件、打开数据库连接等。3. 请求处理当客户端发送请求到服务器时服务器会调用Servlet的service(ServletRequest req, ServletResponse res)方法。在Servlet 3.0及更高版本中推荐使用doGet(HttpServletRequest request, HttpServletResponse response)和doPost(HttpServletRequest request, HttpServletResponse response)等方法来分别处理GET和POST请求。4. 服务在每次接收到新的请求时service方法或相应的doXxx方法会被调用用于处理请求并生成响应。5. 销毁当Web应用被卸载或服务器关闭时会调用Servlet的destroy()方法。这个方法用于释放资源比如关闭数据库连接、停止线程等。注意事项单例性默认情况下Servlet是单例的即整个Web应用生命周期内只会有一个Servlet实例。这意味着所有的客户端请求将共享同一个Servlet实例。如果Servlet需要处理大量并发请求应确保其线程安全。多线程由于Servlet是单例的多个请求可能会并发地执行service方法或其子方法如doGet, doPost。因此编写Servlet时需要考虑线程安全。可以使用同步块或并发工具类来管理共享资源的访问。生命周期管理可以通过覆盖init和destroy方法来管理资源的初始化和清理工作。对于非单例的Servlet可以使用WebServlet(value/path, loadOnStartup1)注解来控制加载顺序和时机3 动态代理维度Java动态代理基于JDKCGLIB代理基于ASM实现原理通过反射机制生成实现目标接口的代理类通过ASM字节码操作生成目标类的子类适用场景目标类必须实现接口目标类无需实现接口支持类级别的代理性能通常稍逊于CGLIB但差异可忽略性能更优尤其在无接口场景下限制无法代理final类或方法无法代理final类实现方式java.lang.reflect.ProxyInvocationHandlernet.sf.cglib.proxy.Enhancer使用场景接口多、结构清晰的项目无接口类、老项目或性能敏感场景JDK Proxy反射和接口import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // 定义目标接口 interface TargetInterface { void doSomething(); } // 实现目标接口 class TargetImpl implements TargetInterface { Override public void doSomething() { System.out.println(TargetImpl method); } } // 代理处理器 class TargetProxy implements InvocationHandler { private TargetInterface targetInterface; public TargetProxy(TargetInterface targetInterface) { this.targetInterface targetInterface; } Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName() 前置处理); Object result method.invoke(targetInterface, args); System.out.println(method.getName() 后置处理); return result; } public TargetInterface getProxyInstance() { return (TargetInterface) Proxy.newProxyInstance( TargetProxy.class.getClassLoader(), targetInterface.getClass().getInterfaces(), this ); } } // 测试类 public class JDKDynamicProxyExample { public static void main(String[] args) { TargetInterface target new TargetImpl(); TargetProxy proxyHandler new TargetProxy(target); TargetInterface proxy proxyHandler.getProxyInstance(); proxy.doSomething(); } }CGLIbSM字节码操作生成目标类的子类public class TargetClass { public void doSomething() { System.out.println(TargetClass.doSomething()执行); } public String getValue(String input) { return 处理结果: input; } } import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class MyMethodInterceptor implements MethodInterceptor { Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println(前置增强: method.getName()); Object result proxy.invokeSuper(obj, args); // 调用父类方法 System.out.println(后置增强: method.getName()); return result; } } import net.sf.cglib.proxy.Enhancer; public class CglibProxyDemo { public static void main(String[] args) { // 创建Enhancer对象 Enhancer enhancer new Enhancer(); // 设置父类 enhancer.setSuperclass(TargetClass.class); // 设置回调 enhancer.setCallback(new MyMethodInterceptor()); // 创建代理对象 TargetClass proxy (TargetClass) enhancer.create(); // 调用方法 proxy.doSomething(); String result proxy.getValue(CGLIB测试); System.out.println(result); } }