组合注解与元注解
spring的注解主要用来配置bean,切面相关配置(@Transactional),
随着注解的大量使用,尤其相同的多个注解用到各个类中,会相当啰嗦。这就是所谓的模版代码,
是spring设计原则中要消除的代码。
所谓元注解其实就是可以注解到别的注解上的注解,被注解的注解称之未组合注解、可能有点拗口,
组合注解具备元注解的功能。
spring的很多主角都可以作为元主角,而且spring本省已经有很多组合注解,如:Configuration就是
spring的注解主要用来配置bean,切面相关配置(@Transactional),
随着注解的大量使用,尤其相同的多个注解用到各个类中,会相当啰嗦。这就是所谓的模版代码,
是spring设计原则中要消除的代码。
所谓元注解其实就是可以注解到别的注解上的注解,被注解的注解称之未组合注解、可能有点拗口,
组合注解具备元注解的功能。
spring的很多主角都可以作为元主角,而且spring本省已经有很多组合注解,如:Configuration就是
一个@Component主角,表明这个类其实也是一个bean。
一个组合注解。
定制组合注解:
package com.zh.ch3.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration //1组合@Configuration注解
@ComponentScan //2组合@ComponentScan注解
public @interface WiselyConfiguration {
String[] value() default{};//3覆盖value参数
}
演示组合注解所使用的bean
package com.zh.ch3.annotation;
import org.springframework.stereotype.Service;
@Service
public class DemoService {
public void outputResult(){
System.out.println("从组合注解配置照样获得bean");
}
}
使用组合注解注解演示bean
package com.zh.ch3.annotation;
@WiselyConfiguration("com.zh.ch3.annotation")//使用组合注解代替@Configuration、@ComponentScan元注解。
public class DemoConfig {
}
测试
package com.zh.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();
context.close();
}
}
结果:(组合注解免去了元注解的繁琐配置)
从组合注解配置照样获得bean