@EnableFindMe 是什么注解

176 阅读3分钟

1.@EnableFindMe是什么注解

当然是我自创的注解,但是,大家先别关闭这篇文章 这不是一个普通的自定义注解, 不知道大家看到@Enablexxxx有没有很熟悉的感觉,例如: @EnableDiscoveryClient @EnableTransactionManagement @EnableCircuitBreaker @EnableFeignClients 这些注解大家应该还比较熟悉吧,都是在开发微服务项目的时候,在启动类上常用的注解 ,他们的服务使用这些 注解提供了很多丰富的功能 ,那我们是不是也可以使用这样的形式提供丰富的功能呢 ,

2.实现@EnableFindMe注解

既然是自创的注解,那么我们就来实现这个注解,废话不多说,上代码

2.1.创建 customannotations模块 自定义注解

正常的spring boot项目的创建方式

然后把 启动类改成一个注解

pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    
      <build>
        <plugins>
            <plugin>
            <!--  手动指定maven打包的插件-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>

@EnableFindMe

@Target(ElementType.TYPE) //作用范围,可以作用在类,接口,注解,枚举
@Retention(RetentionPolicy.RUNTIME) // 在程序运行的时候起作用
@Documented  // 表明该注解标记的元素可以被Javadoc 或类似的工具文档化
@Inherited // 所标记的类的子类也会拥有这个注解
@Import(AutoConfiguration.class) // spring的注解,可以引入一个类,把这个类变成IOC的Bean
public @interface EnableFindMe {


}

AutoConfiguration.java

// 定义配置为配置文件  其实这里使用 @Component 也可以,我的目的只是为了 把这个类注入到IOC,
// 然后使得@ComponentScan这个注解起作用
@Configuration 
@ComponentScan("com.findme.customannotations.*") // 扫描这个目录下的文件,注入ICO中
public class AutoConfiguration {
    @PostConstruct
    public void init(){
        System.out.println("AutoConfiguration!!");
    }
}

IndexService.java

@Component // 扫描到了这个就会吧这个类注入到ICO
public class IndexService {
    // bean初始化的时候执行
    @PostConstruct
    public void init(){
        System.out.println("IndexService!!");
    }

}

2.2 创建一个普通的spring boot项目

这个项目就没什么特殊,先把刚才的 customannotations用maven打包,然后再这个项目上使用刚才的自定义注解

2.3运行看效果

2.3.1.使用注解和不使用注解的区别

1.使用注解

2.不使用注解

我们发现,当我们使用注解的时候IndexService和AutoConfiguration都被注册成ICO的Bean了,有没有很神奇,

我们平时写项目的时候,只要在spring boot项目下,使用 @Service @Component等注解 可以被注册成Bean,是因为@SpringBootApplication注解默认把本类包下有对应注解的类注册成bean (什么,你不相信)我们来看看效果

HelloService2在 启动类的下面,所以被注册上去了,而HelloService不在启动类的下面,所以没被注册到IOC

好,我们言归正传,又有好奇的同学就会问了,这有什么用啊,不就是把被注册到IOC中的bean的方式 改成了一个注解,我直接在 项目的启动类上使用 @ComponentScan("xxx") 扫描你的包,不也一样可以实现这些功能吗 ,当然不一样了,自定义注解装配有很多好处!!!

我们在会想想文章开头说的微服务地图的自定义注解 @EnableDiscoveryClient @EnableTransactionManagement @EnableCircuitBreaker @EnableFeignClients ,我们的开头是不是也是这种方式呢,通这样的方式,提供了自己的服务,和spring进行了深度整合

2.4使用自定义注解扫描包的好处

1.可以自己封装独立的starter,并且以注解的形式提供出去,

2.在自己封装的starter中可以,做很多处理,例如,在某个bean创建的时候加入一点自己的逻辑,自己配置后置处理器,和spring深度整合,当触发某种情况的时候,触发自己的后置处理器,做鉴权,当http请求来的时候,做统一的处理,等等等