1、Spring是什麼
一般說的Spring其實指的是Spring Framework,它是Spring下的一個子項目,Spring圍繞Spring Framework這個核心項目開發了大量其餘項目,好比Spring Security,Spring Data,Spring WebFlow等等。
Spring是爲簡化Java EE開發而生,而在Java EE中使用最多的就是Spring Framework,接下來咱們主要就是學習Spring Framework。
Spring Framework包括他的核心解決方案IoC容器、Spring AOP。另外,還有對Web、數據訪問層的支持。
下面是Spring Framework架構圖:
2、Spring IoC容器
Spring IoC(Inversion of Control,控制反轉)是Spring Framework的最核心的部分。
所謂控制反轉,是指經過使用IoC容器對象依賴關係的管理被反轉了,也就是說,對象之間的依賴關係由IoC容器進行管理,而且由Ioc容器經過依賴注入(DI,Dependency Injection)的方式來完成對象的注入。
在使用Spring的開發中,咱們須要將全部的類在Spring的IoC容器中進行註冊,告訴Spring你是什麼,你須要什麼,而後IoC容器會在你須要哪一個對象時爲你建立這個對象以及該對象依賴的其餘對象實例(這就是依賴注入)。這些類的建立、銷燬都會交由IoC容器來管理,而再也不由引用它的對象維護。將之前的「對象-對象」的依賴模式轉變爲了「對象-IoC容器-對象」的依賴模式。
Spring提供了兩種註冊IoC容器的方式:XML方式和註解的方式。
3、Spring IoC的XML配置
一、添加Spring基本依賴包
aopalliance-1.0.jar
commons-logging-1.1.1.jar
spring-aop-3.2.0.RELEASE.jar
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
二、添加Spring配置文件applicationContext.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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <bean id="userDao" class="com.boya.spring.ioc.UserDao" />
- <bean id="exampleBean" class="com.boya.spring.ioc.ExampleBean">
- <property name="name" value="boya" />
- <property name="userDao" ref="userDao" />
- </bean>
- </beans>
三、分別建立User類和ExampleBean類
User類:
- public class UserDao {
- public String getName() {
- return "boya";
- }
- }
ExampleBean類:
- public class ExampleBean {
- private String name;
- private UserDao userDao;
-
- public void print(){
- System.out.println("Name is :"+name);
- }
-
- public void userPrint(){
- System.out.println("User name is :"+userDao.getName());
- }
-
-
- }
四、IoC容器測試
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
- ExampleBean exampleBean = context.getBean("exampleBean", ExampleBean.class);
- exampleBean.print();
- exampleBean.userPrint();
輸出:
Name is :boya
User name is :boya
4、Spring IoC註解
Spring 的依賴配置方式與 Spring 框架的內核自身是鬆耦合設計的。然而,直到 Spring 3.0 之前,使用 XML 進行依賴配置幾乎是惟一的選擇。Spring 3.0 的出現改變了這一情況,它提供了一系列的針對依賴注入的註解,這使得 Spring IoC 在 XML 文件以外多了一種可行的選擇。下面介紹如何使用這些註解進行依賴配置的管理。
我將註解分爲兩類,第一類用於屬性裝配,第二類用於類的註冊。
屬性裝配使用的註解通常有兩種,分別是Autowired、Resource。
@Autowired
一、@Autowired默認按照類型匹配的方式(byType)進行注入
三、@Autowired註解能夠用於成員變量、setter方法、構造器函數等
四、使用@Autowired註解須有且僅有一個與之匹配的Bean,當找不到匹配的 Bean 或者存在多個匹配的Bean時,Spring 容器將拋出異常
五、Spring 容許咱們經過 @Qualifier 註釋指定注入 Bean 的名稱。@Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了
@Resource
一、@Resource 的做用至關於 @Autowired,只不過 @Autowired 按 byType 自動注入,@Resource 默認按 byName 自動注入罷了
二、@Resource 有兩個屬性,分別是 name 和 type,Spring 將 @Resource 註釋的 name 屬性解析爲 Bean 的名字,而 type 屬性則解析爲 Bean 的類型。因此若是使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性時則使用 byType 自動注入策略。
須要將某個類在IoC容器註冊時,可使用@Component、@Repository、@Service和 @Controller
@Component
一、@Component是全部受Spring管理組件的通用形式,而@Repository、@Service和 @Controller則是@Component的細化, 用來表示更具體的用例(分別對應了持久化層、服務層和表現層)
二、使用@Component註解定義的Bean,默認的名稱(id)是小寫開頭的非限定類名。如UserDao類定義的Bean名稱就是userDao。你也能夠指定Bean的名稱: @Component("abc")
下面,咱們把上面的示例改成註解配置的形式。
首先,須要修改配置文件applicationContext.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-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <context:component-scan base-package="com.boya.spring.ioc" />
- </beans>
<context:component-scan />的base-package屬性指定了須要掃描的類包,類包及其遞歸子包中全部的類使用的註解都會被處理。
二、在類中添加註解
UserDao類:
- @Repository
- public class UserDao {
- public String getName() {
- return "boya";
- }
- }
ExampleBean類:
- @Service
- public class ExampleBean {
- @Resource
- @Value("boya")
- private String name;
- @Resource
- private UserDao userDao;
-
- public void print(){
- System.out.println("Name is :"+name);
- }
-
- public void userPrint(){
- System.out.println("User name is :"+userDao.getName());
- }
- }
前面介紹了,用於裝配屬性的註解@Autowired和@Service是能夠用於成員變量的,因此當咱們在成員變量設置這兩個註解後,setter方法就能夠去除了。
三、IoC容器測試
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
- ExampleBean exampleBean = context.getBean("exampleBean", ExampleBean.class);
- exampleBean.print();
- exampleBean.userPrint();
輸出結果:
Name is :boya
User name is :boya