Spring實用IOC總結
Spring實用IOC總結
1.IOC(Inverse Of Control)思想
IOC(控制反轉)相當于一個容器,這個容器裡面放你想放的對象或者要用到的對象。IOC思想産生的一個主要原因就是為了解耦。這裡首先說一下程式之間的耦合,如果沒有IOC,使用mvc架構層與層之間通過new互相執行個體化,如果依賴類過多,導緻的結果就是程式裡面相當混亂。無疑提高了維護成本。引入IOC的目的就是為了解耦,将依賴關系通過配置檔案或者注解的方式進行執行個體化并且管理起來,并通過類之間的互相注入實作類于類之間的資料傳遞,互相調用等。
2. Bean
在介紹spring之前首先解釋一下java裡面的Bean的含義,在英語裡Bean是豆子的意思,在java裡是譯為可重用元件。說白了也可以了解為一個類。
3.兩個重要的接口以及實作類
先來看一張圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLyEEVPRzaU50MNpHW3BjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyMTN2QTOyUTM4IzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
兩個重要的接口
1). 作用
通過 diagram 可以看到 ApplicationContext和BeanFactory是最主要的兩個接口類。ApplicationContext extends了6個接口,而BeanFactory是最頂層的接口。是以相對而言BeanFactory的功能要簡單一些,而ApplicationContext擴充的功能要多一些。
這兩個接口的執行個體化對象主要完成的工作就是建立容器和對于Bean的執行個體化。
2). 不同點
兩者的不同點在于:
BeanFactory屬于延遲加載,也就是系統啟動後并不完成類的執行個體化,而是在使用的時候getBean()對象了再加載。
而ApplicationContext屬于系統啟動時就加載。
另外兩者的不同之處還在于,ApplicationContext擷取到得對象一般是單例模式而BeanFactory的執行個體化是多例的。
說完接口,下面說一下重要的實作類。通過比較兩個接口的不同點,我們就明白了為什麼我們更多使用ApplicationContext這個接口,他是單例模式的,消耗的資源更少一些,而功能有更多一些。
3)接口方法
getBean 從Spring容器中擷取Bean對象。
參數可以使用三種情況:
getBean(“id”) 使用bean的id從容器中查找對象
getBean(Bean.class) 使用bean的class類型從容器中查找對象
getBean(“id”, Bean.class) 使用bean的id 和 class類型從容器中查找對象
實作類
ApplicationContext的主要實作類包括
ClassPathXmlApplicationContext:加載類路徑下的配置檔案
FileSystemXmlApplicationContext:可以加載磁盤任意路徑下的配置檔案
AnnotationConfigApplicationContext:用于注解建立容器
4. 建立bean的三種方式(XML)
對于bean的建立。spring提供了三種不同方式,
-
使用預設構造函數建立
通過id和class屬性建立,且沒有其他屬性和标簽時,但是如果沒有預設構造函數則不能通過這種方式建立。
2.使用普通工廠中的方法建立對象
public class FactoryIns {
public IAccoutService getFactoryIns (){
return new AccoutService();
}
}
<bean id="instanceFactory" class="service.FactoryIns"></bean>
<bean id="accountSevice" factory-bean="instanceFactory" factory-method="getFactoryIns"></bean>
以上配置的作用是執行個體化FactoryIns類,通過執行類中的getFactoryIns方法。
3.通過靜态工廠建立對象
public class StaicFactoryIns {
public static IAccoutService getFactoryIns (){
return new AccoutService();
}
}
因為是靜态方法則直接執行類中的getFactoryIns方法即可。
5.Bean的作用範圍
通過在bean中設定scope屬性來設定Bean的作用範圍
其中作用範圍包括:
singleton:單例模式
prototype:多例模式,每次擷取bean的時候,IOC 都給我們建立一個新對象
request:在一個web應用的request域中的作用範圍
session:在一個web應用的會話範圍内
GlobalSession:叢集範圍的session,了解為叢集範圍的session共享
6.依賴注入
** 1. 能夠注入的資料類型主要包括**,
1).基本類型和String類型
2) .執行個體化的bean
3) .複雜類型 list、set、map等
2.注入方式
** 構造函數注入**
前提是Bean中有該構造函數,如果沒有則無法注入
<bean id="accountSevice" class="service.AccoutService" scope="singleton"
init-method="init" destroy-method="destroy">
<constructor-arg name="name" value="abc"> </constructor-arg>
<constructor-arg name="id" value="1"> </constructor-arg>
<constructor-arg name="date" ref="now"> </constructor-arg>
</bean>
<bean id="now" class="java.util.Date"></bean>
</beans>
Set注入
set注入是最常用的一種注入方式他的屬性主要是property屬性,
ref:用于指定其他的Bean類型資料。他指的就是Srping的IOC核心容器中出現過的bean
<bean id="accountSevice" class="service.AccoutServiceSet" scope="singleton"
init-method="init" destroy-method="destroy"
>
<property name="dao" ref="accoutDao"></property>
</bean>
<bean id="accoutDao" class="dao.AccoutDao"></bean>
7.注解方式配置
xml的配置都有對應的注解方式建立bean和注入bean。省去了繁瑣的配置問題。
使用注解首先要從xml中配置掃描類所在的路徑通過
建立Bean的注解主要有
@Component後續spring有根據mvc的方式,為了使用起來更易讀,做了幾個Component的别名注解包括
@Controller :用于Controller層使用
@Service用于Service層使用
@ Repository 用于Dao層使用
為了更清晰看到以上說明spring源碼情況如下Controller的spring源碼
@Scope
@Scope用于指定bean的作用範圍(單例和多例),相當于配置檔案中的< bean scope="">
@Scope用于指定bean的作用範圍(單例和多例),相當于配置檔案中的< bean scope="">
@Scope(“prototype”) //多例
@Scope(“singleton”) //單例
注解注入
@Autowired
放在屬性上:可以注入Bean
表示先按照類型給屬性注入值,如果存在多個相同類型的注入,則通過具體的名稱找到相關的Bean,該注解可以與@Qualifier注解混合使用。@Qualifier的作用是指定相應的類名稱
而
@Resource注解則相當于@[email protected]
取值
@Value
可以通過spring的el表達式從配置檔案中擷取相應id的值
一般用于解析其它properties配置檔案中的key值倆擷取對應的value,寫法如下:
@Value("${key}")
@Configuration
用于指定目前類是一個 spring配置類,當建立容器時會從該類上加載注解。
@Bean
@Bean注解一般用在有Configuration的注解的配置檔案當中,主要用于将一個建立一個對象并加入到springIOC容器中它支援一個name屬性,用于給生成的bean取一個id。
一般用在方法上。
@ComponentScan
與XML配置檔案的
類似,即掃描檔案下的注解。
@Import
在一個配置類中,引入其他配置,具體寫法:@Import(DaoConfig.class)
效果等于之前xml配置中的
@PostConstruct @PreDestroy
@PostConstruct @PreDestroy 這兩個注解标注方法分别在對象的建立之後和銷毀之前執行。
相當于< bean init-method=“init” destroy-method=“destory” />
@PropertySource
用于加載.properties 檔案中的配置。例如我們配置資料源時,可以把連接配接資料庫的資訊寫到properties 配置
檔案中,就可以使用此注解指定 properties 配置檔案的位置。
最後:
這是最近學習spring的一些總結,歡迎批評指正。