SpringBoot揭秘:快速構建微服務體系


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進行掃描。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM