Spring--基于Java配置的容器配置

本文深入探讨了Spring框架的非侵入性特性,通过Java配置实现容器配置。首先解释了非侵入式设计的概念,对比了侵入式与非侵入式框架的优缺点。接着详细介绍了如何在Java代码中使用注解,如@Configuration和@Bean,以及它们的区别。文章通过实例展示了如何使用AnnotationConfigApplicationContext实例化Spring容器,并讨论了@Component和@Bean的用法,包括声明bean、处理依赖、生命周期回调、指定作用域、自定义bean名称和别名。最后,文章提及了使用@Autowired进行依赖注入的情况。
摘要由CSDN通过智能技术生成

Spring的非侵入性–基于Java的容器配置介绍

一、Spring框架的非侵入性

1.前言

在上一篇博文中讲到,Spring允许以非侵入方式使用注解,无需接触目标组件的源代码。 要想真正理解这句话,我们就有必要先弄清楚非侵入式设计的概念了。

2.侵入式与非侵入式

  • 侵入式:代码结构要与所使用的技术产生依赖。
  • 非侵入式:使用一个新的技术不会或者基本不改变原有代码结构,原有代码不作任何修改即可。

3.侵入式框架与非侵入式框架

  1. 侵入式框架:引入了框架,对现有的类的结构有影响,需要实现框架某些接口或者基础某些特定的类。

    • 优点:侵入式可以使得用户的代码与框架更好的结合,充分利用框架提供的功能。
    • 缺点:侵入式让用户的代码对框架产生了依赖,不利于代码的复用,当去除框架的时候,程序就无法运行。
    • 例子:Struts1框架, Struts1代码严重依赖于Struts1 API,属于侵入性框架。
  2. 非侵入式框架:引入了框架,对现有的类结构没有影响,不需要实现框架某些接口或者特定的类。

    • 优点:代码对框架没有过多的依赖,允许所开发出来的应用系统能够在不用的环境中自由移植,不需要修改应用系统中的核心功能实现的代码
    • 缺点:无法复用框架提供的代码和功能
    • 例子:Spring框架,通过配置完成依赖注入就可以使用,当我们想换个框架,只需要修改相应的配置,程序仍然可以运行。

二、在Java代码中使用注解来配置容器

1.基础概念:@Bean@Configuration

@Configuration修饰的类和由@Bean修饰的方法组成了Spring Java配置的主要构件。

@Bean注解用于方法实例化,配置和初始化要由Spring IoC容器管理的对象。 使用的时候,@Bean注解的方法,所在的类需要用@Configuration来修饰,表示该类是作为Bean定义的来源,容器初始化时,需要扫描该类,进行自动装配。

@Configuration注解的类,表示该类的主要目的是作为Bean定义的来源。 此外,@Configuration类允许通过调用同一类中的其他@Bean方法来定义Bean间的依赖关系。 最简单的@Configuration类的内容如下:

@Configuration
public class AppConfig {
   

    @Bean
    public MyService myService() {
   
        return new MyServiceImpl();
    }
}

2. @Component@Bean的区别

@Component和@Bean都可以定义bean,但实际上@Component@Bean是做两个完全不同的事情,不应该混为一谈,具体比较如下:

  • @Component(和@Service@Repository)用于自动检测和使用类路径扫描自动配置bean。 注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。
  • @Bean用于显式声明单个bean,而不是让Spring像上面那样自动执行它。它将bean的声明与类定义分离,并允许您精确地创建和配置bean。

那我们在什么时候会使用@Bean?假设下,某天你想创建一个第三方的组件,但是你没有源代码,也就没办法使用@Component进行自动配置,这种时候使用@Bean就比较合适了。 又比如,具体采用哪个实现是依赖于某些参数的,在这种情况下@Bean无疑是更合适的选择。 示例如下:

@Bean
@Scope("prototype")
public SomeService someService(String state) {
   
    switch (state) {
   
    case 1:
        return new Impl1();
    case 2:
        return new Impl2();
    case 3:
        return new Impl3();
    default:
        return new Impl();
    }
}

3.使用AnnotationConfigApplicationContext实例化Spring容器

以下各节介绍了Spring 3.0中引入的AnnotationConfigApplicationContext。 这种通用的ApplicationContext实现,不仅能够接受@Configuration类作为输入,而且还可以接受普通的@Component类和带有JSR-330元数据注释的类。

  • 当提供@Configuration类作为输入时,@Configuration类本身将注册为Bean定义,并且该类中所有已声明的@Bean方法也将注册为Bean定义。
  • 提供@Component和JSR-330类时,它们将注册为bean定义,并且假定在必要时在这些类中使用了诸如@Autowired@Inject之类的DI元数据。
(1)作为AnnotationConfigApplicationContext构造函数的参数

@Configuration类用作输入,实例化AnnotationConfigApplicationContext,使得Spring容器的使用,完全不依赖XML。 如下面的示例所示:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值