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. Navisworks 提供了.NET, COM和NwCreate 三种API

    Navisworks 提供了.NET, COM和NwCreate 三种API.而通常我们说Navisworks API其实指的只是COM或.NET,因为NwCreate的功能比较特殊.待我一一道来: ...

  2. iOS学习笔记——滚动视图(scrollView)

    滚动视图:在根视图中添加UIScrollViewDelegate协议,声明一些对象属性 @interface BoViewController : UIViewController<UIScro ...

  3. 一段良好的程序永远不应该发生panic异常

    panic来自被调函数的信号,表示发生了某个已知的bug.一段良好的程序永远不应该发生panic异常 对于大部分程序而言,永远无法保证能够成功运行,因为错误原因往往超出程序员的控制范围.任何进行io操 ...

  4. Tomcat数据源(DataSource)简介

    JDBC2.0提供了javax.sql.DataSource接口,它负责建立与数据库的连接,在应用程序中访问数据库时不必编写连接数据库的代码,可以直接从数据源获得数据库连接 1.数据库和连接池 在Da ...

  5. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

  6. Arcmap中加载互联网地图资源

    本文转载自:http://blog.3snews.net/space.php?uid=6955280&do=blog&id=67981 前一段时间想在Arcmap中打开互联网地图中的地 ...

  7. js与native交互

    js与native交互 UIWebView Native调用JS,使用stringByEvaluatingJavaScriptFromString来解释执行js脚本. //script即为要执行的js ...

  8. vim的高亮查找操作

    使用了VIM这么久,却一直无法牢记一些基本的操作指令.今天查找一个关键字时,想不起来怎么查找“下一个”,于是google之并解决,顺便把有用的都贴过来罢. 查找指令:/xxx 往下查找?xxx 往上  ...

  9. js动态绑定click事件时function传参问题

    今天碰到了这样一个问题,我在javascript中动态创建了一个button, 然后我想给改button添加click事件,绑定的function想要传入一个变量参数, 一开始我想直接通过函数传参传进 ...

  10. Java开发代码性能优化总结

    代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...