プレーンジェーンサーブレットWebアプリケーションがあり、一部のクラスには次のアノテーションがあります。
@Controller
@RequestMapping(name = "/blog/")
public class TestController {
..
}
次に、サーブレットアプリケーションが起動したときに、@ Controllerアノテーションが付いているすべてのクラスのリストを取得し、次に@RequestMappingアノテーションの値を取得して辞書に挿入します。
これどうやってするの?
私はGuiceとGuavaも使用していますが、注釈に関連するヘルパーがあるかどうかはわかりません。
Reflections library を使用するには、探しているパッケージと注釈を指定します。
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(Controller.class);
for (Class<?> controller : annotated) {
RequestMapping request = controller.getAnnotation(RequestMapping.class);
String mapping = request.name();
}
もちろん、すべてのサーブレットを同じパッケージに配置すると、これが少し簡単になります。また、代わりにRequestMapping
アノテーションが付いているクラスを探すこともできます。これは、値を取得しようとしているクラスだからです。
注釈のスキャンは非常に困難です。実際には、すべてのクラスパスの場所を処理し、Javaクラス(* .class)に対応するファイルを検索する必要があります。
そのような機能を提供するフレームワークを使用することを強くお勧めします。たとえば、 Scannotation を確認できます。
Springを使用している場合、
AnnotatedTypeScanner
クラスと呼ばれるものがあります。
このクラスは内部で使用します
ClassPathScanningCandidateComponentProvider
このクラスには、classpathリソースを実際にスキャンするためのコードがあります。これは、実行時に使用可能なクラスメタデータを使用して行われます。
このクラスを拡張するか、同じクラスをスキャンに使用できます。以下はコンストラクタの定義です。
/**
* Creates a new {@link AnnotatedTypeScanner} for the given annotation types.
*
* @param considerInterfaces whether to consider interfaces as well.
* @param annotationTypes the annotations to scan for.
*/
public AnnotatedTypeScanner(boolean considerInterfaces, Class<? extends Annotation>... annotationTypes) {
this.annotationTypess = Arrays.asList(annotationTypes);
this.considerInterfaces = considerInterfaces;
}
Corn-cpsを試す
List<Class<?>> classes = CPScanner.scanClasses(new PackageNameFilter("net.sf.corn.cps.*"),new ClassFilter().appendAnnotation(Controller.class));
for(Class<?> clazz: classes){
if(clazz.isAnnotationPresent(RequestMapping.class){
//This is what you want
}
}
Mavenモジュールの依存関係:
<dependency>
<groupId>net.sf.corn</groupId>
<artifactId>corn-cps</artifactId>
<version>1.0.1</version>
</dependency>
詳細については、サイト https://sites.google.com/site/javacornproject/corn-cps にアクセスしてください