Jersey 中自带一个包扫描,可以是包,或者具体类名 ,扫描的类型是自己定注解类型,实现功能更加大,可以是jar 包 可以是虚拟地址下的

Jersey 主要用来扫描Path Provider 类中同时包括以上的Annotation,使用Jersey 包扫描只需要三步。

 String aa[] = new String[]{"com.jerweb"};
Scanner scanner = new PackageNamesScanner(checkNotNull(aa));
final AnnotationScannerListener asl = new PathProviderScannerListener();
scanner.scan(asl);
Set<Class<?>> sets= asl.getAnnotatedClasses();

1、包地址传入PackageNamesScanner

2、自定义的注解实现AnnotationScannerListener 的子类

3、scan

查看Jesery PathProviderScannerListener源码

 public final class PathProviderScannerListener extends AnnotationScannerListener {

     /**
* Create a scanning listener to check for Java classes in Java
* class files annotated with {@link Path} or {@link Provider}.
*
*/
public PathProviderScannerListener() {
super(Path.class, Provider.class);
} /**
* Create a scanning listener to check for Java classes in Java
* class files annotated with {@link Path} or {@link Provider}.
*
* @param classloader the class loader to use to load Java classes that
* are annotated with any one of the annotations.
*/
public PathProviderScannerListener(ClassLoader classloader) {
super(classloader, Path.class, Provider.class);
}
}

很简单。自定义实现AnnotationScannerListener 的子类,就可以用来扫描自定义注解

@Inherited
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Err {
String value();
}
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
String value();
}
public class ErrInfoScannerListener extends AnnotationScannerListener {

    public ErrInfoScannerListener() {
super(Err.class, Info.class);
} /**
* Create a scanning listener to check for Java classes in Java
* class files annotated with {@link Err} or {@link Info}.
*
* @param classloader the class loader to use to load Java classes that
* are annotated with any one of the annotations.
*/
public ErrInfoScannerListener(ClassLoader classloader) {
super(classloader, Err.class, Info.class);
}
}

测试以上代码

 public static void main(String[] args)
{
String aa[] = new String[]{"com.jerweb"};
Scanner scanner = new PackageNamesScanner(checkNotNull(aa));
final AnnotationScannerListener asl = new PathProviderScannerListener();
final AnnotationScannerListener asl1 = new ErrInfoScannerListener();
scanner.scan(asl1);
scanner.scan(asl);
Set<Class<?>> sets1 = asl1.getAnnotatedClasses();
Set<Class<?>> sets= asl.getAnnotatedClasses(); }

Maven 引用包

         <dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.18.1</version>
</dependency>

使用jersey 注解包扫描类PackageNamesScanner的更多相关文章

  1. Java 扫描实现 Ioc 动态注入,过滤器根据访问url调用自定义注解标记的类及其方法

    扫描实现 Ioc 动态注入 参考: http://www.private-blog.com/2017/11/16/java-%e6%89%ab%e6%8f%8f%e5%ae%9e%e7%8e%b0-i ...

  2. spring的compentScan注解扫描类机制

    1主要通过ConfigurationClassParser类的doProcessConfigurationClass(ConfigurationClass configClass, SourceCla ...

  3. spring 排除指定的类或者包扫描

    <!-- 排除Controller注解的扫描 --> <context:component-scan base-package="exampleBean"> ...

  4. 记录一下SpringMVC扫描注解包的配置

    最近做了一个小项目,使用Spring4+SpringMVC+Hibernate5 但是整合完毕了之后,在页面上请求添加记录的时候发现无法开启事务,报错的信息如下: org.springframewor ...

  5. Spring IoC 源码分析 (基于注解) 之 包扫描

    在上篇文章Spring IoC 源码分析 (基于注解) 一我们分析到,我们通过AnnotationConfigApplicationContext类传入一个包路径启动Spring之后,会首先初始化包扫 ...

  6. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?

    阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...

  7. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)

    实现功能 1.我们看到@ComponentScan注解一个开始定义就是需要支持,扫描多个包,将多个包的类名获取到.现在就实现这个功能. 实现思路 根据传入的字符串数组,获得多个包下的类全限制名. 实现 ...

  8. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  9. SpingMVC的<context:component-scan>包扫描踩坑记录

        公司项目配置的Spring项目的包扫描有点问题,出现了一个被Spring容器管理的Bean被创建了2次的现象.在此记录下解决的过程,方便后续查阅. 改动前: 容器启动监听器中会扫描全部包,创建 ...

随机推荐

  1. Range Modular Queries

    Range Modular Queries 题意 给出一个数列,q个查询,问查询区间内有几个数 a[i] % x == y. 分析 其实裸的分块就能过了,跑的还特别快. 这里分块的作用就是排序. 在x ...

  2. poj3648

    poj3648 题意 有一对新人结婚,n-1对夫妇去参加婚礼.有一个很长的座子,新娘与新郎坐在座子的两边(相反).接下来n-1对夫妇就坐,其中任何一对夫妇都不能坐在同一边,且(有一些人有奸情)这些有奸 ...

  3. hdu 5975---Aninteresting game(树状数组)

    题目链接 Problem Description Let’s play a game.We add numbers 1,2...n in increasing order from 1 and put ...

  4. Webpack插件开发简要

    背景 如今'大前端'这个概念在前端界大热,说'大前端',我们就要提到'前后端分离','前后端分离'又离不开'本地开发构建','本地开发构建'自然离不开webpack,webpack想要工作,那它就需要 ...

  5. vue入门须知

    1.vue基本结构 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...

  6. linux系统必学-部分链接

    vi操作笔记 vim操作笔记 好网站,临时收藏  SEO十万个为什么 9RIA.com天地会--中国最大的专业Flash论坛 ===互联网=============================== ...

  7. datagrid 添加、修改、删除(转载)

    原链接:JQueryEasyUI学习笔记(十)datagrid 添加.修改.删除 基于datagrid框架的删除.添加与修改: 主要是批量删除,双击表单修改.选中行修改,增加行修改,再有就是扩展edi ...

  8. winfrom DataSet和实体类的相互转换

    最近做WInfrom项目,对表格和控件的数据绑定非常喜欢用实体类对象来解决,但是绑定以后 又怎么从控件中拿到实体类或者转换为datatable 或者dataset呢 经过在网上的搜索以及自己的改进 完 ...

  9. SICIP-1.3-Defining a new function

    定义函数 def <name> (former parament): 函数体(缩进) 环境 全局环境 局部环境 只在函数内部有效 TIP 函数体只在调用的最后执行 抽象化函数 函数域(函数 ...

  10. jQuery时间日期插件laydate,兼容bootstrap

    解压后,将laydate整个文件放至您项目的任意目录,不要移动其文件结构,它们具有完整的依赖体系. 使用只需在页面引入laydate.js即可. 如果您的网站的js采用合并或模块加载,您需要打开lay ...