chapter 2:
饮水思源:回顾与探索Spring框架本质
IoC其实有两种方式,一种是DI(dependency Injection),一种是DL(dependency Lookup 依赖查找,前者是当前实体被动接受其依赖的其他组件被IoC容器注入,而后者则是当前实体主动去某个服务地查找其依赖的那些服务。
我们通常提到的Spring IoC,实际上是指Spring框架提供的IoC容器实现(IoC Container),而使用Spring IoC容器的一个经典代码片段就是从上下文类中获取bean,然后去使用bean。获取bean的过程实际上就是DL的工作,而构建任何一种IoC容器背后(BeanFactory,ApplicationContext)发生的事情,则更多是DI的过程。
Spirng IoC容器的依赖注入工作可以分为两个阶段:
阶段一:收集和注册
通过XML或者java代码的方式定义一些bean,然后通过手动组装或者让容器基于某些机制制动扫描的形式,将这些bean定义收集到IoC容器中。
阶段二:分析和组装
第一个阶段完成之后,我们可以暂且认为IoC容器中充斥着一个个独立的bean,他们之间没有任何关系。但实际上他们之间是有依赖关系的,所以,第二阶段,IoC容器就是分析这些已经在IoC容器之中的bean,根据他们之间的依赖关系先后组装他们。如果IoC容器发现一个bean依赖另一个bean,它就会将这个bean注入给依赖他的那个bean,知道所有bean的依赖都注入完成,所有的bean 都整装待发,整个IoC容器的工作即算完成。Spring最早通过xml配置文件的形式来描述bean与bean之间的关系,现在则基于代码和Annotation元信息的描述更为流行(比如@Autowired,@Inject)。
 
了解一点儿JavaConfig
1.表达形式层面
基于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"
xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.1.xsd">
</beans>
而基于JavaConfig的配置方式是这样的:
@Configuration
public class MockConfiguration{
  //bean 定义
}
任何一个标注了@Configuration的java类定义都是一个JavaConfig配置类。
2.定义bean定义层面
基于xml的配置形式是这样的:
<bean id="mockService" class="..MockServiceImpl">
  ...
</bean>
而基于JavaConfig的配置形式是这样的:
@Configuration
public class MockConfiguration{
  @Bean
  public MockService mockService(){
    return new MockServiceImpl();
  }
}
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器中,方法名将默认为该bean定义的id。
3.表达依赖注入关系层面
为了表达bean与bian之间的依赖关系,在xml中一般是这样的:
<bean id="mockService" class="..MockServiceImpl">
  <property name="dependencyService" ref="dependencyService"/>

</bean>

<bean id="dependencyService" class="DependencyServiceImpl"/>
而在JavaConfig中是这样的:
@Configuration
public class MockConfiguration{
  @Bean
  public MockService mockService(){
    return new MockServiceImpl(dependcyService());
  }
  @Bean
  public DependcyService dependcyService(){
    return new DependcyServiceImpl();
  }
}
如果是一个bean的定义依赖其他的bean,则直接调用对应的JavaConfig类中依赖的bean的创建方法就可以。
3. 那些高曝光的Annotation
1>@Configuration
2>@ComponentScan
  配合声明式注解,将这些注解的bean定义类批量采集到Spring的IOC容器中,可以通过basePackage等属性来细粒度地订制@ComponentScan自动扫描的范围,如果不指定,则默认S僻壤框架时间会从声明@ComponentScan所在的package进行扫描。

SpringBoot揭秘:快速构建微服务体系的更多相关文章

  1. Springboot揭秘-快速构建微服务体系-王福强-2016年5月第一次印刷

    JavaConfig项目: spring IOC有一个非常核心的概念——Bean.由Spring容器来负责对Bean的实例化,装配和管理.XML是用来描述Bean最为流行的配置方式.Spring可以从 ...

  2. 《SpringBoot揭秘 快速构建微服务体系》读后感(一)

    SpringIOC IOC有两种方式:一种是DI,另一种是DL,即Dependency Lookup(依赖查找).前者是当前软件实体被动接受其依赖的其他组件被IoC容器注入,而后者则是当前软件实体主动 ...

  3. 《SpringBoot揭秘 快速构建微服务体系》读后感(五)

    应用日志和spring-boot-starter-logging 快速web应用开发与spring-boot-starter-web 1.项目结构层面的约定

  4. 《SpringBoot揭秘 快速构建微服务体系》读后感(三)

    SpringApplication:SpringBoot程序启动的一站式解决方案 深入探索SpringApplication执行流程 因为书上的版本是1.2的,比较老,这里参考http://blog. ...

  5. 《SpringBoot揭秘 快速构建微服务体系》读后感(二)

    最简单的springBoot应用 package com.louis.test; import org.springframework.boot.SpringApplication; import o ...

  6. 《SpringBoot揭秘 快速构建微服务体系》读后感(四)

    再谈自动配置 基于条件的自动配置 调整自动配置的顺序

  7. [高清] SpringBoot揭秘快速构建微服务体系

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  8. SpringBoot 快速构建微服务体系 知识点总结

    可以通过http://start.spring.io/构建一个SpringBoot的脚手架项目 一.微服务 1.SpringBoot是一个可使用Java构建微服务的微框架. 2.微服务就是要倡导大家尽 ...

  9. 通过GeneXus如何快速构建微服务架构

    概览 “微服务”是一个非常广泛的话题,在过去几年里,市面上存在着各种不同的定义. 虽然对这种架构方式没有一个非常精确的定义,但仍然有一些概念具有代表性. 微服务有着许多围绕业务能力.自动化部署.终端智 ...

随机推荐

  1. php中实现的一个curl批处理的实例

    curl是利用URL语法在命令行方式下工作的开源文件传输工具 本文在php中实现了的一个curl批处理的实例. 代码如下: header("Content-Type:text/html;ch ...

  2. linux添加启动器图标(Ubuntu为例)

     添加启动器图标,以eclipse为例,%表示命令提示符,shell命令:%nano /usr/share/applications/eclipse.desktop-----------[Deskto ...

  3. 异常:java.lang.LinkageError: loader constraint violation: when resolving interface method

    异常:java.lang.LinkageError: loader constraint violation: when resolving interface method "javax. ...

  4. JavaScript 数据属性和访问器属性

    在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...

  5. Android Weekly Notes Issue #228

    Android Weekly Issue #228 October 23rd, 2016 Android Weekly Issue #228 本期内容包括: Android 7.1的App Short ...

  6. Android Weekly Notes Issue #227

    Android Weekly Issue #227 October 16th, 2016 Android Weekly Issue #227. 本期内容包括: Google的Mobile Vision ...

  7. Xcode 8 日志输出乱码问题

    更新到Xcode 8的同学应该都遇到了这个问题:用Xcode 8运行项目,日志会疯狂的刷,就像下面这种图一样:

  8. Android InputType详解

    android:inputType 如果设置android:inputType = "number",则默认弹出的输入键盘为数字键盘,且输入的内容只能为数字. InputType文 ...

  9. Allocators与Criterion的相同点及区别

    C++98: 1.相同点: Allocators having the same type were assumed to be equal so that memory allocated by o ...

  10. PostgreSQL-PL/pgSQL-cursor,loop

    将spam_keyword表word字段的字符全部拆分,只是利用过程语言完成循环的操作而已. create or replace function proc1() returns setof text ...