理解Spring注解以及发展历程

1. 认识Spring注解

Spring目前是目前最最最火的Java框架,而且在这基础上发展的SpringBoot,SpringCloud也都有很多人用,我们已经习惯了使用注解的方式开发,所以也可以了解Spring注解驱动发展的过程。

2. Spring注解发展历程

2.1 Spring1.x注解驱动启蒙阶段

此时Java5刚刚发布,正在流行Annotation风格,Spring1.2提供了@Transactional和@ManagedResource,但是此时装载Bean还是通过XML配置的方式

 <bean name="DemoSerivce" 
class="com.tiger.example.spring.v1.DemoService01"/>

2.2 Spring2.x注解驱动发展重要阶段

  • Spring2.0发展了@Required,@Repository,@Aspect等
  • Spring2.5提供了非常重要的注解@Autowired@Qualifier以及@Component@Service@Controller等注解,这些都是我们现在开发中还在使用的注解
    此时Spring并没有完全去XML化,还需要通过在XML中配置
<context:component-scan 
base-package="com.tiger.example.spring.v2">context:component-scan>

2.3 Spring3.x注解驱动的里程碑

  • Spring3.0中提供了@Configuration注解,此时可以完完全全的去XML化配置
@Configuration
public class SpringConfiguration {

    @Bean
    public DemoService03 getDeDemoService03(){
        return new DemoService03();
    }
}
  • @ComponentScan(basePackages="")配置扫描的路径
  • @Import导入其他配置类进行装载
@Configuration
@Import(ImportConfiguration.class) //扫描ImportConfiguration配置类并且加载
public class SpringConfiguration {

    @Bean
    public DemoService03 getDeDemoService03(){
        return new DemoService03();
    }
}
@Configuration
public class ImportConfiguration {

    @Bean
    public ImportService getImportService(){
        return new ImportService();
    }
}
  • @EnableXXX可以模块化的装载 eg:快速开启定时任务
@Configuration
@EnableScheduling
public class ScheduleConfiguration {

    @Bean
    public ScheduleService getScheduleService(){
        return new ScheduleService();
    }
}

2.4 Spring4.x注解完善阶段

Spring4.x提供了@Conditional注解,用来可以自定义条件完成Bean的初始化

@Configuration
public class SpringConfiguration {

    //条件注解 如果TigerCondition返回true初始化,否则不初始化
    @Conditional(TigerCondition.class)
    @Bean
    public DemoService getDemoService(){
        return new DemoService();
    }
}
public class TigerCondition implements Condition {
    
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // TODO 这里可以实现很多业务逻辑处理
        //返回false时 bean不实例化
        //return false;
        //返回true时 bean实例化
        return true;
    }
}

2.5 Spring5.x注解优化阶段

@Indexed是为了提升在ComponentScan扫描的性能 细节可以参考这里
Spring5–@Indexed注解

3. 小知识

3.1 Spring如何解决循环依赖

如果Class A和ClassB为循环依赖

  • 原则 Spring初始化Bean的顺序是 首先初始化当前Bean,在初始化依赖Bean
  • A中依赖B 首先初始化A 发现A中有B 此时A是半成品状态
  • 初始化B B中有A 将半成品的A对象设置到B中 B完成初始化
  • 然后A完成初始化

4. 总结

Spring2.x注解驱动的发展重要时期,提供了很多实用的注解,再到后面完全去XML配置以及提升性能,使Spring更受欢迎!
代码位置: tiger-spring-demo

你可能感兴趣的:(微服务核心)