spring框架入門到熟練
個人筆記,不足之處請指點,謝謝!會慢慢更新,請諒解
spring的概況
- spring是一個開源框架,為了解決企業應用開發的複雜性而建立的,但現在已經不止應用於企業運用。
- 是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。
優點:
- 從大小與開銷兩方面而言都是輕量級的。
- 通過控制反轉(IoC)的技術達到鬆耦合的目的。
- 提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務進行內聚性的開發。
- 包含並管理應用物件的配置和生命週期,這個意義上是一種容器。
為什麼是spring?
- 開發應用簡單:物件建立,銷燬,生命週期,生命過程管理,都可以交給spring來做,從這個角度是簡單的。
- 開發應用方便:我們把物件管理交給了spring,我們用的時候需要什麼例項告訴spring ,就可以 給我們返回 我們所需要的例項。
- 開發應用快捷:……..
spring作用:
- 容器
- 提供了對多種技術的支援
—JMS
—MQ支援
—UnitTest
—……. - AOP(事物管理,日誌)
- 提供了眾多方便應用的輔助類(JDBC Template)
- 對主流應用框架(Hibernate 等)提供了良好的支援
適用範圍
- 構建企業應用(SpringMVC+Spring+Hibernate/ibatis)
- 單獨適用Bean容器(Bean管理)
- 單獨適用AOP進行切面處理
- 其他的Spring功能,如:對訊息的支援等
- 在網際網路中的應用
什麼是框架?
軟體框架,通常指的是為了實現某個業界標準或完成特定基本任務的軟體元件規範,也指為了實現某個軟體元件規範時,提供規範所要的基本功能的軟體產品
框架就是制定一套規範或者規則(思想),大家(程式設計師)在該規範或者規則下工作,或者說就是使用別人搭好的舞臺,你來表演
框架的特點:
— 半成品
— 封裝了特定的處理流程和控制邏輯
— 成熟的,不斷升級改進的軟體框架與類庫的區別
— 框架一般是封裝了邏輯,高內聚的,類庫則是鬆散的工具組合。
—框架專注於某一個領域,類庫則是更通用的。
介面
用於溝通的中介的抽象化
實體把自己提供給外界的一種抽象化說明,用以由內部操作分離出外部溝通方法,使其能被修改內部而不受外界影響其他實體與其互動的方式。
對應Java介面即宣告,聲明瞭哪些方法是對外公開提供的。1
在 Java8中, 介面可以擁有方法體。
面向介面程式設計
結構設計中,分清層次及呼叫關係,每層只向外(上層)提供一組功能介面,各層間僅依賴介面而非實現類
介面實現的變動不影響各層間的呼叫,這一點在公共服務中尤為重要
面向介面程式設計“中的”介面”是用於隱藏具體實現和實現多型的元件
IOC
IOC:控制反轉,控制權轉移,應用程式本身不負責依賴物件的建立和維護,而是由外部容器負責建立和維護。(獲得依賴物件的過程被反轉了。控制反轉之後,獲得依賴物件的過程由自身管理變為了由IOC容器主動注入。控制反轉更合適的名字叫“依賴注入”。所謂依賴注入,就是由IOC容器在執行期間,動態地將某種依賴關係注入到物件之中 )
DI (依賴注入)是一種實現方式
目的:建立物件並組裝物件之間的關係
Spring的Bean配置
整個版本編碼的說明
<?xml version="1.0" encoding="UTF-8"?>
下面是名稱空間 和schenma 的位置
<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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--啟用註解管理
base-package指定註解管理的檔案地址-->
<context:component-scan base-package="dao"/>
<!--bean 標籤代表java中一個具體的物件 new-->
<bean class="entity.User">
<!--property 配置物件屬性值
name 屬性名 ,value 屬性值(基本資料型別) ref 屬性值(物件型別)-->
<property name="id" value="1"/>
<property name="name" value="wang"/>
<property name="password" value="123"/>
</bean>
</beans>
物件模板省略..
測試程式碼:
public class Test {
public static void main(String[] args) {
/*1.指定配置檔案地址*/
String path="spring.xml";
/*2讀取配置檔案生成工具類物件*/
ApplicationContext context =
new ClassPathXmlApplicationContext(path);
/* getBean(類描述),
從spring管理的物件中找到一個符合該型別的物件*/
User bean = context.getBean(User.class);
System.out.println(bean.getId());
System.out.println(bean.getName());
System.out.println(bean.getPassword());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//註解列印
TestDao dao1 = context.getBean(TestDao.class);
dao1.showUuer();
TestDao dao2 = context.getBean(TestDao.class);
//每個bean 在spring 工廠中只會建立一個
/*用==判斷兩個地址是否一樣*/
System.out.println(dao1==dao2);
}
}
Bean容器初始化
基礎包:
—org.springframework.core (spring核心jar包 猜測:是一個重用率很高的工具集合)
—org.springframework.beans (spring建立物件相關模組 )
—org.springframework.context (spring物件使用相關模組)
—BeanFactory 提供配置結構和基本功能,載入並初始化Bean
—ApplicationContext儲存了Bean物件並在Spring中被廣泛使用方式,ApplicationContext
—本地檔案
FileSystemXmlApplicationContext context=
new FileSystemXmlApplicationContext(“碟符路徑.xml”);—Classpath
ApplicationContext context =
new ClassPathXmlApplicationContext(….xml);—Web應用中依賴Servlet或Listener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
</servlet>
Spring注入
* Spring 注入是指在啟動Spring容器載入bean配置的時候,完成對變數的賦值行為*
常用的兩種注入方法
-設值注入
class 就是建立物件,相當於讓spring做了 new ...物件例項
prperty相當於調一個set方法給一個屬性賦值必須命名規範 不要亂起名 會自動呼叫 ,Spring也不會違背封裝屬性,name 是一個成員變數 value 屬性值(基本資料型別) ref 屬性值(物件型別)引用
<bean class="entity.User">
<property name="id" value="1"/>
<property name="name" value="wang"/>
<property name="password" value="123"/>
<property name="userInfo" ref="userInfo"/>
<property name="bills">
<!-- list 子標籤配置集合-->
<list>
<!-- ref 子標籤呼叫bean-->
<ref bean="bill"/>
<ref bean="bill1"/>
<!-- <value>fdafdafds</value>-->
</list>
</property>
</bean>
-構造注入
<bean class="com.imooc.ioc.injection.service.InjectionService">
<constructor-org name="id" value="1"/>
</bean>
Bean配置項
id:在整個IOC容器中這個bean的唯一標識
Class:具體要例項化的哪一個類
- Scope :範圍(作用域)
- Constructor arguments:構造器的引數
- Properties:屬性
- Autowiring mode:自動裝配的模式
- lazy-initalization :懶載入模式
- Initialization/destructio:初始化和銷燬的方法
以上都是一些比較常用的
Bean的作用域
singleton:單例,指一個Bean容器中只存在一份
prototype:每次請求(每次使用)建立新的例項,destroy方式不生效
- Request:每次http請求建立一個例項且僅在Request內有效
- session:同上,每次http請求建立,當前session內有效
global session: 基於portlet的wed中有效(portlet定義了global session),如果是在web中,同session
Aware
- Spring中提供了一些以Aware結尾的介面,實現了Aware介面的bean在被初始化之後,就可以獲得相應資源
- 通過Aware介面,可以對Spring相應資源進行操作(一定要慎重)
- 為對Spring進行簡單的擴充套件提供了方便的入口
Bean的自動裝配(Autowiring)
- No:不做任何操作**
- byname:根據屬性名自動裝配。此選項將檢查容器並根據名字查詢也屬性完全一致的bean,並將其與屬性自動裝配
- byType:如果容器中存在一個與指定屬性型別相同的bean,那麼將與該屬性自動裝配;如果存在多個該型別bean,那麼丟擲異常,並指出不能使用byType方式進行自動裝配;如果沒有找出到匹配的bean,則什麼事都不發生
- Constructor:與byType方式類似,不同之處在於它應用於構造引數。如果容器中沒有找到與構造引數型別一致的bean,那麼丟擲異常
Resources
- 針對於資原始檔的統一介面
- Resources
- URLResource:URl對應的資源,根據一個URL地址即可構建
- ClassPathResource:獲取類路徑下的資原始檔
- FileSystemResource:獲取檔案系統裡面的資源
- ServletContextResource:ServletContext封裝的資源,用於訪問ServletContext環境下的資源
- InputStreamResource:針對於輸入流封裝的資源
- ByteArrayResource:針對於位元組陣列封裝的資源
Bean管理的註解實現
Classpath掃描與元件管理
- 從Spring3.0開始,Spring JavaConfig專案提供了很多特性,包括使用java而不是XML定義bean,比如@Configuration,@Bean,@import,@DependsOn
- @Component是一個通用註解,可用於任何bean
@Repository,@Service,@Controller 是更有針對性的註解
- @Repository通常用於註解DAO類,即持層
- @Service通常用於註解Service類,即業務層
- @Controller通常用於Controller類,即控制層(MVC)
元註解(Meta-annotations)
- 許多Spring提供的註解可以作為自己的程式碼,即”元資料註解”,元註解是一個簡單的註解,可以應用到另一個註解
@Target((ElementType.TYPE))
@Retention(RetentionPolicy.RUNTIME)
@Deprecated
@Component
public @interface Service(){
//.....
}
- 除了value(),元註解還可以有其他的屬性,允許定製
@Target((ElementType.TYPE))
@Retention(RetentionPolicy.RUNTIME)
@Deprecated
@Scope("session")
public @interface SessionScope{
ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT
}
類的自動檢測及Bean的註冊
- Spring可以自動檢測類並註冊Bean到ApplicationContext中
@Service
public class SimpleMoviester{
private MocieFinder movieFinder;
@Autovired
public SimpleMovieLister(MocieFinder movieFinder){
this.movieFinder=movieFinder
}
}
@Repository
public class JpaMovieFinder implements MovieFinder{
// implementation elided for clarity
}
- 通過在基於XML的Spring配置如下標籤(請注意包含上下文名稱空間)
- 僅會查詢在同一個applicationContext中的bean註解
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--開啟物件註解-->
<context:annotation-config/>
</beans>
- 為了能夠檢測這些類並註冊相應的Bean ,需要下面內容
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--開啟物件註解-->
<context:component-scan base-package="controller"/>
</beans>
- 包含,通常在使用前者後,不能再使用後者
- AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor也會被包含進來
使用過濾器進行自定義掃描
預設情況下,類被自動發現並 註冊bean的條件是:使用@Component,@Repository,@Service,@Controller註解或者使用@Component的 自定義註解
可以通過過濾器修改上面的行為,如:下面例子的xml配置忽略所有的@Repository註解並用“stub”代替
<beans>
<context:component-scan base-package="org.examle"/>
<context:include-filter type="regex" expression=".*stub.*Repository"/>
<context:exclude-filter type="annotation" expression ="org.springframework.stereotype.Repository"/>
<context:component-scan/>
</beans>
- 還可以使用use-default-filters=”false” 禁止自動發現與註冊
定義bean
掃描過程中元件被自動檢測,那麼Bean名稱是由BeanNameGeanertor生成的(@Component,@Repository,@Service,@Controller都會有個name屬性用於顯示設定Bean Name)
可以定義bean命名策略,實現BeanNameGenerator介面,並一定要包含一個無引數建構函式器
<beans>
<context:component-scan bese-package="org.example" name-generator="org.examle.MyNameGenerator"/>
</beans>
作用域
- 通常情況下自動查詢的spring元件,器scope是singleton,Spring2.5 提供一個標識scope的註解@Scope
@Scope("prototype")
@Repository
public class MovieFinderImpl implement MovieFinder{
//....
}
- 也可以自定義scope策略,實現ScopeMatadataResolver介面並提供一個無引數構造器
<beans>
<context:component-scan bese-package="org.example" scope-resolve="org.example.MyScopeResolver"/>
</beans>
代理方式
- 可以使用scoped-proxy屬性指定代理,有三個值可選:no,interface,targetClass
<beans>
<context:component-scan bese-package="org.example" scope-proxy="interfaces"/>
</beans>
理解就是會完成註解的掃描 base-p屬性就是掃描哪個包下面的所有類
@Required
- @required註解適用於bean屬性的setter方法
- 這個註解僅僅表示,受影響的bean屬性必須在配置時被填充,通過在bean定義或通過自動裝配一個明確的屬性值
publi class SimpleMovieLister{
private MovieFinder movieFinder;
@Required //不常用
public void setMovieFinder(MovieFinder movieFinder){
this.movieFinder= movieFinder;
}
//.............
}
@Autowired
- 可以將@Autowired註解為”傳統”的setter方法
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder){
this.movieFinder= movieFinder;
}
- 可用於構造器或成員變數
@Autowired
private MovieCatalog movieCatalog;
@Autowired
public MovieRecommender(CustomerPreferenceDao dao){
this.dao=dao;
}
- 預設情況下,如果因找不到合適的bean將會導致autowiring
失敗丟擲異常,可以通過下面的方式避免
public class SimpleMovieLister{
private MovieFinder movieFinder;
@Autowired(requird=false)
public void setMovieFinder(MovieFinder movieFinder){
this.movieFinder=movieFinder;
}
}
- 每個類只能有一個構造器被標記required=true
- @Aurowired的必要屬性,建議使用@Required註解
@Qualifier
基於java的容器註解
- @Bean標識一個用於配置和初始化一個有SpringIoC容器管理
的新物件的方法,類似於XML配置檔案中的 可以在spring的@Component註解的類中使用@Bean註解任何方法(僅僅是可以)
上一點中,通常使 用的是@Configuration(配置的意思)
@Resource
- 如果沒有顯示指定@Resource 的name 預設的名稱是從屬性名 或者
setter方法得出
public class SimpleMovieLister{
private MovieFinder movieFinder;
@Resource
public void setMovieFinder ( MovieFinder movieFinder){
this.movieFinder=movieFinder;
}
}
- 註解提供的名字被解析為一個bean的名稱,這是由ApplicationContext的中的CommonAnnotationBeanPostProcessor發現並處理的