springboot注解相关解析-自定义注解

spring注解深度解析(一)-springboot常用注解

一、spring自带注解的相关解析

常见的注解:

jdk自带的注解:

1、@Override注解
用于重写父类的方法 或者是写接口实现类时用到该注解。
2、@Deprecated注解
用于表示该方法是一个过期的方法。
3、 @suppressWarnings注解
表示该方法在编译时自动忽略警告。

spring框架的注解:

1、@Component 组件,没有明确的角色
2、@Service 在业务逻辑层(service层)使用
3、@Repository 在数据访问层(dao层)使用
4、@Controller 在controller控制层使用
5、@Autowired 自动装配(默认根据类型注入,可直接在字段属性上或set方法上使用)
6、@Value 注入SpEL表达式
7、@Qualifier 限定描述符一般与@Autowired配合使用可找到唯一的一个bean对象

解析spring注解原理@SpringBootApplication 核心启动注解,在点击进该注解之后,可以查看这个启动类的注解如下所示:

@Target(ElementType.TYPE) 	           //说明注解的作用范围,type指的是作用于类、接口或者枚举
@Retention(RetentionPolicy.RUNTIME) //注解的生命周期,保留到class文件中(三个生命周期)
@Documented  					    // 表明这个注解应该被javadoc记录
@Inherited						    // 子类可以继承该注解
@SpringBootConfiguration			    // 继承了Configuration,表示当前是注解类
@EnableAutoConfiguration			   // 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助
@ComponentScan(excludeFilters = {     // 扫描路径设置(具体使用待确认)
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation,其他三个注解只是对整合注解的作用范围及类型做了说明:

@SpringBootConfiguration(点开查看发现里面还是应用了@Configuration)
@EnableAutoConfiguration
@ComponentScan
所以,如果我们使用如下的SpringBoot启动类,整个SpringBoot应用依然可以与之前的启动类功能对等:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
          {"com.startdt.sgminiprogram", "com.startdt.startgo.common.bizcenter"}
)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

每次写着三个类比较冗余所以直接用一个类进行整合;

@Configuration

@Configuration该注解并不陌生,从字面意思我们就得知该注解是对配置的进行声明的注解模式,像以前在ssm框架的时候,经常会通过spring-mvc.xml文件对类的加载器及声明做相关配置,开始只是对单个类进行声明,但是总体来说比较麻烦,然后就通过scan所在类的java进行扫面加载Bean,但是在出现spring boot框架之后对该内容的封装,可以直接通过@Configuration+@Bean注解的方式对你需要初始化并加载到spring的IOC容器当中,方法名是该bean定义的id;

具体表达形式如下:
在ssm层面的xml配置的关系如下:



    

而基于注解的表现形式是下面这样子的:

@Configuration
public class MybatisConfig{
    //bean定义
    @Bean
    public ...
}
@ComponentScan

@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository还有@Service的一些类的加载等)或者bean定义,最终将这些bean定义加载到IoC容器中。

我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

@EnableAutoConfiguration

@EnableAutoConfiguration这个Annotation最为重要,所以放在最后来解读,大家是否还记得Spring框架提供的各种名字为@Enable开头的Annotation定义?比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和做事方式其实一脉相承,简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。

@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
@EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!

@EnableAutoConfiguration作为一个复合Annotation,其自身定义关键信息如下:

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

两个比较重要的注解:

@AutoConfigurationPackage:自动配置包

@Import: 导入自动配置的组件

AutoConfigurationPackage注解:

@Order(Ordered.HIGHEST_PRECEDENCE)
	static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

		@Override
		public void registerBeanDefinitions(AnnotationMetadata metadata,
				BeanDefinitionRegistry registry) {
			register(registry, new PackageImport(metadata).getPackageName());
		}

其实register(registry, new PackageImport(metadata).getPackageName())这个方法获取的是启动类下的同级包名及其所有子集包名,

springboot注解相关解析-自定义注解_第1张图片
此处返回的是com.startdt.sgminiprogram下的包下的所有包及子集包,所以application启动类一般都放在工程的最高层同一级,从而可以读到所有的类的加载;

你可能感兴趣的:(springboot)