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. Basic Tutorials of Redis(2) - String

    This post is mainly about how to use the commands to handle the Strings of Redis.And I will show you ...

  2. 【WP8.1】WebView笔记

    之前在WP8的时候做过WebBrowser相关的笔记,在WP8.1的WebView和WebBrowser有些不一样,在这里做一些笔记 下面分为几个部分 1.禁止缩放 2.JS通知后台C#代码(noti ...

  3. 关于Agile Scrum的笔记

    Roles: Scrum Master -- advisor but leader, 替Team消除障碍 Product Owner -- 定sprint的交付内容, 优先级 Team -- 干活的, ...

  4. java中易遗忘的知识,不定时更新……

    如果有人问你: "子类继承父类所有非私有(private)的属性和方法这句话对吗?", 如果你回答对的, 那我只能说too young too simple! 关于代码块和成员变量 ...

  5. Effective java笔记(一),创建与销毁对象

    1.考虑用静态工厂方法代替构造器 类的一个实例,通常使用类的公有的构造方法获取.也可以为类提供一个公有的静态工厂方法(不是设计模式中的工厂模式)来返回类的一个实例.例如: //将boolean类型转换 ...

  6. HTTPS和HTTP的区别

    (转自:http://www.php100.com/html/it/biancheng/2015/0209/8582.html) 总的来说,http效率更高,https安全性更高. 首先谈谈什么是HT ...

  7. 实现一个基于 SharePoint 2013 的 Timecard 应用(上)

    在 SharePoint 2013 上面实现一个 Timecard 应用的想法来自一个真实的需求,而实现的方案在我脑海里面盘旋已经很久了,终于这几天准备安排点儿时间将它实现出来. “ We start ...

  8. iOS获取网络图片大小

    在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件.但是对于网络图片来说,要想 ...

  9. mvc mvp mvvm模式的区别

    mvc模式中,Model不依赖于View,但是View是依赖于Model的,m和v没有进行完全的分离,三者之间是单向的操作 mvp模式中,m和v之间的交互是双向的,m和v完全分离,m和v的交互是通过P ...

  10. Atitit linux获取项目运行环境版本

    Atitit linux获取项目运行环境版本 1.1. Nginx版本1 1.2. Php版本1 1.3. Mysql版本2 1.4. Redis版本2 1.1. Nginx版本 [root@iZ25 ...