组合注解与元注解
文章目录
- 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个类和一个接口,最终整个项目的结构如下图所示:
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",效果如下:
可以看到,程序在使用@NewConfiguration注解时,等同于使用了@Configuration和@ComponentScan这两个注解。