NO IMAGE

元註解:可以註解到別的註解上的註解。

組合註解:被元註解 註解的註解稱為組合註解,組合註解具備元註解的功能。

Spring很多註解都可以作為元註解,而且Spring本身已經有很多組合註解,如@Configuration就是一個組合了@Component的註解,表名這個類起始也是一個Bean。

定義組合註解@WiselyConfiguration代替@ComponentScan和@Configuration

1、定義註解

package com.chenfeng.xiaolyuh.annotation.combination;
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 // 組合@Configuration元註解
@ComponentScan // 組合@ComponentScan元註解
public @interface WiselyConfiguration {
String[] value() default {};// 覆蓋value引數
String[] basePackages() default {}; // 覆蓋basePackages引數
}

2、編寫測試Bean

package com.chenfeng.xiaolyuh.annotation.service;
import org.springframework.stereotype.Service;
@Service
public class DemoCombinationAnnotationService {
public void outputResult() {
System.out.println("從組合註解配置Bean照樣獲得Bean");
}
}

3、使用新定義註解編寫配置類

package com.chenfeng.xiaolyuh.annotation.config;
import com.chenfeng.xiaolyuh.annotation.combination.WiselyConfiguration;
@WiselyConfiguration(basePackages = "com.chenfeng.xiaolyuh.annotation")// 使用@WiselyConfiguration代替@ComponentScan和@Configuration
public class CombinationAnnotationConfig {
}

4、編寫測試類

package com.chenfeng.xiaolyuh.test;
import org.junit.After;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.chenfeng.xiaolyuh.annotation.config.CombinationAnnotationConfig;
import com.chenfeng.xiaolyuh.annotation.service.DemoCombinationAnnotationService;
public class SpringCombinationAnnotationTest {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CombinationAnnotationConfig.class);
@Test
public void contextTest() {
DemoCombinationAnnotationService demoCombinationAnnotationService = context.getBean(DemoCombinationAnnotationService.class);
demoCombinationAnnotationService.outputResult();
}
@After
public void closeContext() {
context.close();
}
}