组合注解与元注解




文章目录

  • 1.概述
  • 2.新建包
  • 3.新建组合注解NewConfiguration
  • 4.测试Bean
  • 5.定义配置类
  • 6.定义测试主类Main
  • 7.测试






1.概述

从Spring 2开始,为了响应JDK 1.5推出的注解功能,Spring开始大量加入注解来替代xml配置。Spring的注解主要用来配置注入Bean,切面相关配置(@Transactional)。随着注解的大量使用,尤其相同的多个注解用到各个类中,会相当啰嗦。这就是所谓的模板代码,是Spring设计原则中要消除的代码。

所谓元注解其实就是可以注解到别的注解上的注解,被注解的注解称之为组合注解、是可能有点拗口,体会含义最重要),组合注解具备元注解的功能。Spring的很多注解都可以作为元注解,而且Spring本身已经有很多组合注解,如@Configuration就是一个组合@Component注解,表明这个类其实也是一个Bean。

我们在前面曾大量使用@Configuration和@ComponentScan注解到配置类上,有时候也许会觉得有点麻烦。下面我给出一个将这两个元注解组成一个组合注解的示例,这样我们就只需写一个注解就可以表示两个注解。





2.新建包

首先我们在 “src/main/java/com/study/spring/” 下建立一个新的包"ch3.annotation",并在此包下新建3个类和一个接口,最终整个项目的结构如下图所示:

Java元注解的默认值 spring元注解_Java元注解的默认值




3.新建组合注解NewConfiguration

新建NewConfiguration接口,内容如下:

package com.study.spring.ch3.annotation;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration      //组合@Configuration元注解
@ComponentScan      //组合@ComponentScan元注解
public @interface NewConfiguration {
    String[] value() default {};    //覆盖value参数(必不可缺)
}





4.测试Bean

定义用于演示服务的Bean,DemoService,内容如下:

package com.study.spring.ch3.annotation;

import org.springframework.stereotype.Service;

@Service
public class DemoService {
    public void outputResult(){
        System.out.println("从组合注解配置获得的Bean");
    }
}





5.定义配置类

配置类DemoConfig的内容如下:

package com.study.spring.ch3.annotation;

@NewConfiguration("com.study.spring.ch3.annotation")    //使用@NewConfiguration组合注解代替@Configuration和@ComponentScan
public class DemoConfig {
}





6.定义测试主类Main

测试主类Main的内容如下:

package com.study.spring.ch3.annotation;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);
        DemoService demoService = context.getBean(DemoService.class);
        demoService.outputResult();
    }
}





7.测试

选择刚刚建立的测试主类Main文件,右键,在弹出的窗体中选择"Run",效果如下:

Java元注解的默认值 spring元注解_酱懵静_02


可以看到,程序在使用@NewConfiguration注解时,等同于使用了@Configuration和@ComponentScan这两个注解。