(原创)Spring 依赖注入 - 简单总结 bean 的装配方法

目录

一、Spring依赖注入(DI)的大环境

二、综述

1.Spring提供三种主要的装配机制

三、要点记录

1.自动装配

2.基于Java风格的显示配置

3.基于XML的显示配置

四、JavaConfig和XML在配置中的相互引用


一、Spring依赖注入(DI)的大环境

1.Spring 依赖注入(DI)所处的大环境

所谓的控制翻转(IOC:Inversion of Control)即为:不需要你来找我,我去找你就好。而控制反转有两种实现方式:DLDI,其中 EJB 使用的就是 DL 的方式实现,但是由于其需要自己调用 API 来查找和组装对象,代码具有进入性,所以已经被抛弃。Spring 使用的是 DI 的方式,将装配的工作交给容器,而 Spring 的容器有两种:BeanFactory ApplicationContext,其中 BeanFactory 属于低级容器,通过 get 和 put 的方式使用,ApplicationContext 属于高级容器,用得更多。

2.Spring 依赖注入(DI)的本质:装配

二、综述

1.Spring提供三种主要的装配机制

  • 隐式的bean发现机制和自动装配
  • 基于Java风格的显示配置
  • 基于XML的显示配置

推荐使用顺序:自动装配 > JavaConfig > XML

(注意:Spring的多种装配机制可以相互结合使用)

三、要点记录

1.自动装配

Spring自动装配的实际过程:组件扫描(component scanning) -> 自动装配(autowiring)

1.1 用于将POJO纳入Spring容器管理的注解含义:

@Controller 控制器层

@Service 服务层

@Repository 数据持久层

@Component 普通组件

Spring 支持使用 Java 依赖注入规范所提供的 @Named 作为 @Component 的替代方案,两者只有细微的差别,基本可以互相替换。

1.2 启动组件扫描

@ComponentScan 注解默认将配置类所在的包作为基础包来扫描组件,当我们想将配置类统一放置在同一个包中,使其与业务代码分离时,可以使用 @ComponentScan 的 value 属性指明基础包的包名,或更清晰的使用 basePackages 或 basePackagesClasses 属性指明一个或多个包。

但注意区分:

basePackages:类型不安全

basePackagesClasses:类型安全,且建议考虑使用空标记接口,利于代码重构

1.3 自动装配注解

@Autowired 可以用在构造器、Setter() 方法或类的任何方法上。

自动装配的三种情况:

a.当上下文存在多个满足依赖关系的 bean 时,Spring将抛出异常,标明没有明确指定要选择哪个 bean 进行装配,此时需要通过其他手段解决自动装配的歧义性。

b.当上下文只有一个 bean 满足依赖关系时,将会被注入。

c.当上下文没有满足依赖条件的 bean 时,Spring 将在创建应用上下文时抛出异常,此异常可以通过将 @Autowired 的 required 属性设置为 false 来避免,但是此时注入对象将为 null,需要注意规避空指针异常。

Spring 支持使用 Java 依赖注入规范所提供的 @Inject 作为 @Autowired 的替代方案,两者只有细微的差别,基本可以互相替换。

2.基于Java风格的显示配置

2.1 如何创建一个 JavaConfig 类?

关键在与为一个普通类加上 @Configuration 注解,此时这个普通类就是一个配置类,此类中带有 @Bean 注解的方法返回的对象将注册为应用上下文中的 bean,且方法的方法体包含生产bean实例的逻辑,且该逻辑可以采用任何必要的语法来产生 bean,仅仅受到 Java 语言的限制。

2.2 默认情况下,Spring 中的 bean 都是单例的,即便是一个 @bean 的方法体调用了另外一个 bean,Spring 也会拦截对方法的调用,而直接返回应用上下文中已经存在的 bean,注意,此处的 bean 甚至可以是通过自动装配或XML显示配置的 bean。

2.3 若使用纯 JavaConfig 的方法,则最终要使用应用上下文的 getBean() 方法来获取注入的 bean。

3.基于XML的显示配置

3.1 基于XML规范配置的缺陷:

在配置中,bean 的类型以字符串的形式设置在 class 属性中,无法保证拼写正确,或对应的类发生过重命名。建议借助能够感知 Spring 功能的 IDE 来确保 XML 的合法性。

3.2 XML实现构造器注入的2种方法:

a.元素 <constructor-arg >

b.Spring 3.0 引入的c-命名空间(无法装配集合,可以使用参数名、参数的素引数字、直接根据参数的排列顺序三种方法)

3.3 XML设置属性的2种方法:

a.元素 <property >

b.p-命名空间(无法装配集合,但是可以借助 Spring 的 util- 命名空间实现)

3.4 XML 启动组件扫描 :

<context:component-scan>

3.5 若使用纯 XML 的方法,则最终要使用应用上下文的 getBean() 方法来获取注入的 bean。

四、JavaConfig和XML在配置中的相互引用

1 在 JavaConfig 中引入其它 JavaConfig :@Import(XXConfig.class)

2 在 JavaConfig 中引入其它 XML :@ImportResource("classpath:xxconfig.xml")

3 在 XML 中引入其他 XML :< import resource="xxconfig.xml">

4 在 XML 中引入其他 XML :< bean class="aa.bb.Config">

 

 

(原创不易,转载请注明出处!!)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值