<span style="font-size:18px;">public class Direct{ //導演類
public void direct()
角色 geli = new 劉德華(); //指定角色的扮演者
劇本 juben = new 劇本(); //注入具體扮演者到劇本
juben.setGeli(geli);//set注入方式
..................}}</span>
3.接口注入:將調用類所依賴的方法抽取到一個接口中,調用類通過實現對應的接口提供相應的方法。
<span style="font-size:18px;">public interface ActorArrange{ void injectGeLi(GeLi geli) ;}
public class 劇本implements ActorArrange{ 在這裏邊實現injectGeLi方法。}
public class Direct{ //導演類
public void direct()
角色 geli = new 劉德華(); //指定角色的扮演者
劇本 juben = new 劇本();
jubne.injectGeLi(geli);
..................}}</span>
通常,這種方式效果和屬性注入沒有區別,而且還多出來一個接口類,所以不建議使用。
資源加載
spring 設計了一個Resource接口,提供更強的訪問底層資源的能力。有了這個類可以將配置文件寫在任何位置。
該接口主要的方法:
boolean exists(): // 資源是否存在
boolean isOpen()://資源是否打開
URL getURL()throws IOEXception,File getFile();InputStream getInputStream();getFileName()
該接口對應不同的實現類:
AbstractResource 接口------->實現類有----》ByteArrayResource ClassPathResource(類路徑的方式) FileSystemResource(絕對路徑進行訪問) ServletContextResource (相對於web根目錄的方式) UrlResources
..........
還有就是用資源地址表達式
classpath: -->表示從類路徑中加載,和classpath:/是等價的
classpath*:--->假設有多個相同的jar在一個包中,用這種方法會加載包寫所有的文件,上邊的只會加載第一個
file: --->使用URLResource從文件系統中加載
http:// ftp: //--->從WebFTP
沒有前綴的,直接寫:---》根據applicationContext具體實現類採用類對應的Resource
BeanFactory 和ApplicationContext
spring通過配置文件描述bean與bean之間的依賴關係,利用Java語言的反射機制能實例bean並且建立依賴關係,
spring除了這些還提供 了bean實例的緩存,生命週期的管理。bean實例代理,事件發佈,資源轉載等高級服務。
bean工廠,也叫IOC容器(com.springframework.beans.factory.BeanFactory)是spring框架最核心的接口,他提供了高級IOC的配置機制。
BeanFactory使管理不同類型的Java對象成爲可能。BeanFactory面向spring本身
應用上下文也叫spring容器:(com.springframework.context.ApplicationContext),建立在BeanFactory的基礎上,提供更多的面向應用的功能,國際化支持和框架事務。面向的是開發者。
BeanFactory:
BeanFactory接口最常用的實現是:XMLBeanFactory。最主要的方法是:getBean(String name);
BeanDefinitionRegister:spring配置文件中每一個《bean》節點元素在spring容器裏都通過一個BeanDefinition對象表示,它描述了bean的配置信息。而這個類提供了想容器手工註冊BeanDefinition的方法。
初始化BeanFactory
XMLBeanFactory是通過Resource裝載spring配置信息並啓動IOC容器。通過BeanFactory啓動容器時,並不會初始化配置文件中定義的bean,初始化動作發生在第一次調用,對於單例的bean來說,BeanFactory會緩存beans實例,所以第二次調用的時候獲取bean是直接從IOC容器緩存中獲取。
Spring在DefaultSingletonBeanFactory類中提供了一個用於緩存單例bean的緩存器,用HashMap實現的。
ApplicationContext:
ApplicationContext的主要實現類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext前者默認從類路徑加載配置文件,後者從文件系統加載。
ApplicationContext的初始化和BeanFactory的區別:前者要實例化所有單例bean,後者使用的時候纔會實例化
spring支持用註解的方式配置。
@Configuration//表示是一個配置信提供類
@Bean(name="Car") //定義一個bean
spring爲基於註解的配置提供了專門的AnnotationConfigApplicationContext類。
WebApplicationContext是專門爲WEb應用準備的,它允許從web根目錄的路徑中轉載配置文件並完成初始化工作。可以從他中獲得ServletContext的引用。
spring爲WebApplicationContext中的bean提供了三個新的作用域:request,session,global session 而在非WEB下,只有singleton和prototype。
初始化:和上邊兩個不同,因爲WebApplicationContext需要ServletContext實力,所以必須在有web容器的情況下進行實例。
解決的辦法是:在web.xml中配置自啓動的servlet或者定義問容器監聽類(ServletContextListener)
spring分別提供了用於啓動WebApplicationContext的Servlet和web容器監聽器:
<span style="font-size:18px;"><context-param>
<param-name>contextConfigLocation</>
<param-value>/WEB_INF/taotaoao.xml</>
</>
<listener>
<listener-class>aor.springframework.web.context.ContextLoaderListener</>
</></span>
Bean作用域
BeanFactory中bean的生命週期:也會經歷實例化,設置屬性值和返回實例:
如果在<bean scope="prototype">/會將bean返回給調用者,調用者自己管理。
<bean scope="singleton">//容器自己管理,當容器關閉時,將會觸發觸發視頻日你個對其進行管理。
bean 的 配置方式有三種:
基於XMl的,基於註解的,基於java 類的。
Bean的基本配置
<bean id="only" class="">
注意上邊的ID必須是唯一的,而且命名的時候不能出現特殊符號
<bean name="#first,second,third" class>
這種方法可以用多個名字,而且可重複,當重複的時候 返回的是最後聲明的那個,可以出現?等其他字符
注意:javabean關於屬性命名有一個特殊的規定:spring鎖配置中的屬性名都是以小寫字母開頭,要用大寫的話要必須保證要麼前兩個字母是小寫,要麼前兩個字母都大寫
否則會 報錯
<span style="font-size:18px;"><bean id ="" calss="">
<property name="name" value="guwen">
<property name="car" ><ref bean =""/></>
<property>
<list>
<value>屬性</><value>屬性2</><value>屬性3</>
</>
<set>
<value>看包</><value>看包2</><value>看包3</>
</>
<map>
<entry>
<key>hah</><value>hsh</>
</entry>
</map>
</property></span>
自動裝配
<bean id="" class="" autowire="byName/byType/constructor/autodetect">
bean的作用域
singleton:在IOC容器中僅存在一個bean實例,以單例存在,默認情況下,ApplicationContext在加載的時候會實例化所有的bean,
然後緩存,要想不這樣用 <lazy-init="true">
prototype:每次從容器中調用bean時都返回一個新的實例。
request:每次http請求都會創建一個新的bean,該作用域僅適用於WEBApplicationcontext
session;同一個Http session 共享一個bean,不同http session是不同的bean,該作用域僅適用於WEBApplicationcontext
globalSession:同一個全局Session共享一個bean,該作用域僅適用於WEBApplicationcontext
@Scope可以顯示的在配置作用範圍,
基於註解的配置:
1.使用註解定義bean
@Component,被spring識別,將pojo轉化爲容器管理的bean
在這個的上邊還可以有下面三個:
@Repository:對於DAO實現類的註解
@Service:對Service實現類的註解
@Controller:對Controller實現類的註解
自動裝配bean:
@Autowired進行自動注入,有一個屬性是required:默認是沒有找到bean就拋出NoSuchBeanDefinitionException,要想不拋出用required=false
@Qualifier :指定注入bean的名稱,當有兩個bean時,返回Qualifier中的名稱的bean
@Resource:要求提供一個bean名稱的屬性:
@Inject:和Autowired類似,按照類型匹配注入bean,只是沒有required屬性
基於Java類的配置信息:
javaConfig:是spring的一個子項目,它可以通過Java類的方法提供bean的定義信息;
@Configuration
public class Test{
@Bean
public UserDao userDao(){}
@Bean.......
}
IOC工作流程:
1.ResourceLoader從存儲介質中加載spring的配置信息,並使用Resource表示這個配置文件的資源
2.BeanDefinitionReader讀取Resource所指向的配置文件資源,然後將配置文件中每一個<bean>解析爲一個BeanDefinition對象,並保存到 BeanDefinitionRegister註冊表中。
3.掃描BeanDefinitionRegister註冊表中的信息,使用Java反射機制自動識別bean工廠處理器的bean,並且進行加工(完成含有佔位符的標籤解析,完成屬性的配置)
4.spring容器從註冊表中取出加工後的BeanDefinition,並進行實例化
下一篇寫AOP,安啦..............