在阅读Spring框架源码的时候,还有没有印象,在每个package下面都会有一个package-info.java文件?如果没印象的话,可以再去瞅两眼,打开看看里面都有啥。那么这个文件是干什么用的?下面简单来聊聊!微信搜索公众号:"菜鸟封神记",选择适合自己的各种学习资料!持续分享一线大厂常用技术干货。

一、介绍

package-info.java首先是一个java源码文件,这个源码文件可以放到任意的java源码包里面。但是它不能通过创建普通java类的方式去创建,因为它的文件名字里有个'-',不符合java的变量命名规范。但是一些开发工具,例如常用的IDEA提供了直接创建package-info.java类的方法,可以去试试。

对于这个类,它的内容通常很简单,但是也有一定的规范,主要的作用是提供一些包级别的操作,例如:包级别的注释、包级别的注解、包级别的公共变量

二、使用方式

2.1、提供包级别的注释

在使用JavaDoc生成Java注释文档时,通常写在package-info.java上面的注释说明会被生成到文档中。例如spring源码中spring-beans模块中的org.springframework.beans包下的package-info.java文件,内容如下:

/**
 * This package contains interfaces and classes for manipulating Java beans.
 * It is used by most other Spring packages.
 */
@NonNullApi
@NonNullFields
package org.springframework.beans;

import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;

来看看对应的javadoc中的内容:链接:https://docs.spring.io/spring...
image.png
这种方式可以对一整个包的功能做一个简要说明。

2.2、包级别的注解

spring源码中,也有很多包级别的注解,但是注解好多都是嵌套格式的,比较复杂。简单举个例子,假设我们给别人提供了一个sdk,其中有一个包下的所有接口都需要升级,老的肯定不能直接删掉,只能先标注过期,那我们怎么标注呢?按照老的方式,一个类一个类标注。

那么有了包级别的注解之后,我们直接在这个包下面的package-info.java中标注这个注解,这个包中的所有class就都会被标注为过期,如下:
image.png
这样做之后,生成javadoc文档之后,可以在javadoc中看到整个包的一个情况。

2.3、包级别的公共变量

如果想在某一个包里面提供一些只有这个包下面可以使用的常量或者类,其他包不能使用。可以直接通过package-info.java实现。
示例代码
package-info.java

/**
 * @author wangbing
 */
package com.wb.spring.testpkg;

/**
 * @author wangbing
 * 包级别的类
 */
class PckInner {
}
/**
 * @author wangbing
 * 包级别的常量
 */
class PckInnerConstant {
 public static final String MY_CONSTANT = "My_Constant";
}

同一个包下的Test1.java

/**
 * @author wangbing
 */
public class Test1 {
 public static void main(String[] args) {
  // 可以正常引用到
  PckInner inner = new PckInner();
  String myConstant = PckInnerConstant.MY_CONSTANT;
 }
}

其他包下的Test2.java
image.png
在看一些其他源码的时候,你会发现也有很多package-info.java文件,这个文件作用虽没有那么复杂,但是毕竟学习嘛,多懂一点始终还是没有坏处的!

Spring源码类文章列表:https://segmentfault.com/a/11...


夏日寒冰
318 声望85 粉丝

忠实的技术爱好者,追求极致,喜欢总结一些自己用过的技术点,与他人交流分享。