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配置的关系如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-lazy-init="true">
    <!--bean定义-->
</beans>

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

@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())这个方法获取的是启动类下的同级包名及其所有子集包名,

在这里插入图片描述
此处返回的是com.startdt.sgminiprogram下的包下的所有包及子集包,所以application启动类一般都放在工程的最高层同一级,从而可以读到所有的类的加载;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个快速开发框架,它提供了许多方便的功能,包括自定义注解和自定义解析器。下面将分别介绍这两个功能。 自定义注解可以在Spring Boot应用中定义特定的标记,然后通过注解处理器对标记的领域和实现逻辑进行解析和处理。通过自定义注解,我们可以在代码中添加特定的注解标记,然后通过自定义解析器将标记的信息提取出来,并根据标记的信息完成相应的操作。 例如,我们可以定义一个自定义注解@Inject,用于标记需要自动注入的对象。然后,我们可以使用自定义解析解析这个注解,并根据注解的信息完成对象的自动注入操作。 自定义解析器可以实现一些自定义逻辑,用来解析注解并执行相应的操作。在Spring Boot中,我们可以通过使用反射机制获取类的字段信息,然后根据字段上的注解信息进行对象的自动注入。 在自定义解析器中,我们可以遍历类的字段,判断字段上是否存在我们定义的注解。如果存在注解,则根据注解的信息创建相应的对象,并将其注入到目标字段中。 通过自定义注解和自定义解析器,我们可以实现对象的自动注入操作,从而简化了代码的编写和维护,提高了开发效率。 总结:Spring Boot提供了自定义注解和自定义解析器的功能,通过这两个功能,我们可以在应用中实现对象的自动注入操作,从而简化了代码的编写和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值