一、Spring——IoC

IOC概述

  • Spring中IOC的概念,控制反轉(zhuǎn)概念其實(shí)包含兩個層面的意思,“控制”是接口實(shí)現(xiàn)類的選擇控制權(quán);而“反轉(zhuǎn)”是指這種選擇控制權(quán)從調(diào)用者轉(zhuǎn)移到外部第三方或容器的手中。
  • BeanFactory、ApplicationContext和WebApplicationContext是Spring框架三個最核心的接口,框架中其他大部分的類都圍繞他們展開、為他們提供支持和服務(wù)。在這些支持類中,Respurce是一個不可忽視的重要接口,框架通過Resource實(shí)現(xiàn)了和具體資源的解耦,不論他們位于何種存儲介質(zhì)中,都可以通過相同的實(shí)例返回。與Resource配合的另一個接口是ResourceLoader,ResourceLoader采用了策略模式,可以通過傳入資源地址的信息,自動選擇適合的底層資源實(shí)現(xiàn)類,為上層對資源的引用提供極大的便利。

一、IOC 控制反轉(zhuǎn):

  • 1、“控制”是指接口實(shí)現(xiàn)類的選擇控制權(quán);
  • 2、“反轉(zhuǎn)”是指這種選擇控制權(quán)從調(diào)用類轉(zhuǎn)移到外部第三方類或者容器手里;

二、Spring三大最核心接口:

BeanFactory

  • 1、Spring框架的基礎(chǔ)設(shè)施,面向Spring本身;
  • 2、在初始化容器時,并未實(shí)例化Bean,直到第一次訪問某個Bean時才實(shí)例目標(biāo)Bean;
  • 3、若需要對bean定義后處理器,必須在代碼中通過手工調(diào)用spring方法進(jìn)行注冊;
  • 4、初始化方式
    new XmlBeanFactory(new Resource());

ApplicationContext

  • 1、面向使用Spring框架的開發(fā)者,幾乎所有的應(yīng)用場合我們都直接使用ApplicationContext文件中定義的 Bean;
  • 2、在初始化應(yīng)用上下文時就實(shí)例化所有的單例的Bean
  • 3、若需要對bean定義后處理器,其會利用反射機(jī)制自動識別出配置文件中的Processor,并自動注冊到應(yīng)用上下文中
  • 4、初始化方式
new ClassPathXmlApplication("classpath:bean.xml") 
 new FileSystemXmlApplicationContext("file:beans.xml")
new AnnotationConfigApplicationContext(Beans.class)

WebApplicationContext

  • 1、WebApplication需要ServletContext實(shí)例,也就是說他必須要在擁有Web容器的前提下才能完成啟動工作。
  • 2、Spring分別提供了用于啟動WebApplicationConetext的Servlet和Listener,在web.xml中配置
  • 3、WebApplicationContext需要使用日志功能,用戶可以將Log4j配置文件放到類路徑 WEB-INF/classes下,這時Log4j引擎即可順利啟動。用戶可以在web.xml中通過Log4jConfigServlet和Log4jConfigListener指定Log4j配置文件位置,但要注意啟動順序(load-on-startup)
  • 4、使用標(biāo)注@Configuration的java類提供信息,contextClass、contextConfigLocation

三、Bean生命周期改變方式:

  • 1、<bean>中的init-method 和 destroy-method 這兩個屬性為Bean指定初始化和銷毀的方法
  • 2、InitDestroyAnonotationBeanPostProcessor 的 @PostConstruct、@PreDestroy

Spring 配置概述:

  • 用戶可以通過屬性注入、構(gòu)造函數(shù)注入的方式建立Bean和Bean的依賴;可以通過字面值的方式設(shè)置Bean的屬性,也可以通過ref引用容器中其他的Bean;Spring為集合類提供了專門的配置標(biāo)簽;
  • 使用Spring簡化配置方式可以讓配置文件更加緊湊;可以通過配置文件中的<bean>標(biāo)簽建立關(guān)聯(lián)、繼承、依賴、引用的關(guān)系,合理地使用這些關(guān)系可以簡化配置、提高配置質(zhì)量;
  • Spring提供了5個Bean作用范圍,在Web應(yīng)用環(huán)境下,可以使用request、 session和globalSession的Bean作用域;
  • 通過@Component及另外三個衍型注解(@Repository、@Service、@Controller)配合@Autowired就可以很好地使用基于注解的配置進(jìn)行Bean的定義和注入,這種方式比在XML文件中通過<bean>提供配置文件更加簡單;
  • 任務(wù)POJO標(biāo)注了@Configuration注解后就可以為Spring容器提供Bean的定義信息,在類方法中標(biāo)注@Bean相當(dāng)于定義了一個Bean,同時還提供了Bean的實(shí)例化邏輯。由于Bean的實(shí)例化邏輯是在方法中定義的,因此他可以應(yīng)對一些復(fù)雜的Bean的實(shí)例化場景。
  • 不管配置使用何種配置方式,Spring都可以很好地將他們整合起來,在Spring容器內(nèi)部,這些不同方法的Bean定義信息是大體相同的,三者指甲并不存在誰替代誰的問題,他們都有自己最合適的應(yīng)用場合。

一、Spring容器高層視圖

Bean的實(shí)現(xiàn)類
Bean的屬性信息,數(shù)據(jù)庫連接數(shù)、用戶名、秘密
Bean的依賴
Bean的行為配置

二、基于XML的配置

  • 1、 schema格式
<?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.aop="http://www/springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/beans/spring-aop-3.0.xsd 
    ">
    <!--默認(rèn)命名空間的配置-->
    <bean id="a" class=""/>

    <!--aop命名空間的配置-->
    <aop:config>
    </aop:config>
</beans>
  • 2、依賴注入

    • 1、屬性注入
    • 2、構(gòu)造函數(shù)注入:
      按照類型匹配入?yún)ⅲ?br> 按照索引匹配入?yún)ⅲ?br> 聯(lián)合使用類型個索引匹配入?yún)ⅲ?br> 通過自身類型反射匹配入?yún)ⅲ?/li>
    • 3、工廠方法注入:非靜態(tài)工廠方法;靜態(tài)工廠方法

    由于Spring IoC容器以框架的形式提供工廠方法的功能,并以透明的方式開放給開發(fā)者,所以很少需要手工編寫基于工廠方法的類。不過在一些遺留系統(tǒng)或第三方類庫中,我們還會碰到工廠方法,這時用戶可以使用Spring工廠方法注入的方式進(jìn)行配置。

    • 4、方法注入。
      lookup方法注入 無狀態(tài)Bean的作用域一般配置為singletion單實(shí)例模式,如果我們往singletion的類A中注入prototype的類B,并希望每次調(diào)用A的getB()都能返回一個新的B,使用傳統(tǒng)的注入方法無法實(shí)現(xiàn)這樣的要求。使用lookup方法注入可以實(shí)現(xiàn)方法替換,可以使用Bean的方法去替換另一個Bean的方法。
  • 3、注入?yún)?shù)詳解

    • 1、字面值
    • 2、引用其他Bean
    • 3、內(nèi)部Bean
    • 4、null值 <value></value>
    • 5、級聯(lián)屬性 <property name="a.b.c" value="">
    • 6、集合類型屬性
  • 4、簡化配置方式

    • 1、字面值屬性
    • 2、引用對象屬性
    • 3、使用p命名空間
    • 4、自動裝配
  • 5、bean之間的關(guān)系

    • 1、繼承
    • 2、依賴
    • 3、引用
  • 6、整合多個配置文件

    • 1、在啟動Spring容器時,通過一個Spring數(shù)組來指定這些配置文件;
    • 2、應(yīng)用層面提供一個整合的配置文件,通過<import>將各個模塊整合起來,這樣容器在啟動時,只需要關(guān)注這個整合的配置文件就可以了;
  • 7、Bean的作用域

    • 1、singleton

    一般情況下,無狀態(tài)或者狀態(tài)不可變的類適合使用單例類。在傳統(tǒng)開發(fā)中,由于Dao類執(zhí)有Connection這個非線程安全的變量而沒有采用單例模式。而在Spring環(huán)境下,對于所有的Dao類都可以采用單實(shí)例模式,因?yàn)镾pring利用AOP和LocalThread的功能,對非線程安全的類的變量(或稱狀態(tài))進(jìn)行了特殊的處理,使這些非線程安全的類變成線程安全的類。

    • 2、prototype
    • 3、request
    • 4、session
    • 5、globalSession
  • 8、FactoryBean。實(shí)例化Bean得過程如果比較復(fù)雜,可以使用Spring提供的 org.springframework.beans.factory.FactoryBean工廠類接口定制實(shí)例化Bean的邏輯

三、基于注解的配置

  • 1、注解:

    • @Compoment: Spring容器自動將POJO轉(zhuǎn)換為容器管理的Bean;
    • @Repository: 用于對Dao實(shí)現(xiàn)類進(jìn)行標(biāo)注;
    • @Service:用于對Service實(shí)現(xiàn)類進(jìn)行標(biāo)注;
    • @Controller:用于對Controller實(shí)現(xiàn)類進(jìn)行標(biāo)注
  • 2、使用注解配置信息啟動Spring容器。聲明context命名空間,掃描類包以應(yīng)用注解定義的Bean
    <context:component-scan base-package="">

  • 3、自動裝配Bean

    • 通過@Autowired進(jìn)行自動注入
    • 使用@Auto的required屬性
    • 使用@Qualifier指定注入Bean的名稱
    • 對類方法進(jìn)行標(biāo)注
    • 對集合類進(jìn)行標(biāo)注
    • 對標(biāo)準(zhǔn)注解的支持
      @Resource 自動采用標(biāo)注處的變量名或方法名作為Bean的名稱
      @Inject
  • 4、Bean作用范圍及生命過程方法

    • @Scope指定Bean的作用范圍
    • @PostConstruct @PreDestory改變Bean的生命過程

四、基于Java類的配置

  • 1、使用Java類提供Bean定義信息

    • 普通POJO只要標(biāo)注@Configuration注解,就可以為Spring容器提供Bean定義的信息了
  • 2、使用基于Java類的配置信息啟動Spring容器

    • 使用AnnotationConfigApplicationContext
    • 通過XML配置文件引用@Configuration的配置 <context:component-scan base-package="" resource-pattern=".class">
    • 通過 Configuration配置類引用XMl配置信息 @ImportResurce
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容