SERVLET 十二月 27, 2020

Override same class

文章字数 7.5k 阅读约需 7 mins.

实际 Java Web 项目中经常会遇到这样的场景:希望对依赖的某个三方库中的行为进行覆盖式的定制(修改三方库中的某些行为),但并不希望发布定制的版本至私服。

通常在使用 WAR 包发布应用时,可将定...

查看全文

SERVLET 十二月 27, 2020

Override same class

文章字数 7.5k 阅读约需 7 mins.

实际 Java Web 项目中经常会遇到这样的场景:希望对依赖的某个三方库中的行为进行覆盖式的定制(修改三方库中的某些行为),但并不希望发布定制的版本至私服。

通常在使用 WAR 包发布应用时,可将定制的类编译成 class 文件,放入 WEB-INF/classes 路径中,即可覆盖放置在 WEB-INF/lib 路径下的三方库中同名类,达到定制的目的。

那么为什么可以这样?

在两个相同的 class 必须都存在于 JAR 包中时,又怎么实现这种需求呢?

Servlet 规范

Java(TM...

查看全文

JAVA 十二月 06, 2020

如何确定装载了哪个类

文章字数 4.3k 阅读约需 4 mins.

某些时候,我们可能希望知道 ClassLoader 里到底装载的是哪个 class,比如当两个 jar 包中存在 package 和 Class 名完全相同的两个类时。

在 java 命令的帮助信息中,有如下内容(部分):

$ java -help
用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32      使用 32 位数据模型 (如果可用...
查看全文

TOMCAT 八月 02, 2020

Tomcat 是怎么找到用来处理请求的 Servlet 的?

文章字数 14k 阅读约需 12 mins.

Servlet 注册到了哪? 中,我们找到了配置的 Servlet 被包装成了一个 StandardWrapper,以注册的 Servlet name 为 key 放入了其父容器(Context)一个 HashMap 里。那么当 Tomcat 收到一个请求的时候,是怎么找到对应的 Servlet 以对请求进行处理的呢?

先放一张图:

总的来说,这个过程分为两部分:

  1. 读取所有 Servlet 的配置,放入 Mapper 中;
  2. 将请求匹配到具体的 Servlet 上。

注:本文以 Tomcat...

查看全文

JAVA 七月 26, 2020

为什么应该设置 com.sun.management.jmxremote.rmi.port?

文章字数 5.1k 阅读约需 5 mins.

在使用 JMX 对 Java 应用进行监控时,一般会在启动时添加如下参数:

java \
-Djava.rmi.server.hostname=192.168.16.237 \
-Dcom.sun.management.jmxremote.rmi.port=2909 \
-Dcom.sun.management.jmxremote.port=9009 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management...
查看全文

SPRING 七月 19, 2020

谁动了我的异常 Plus

文章字数 5.9k 阅读约需 5 mins.

书接上文,在 谁动了我的异常? 中,有几个问题没说清楚,本文将继续进行说明。
为了方便,相关示例代码上传至了 https://github.com/AlphaHinex/proxy-in-spring

示例代码中,定义了如下内容:

ClassController 中定义了一个没有声明异常...

查看全文

JAVA 七月 12, 2020

为什么不建议使用双括号初始化?

文章字数 2.6k 阅读约需 2 mins.

Map<String, Object> map = new HashMap<String, Object>() {{
    put("name", "Alpha");
    put("age", 8);
}};

以下内容引自 The Java™ Tutorials - Initializing Fields

Initializing Instance Members

Normally, you would put code to initialize an instance variable...

查看全文

SPRING 六月 26, 2020

谁动了我的异常?

文章字数 11k 阅读约需 10 mins.

通常来讲,为方便开发,我们会对异常进行统一的处理。会定义一个异常基类,针对基于这个基类的自定义异常进行统一处理。

当异常基类为检查型异常(Checked Exception)时,如果自定义异常是通过切面等代理抛出的,被代理的方法本身并未抛出且也未声明此异常时,就会遇到这个问题:

统一异常处理方法中,捕获到的异常,已不是代理类中抛出的自定义异常,而是一个将自定义异常包装在内的 java.lang.reflect.UndeclaredThrowableException

那么为什么会这样呢?

以使...

查看全文

JAVA 六月 19, 2020

Gradle HTTP 超时设置

文章字数 3.1k 阅读约需 3 mins.

在使用 Nexus 时,很罕见的遇到了超时问题:

> Unable to load Maven meta-data from http://localhost:8081/repository/test/io/github/alphahinex/example/0.1.2-SNAPSHOT/maven-metadata.xml.
   > Could not HEAD 'http://localhost:8081/repository/test/io/github/alphahinex...
查看全文

SPRING 四月 30, 2020

Servlet 注册到了哪?

文章字数 4.1k 阅读约需 4 mins.

还在给每个请求加前缀避免模块间接口冲突呢? 中内容,我们可以通过 ServletRegistrationBean 注册多个 DispatcherServlet,那么 Servlet 被注册到哪了呢?

简单的回答:Servlet 容器。

没毛病!但马达马达大内!注册到了 Servlet 容器里的哪?存在什么结构里?

让我们以 Tomcat 容器为例,刨根问底。

ServletRegistrationBean 中,有一个 addRegistration 方法,将具体的 Servlet 添加到...

查看全文

SPRING 四月 24, 2020

还在给每个请求加前缀避免模块间接口冲突呢?

文章字数 3.8k 阅读约需 3 mins.

Spring MVC 按模块开发时,可能经常会遇到这个场景:一个模块由一个开发人员负责开发,模块内能较好的保证 RequestMapping 的 path 不重复,但模块间就很难有效的方式保证唯一。

通常有两种处理方式:

  1. 对开发进行规范或约定,为每个模块起一个前缀,要求在模块内开发的所有 controller 都带上前缀,这样就只要保证模块内唯一即可。
  2. 每个模块部署为单独的服务,通过 servlet context path 进行区分。

两种方式都能解决问题,但同时也都会带来一些问题:

  1. 依...
查看全文
加载更多
0%