目录
一、Spring依赖注入(DI)的大环境
1.Spring 依赖注入(DI)所处的大环境
所谓的控制翻转(IOC:Inversion of Control)即为:不需要你来找我,我去找你就好。而控制反转有两种实现方式:DL 和 DI,其中 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">
(原创不易,转载请注明出处!!)