1.@EnableFindMe是什么注解
当然是我自创的注解,但是,大家先别关闭这篇文章 这不是一个普通的自定义注解,
不知道大家看到@@Enablexxxx有没有很熟悉的感觉,例如: @EnableDiscoveryClient @EnableTransactionManagement @EnableCircuitBreaker @EnableFeignClients 这些注解大家应该还比较熟悉吧,都是在开发微服务项目的时候,在启动类上常用的注解 ,他们的服务使用这些 注解提供了很多丰富的功能 ,那我们是不是也可以使用这样的形式提供丰富的功能呢 ,
2.实现@EnableFindMe注解
既然是自创的注解,那么我们就来实现这个注解,废话不多说,上代码
2.1.创建 customannotations模块 自定义注解
正常的spring boot项目的创建方式
然后把 启动类改成一个注解
pom.xml
org.springframework.boot
spring-boot-starter
<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请求来的时候,做统一的处理,等等等