上篇博文對Spring的工做原理作了個大概的介紹,想看的同窗請出門左轉。今天詳細說幾點。html
(一)Spring IoC容器及其實例化與使用java
Spring IoC容器負責Bean的實例化、配置和組裝工做有兩個接口:BeanFactory和ApplicationContext。其中ApplicationContext繼承於BeanFactory,對企業級應用開發提供了更多的支持。在實際應用中都是用該接口。web
1)實例化Spring容器(主要有四種)spring
1.ClassPathXmlApplicationContext: 在類路徑下尋找配置XML文件實例化容器。服務器
ApplicationContext act = new ClassPathXmlApplicationContext("hellobean.xml");
2.FileSystemXmlApplicationContext:在文件系統路徑下尋找配置文件來實例化容器。框架
ApplicationContext act=new FileSystemXmlApplicationContext("d:/beans.xml");
3.XmlWebApplicationContext:從Web應用目錄WEB-INF中的XML配置文件實例化容器。(小編未能實現成功,請實現成功的同窗指教)eclipse
WebApplicationContext wctx = new XmlWebApplicationContext();
4.在web.xml配置文件中,經過配置監聽器實例化容器。(假定已經配置了Spring的配置文件)測試
在web.xml中註冊Spring提供的Servlet監視器,它會在當前Web應用被加載時將Spring的ApplicationContext保存到ServletContext對象中。ui
Spring配置文件可指定多個,之間用逗號隔開。this
//在網頁中經過request對象或其餘方式,獲取Web服務器容器 ServletContext sc=request.getServletContext(); //利用spring框架提供的靜態方法,從Web服務器中獲取Spring容器 WebApplicationContext wact=WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
2)生成Bean實例
Spring容器經過getBean()方法,從容器中獲取所管理的對象。
例如:
HelloBeans student=(HelloBeans)wctx.getBean("stu1");
(二)基於XML文件方式的Bean配置
在java容器中造成Bean稱爲裝配。
Bean的裝配形式有兩種:基於XML文件的方式和基於註解的方式。
基於XML文件的方式就是用一個XML文件對Bean信息實施配置。主要有兩部分:命名空間、Bean及有關信息的配置。
4種配置Bean的方法:
例子:定義兩個實體類
public class Address { private String city; private String school; //無參構造器 public Address(){ this.city="taian"; this.school="nongda"; } //有參構造器 public Address(String city,String school){ this.city=city; this.school=school; } //省略了setter/getter方法 }
public class Student { private String name; private int age; Address address; //默認構造器 public Student(){} //有參構造器 public Address(String name,int age,Address address){ this.name=name; this.age=age; this.address=address; } //省略了setter/getter方法 }
第1種配置方法,利用帶參數的構造器注入:
<bean name="a1" class="com.edu.bean.Address"> <constructor-arg index="0" type="java.lang.String" value="北京"/> <constructor-arg index="1" type="java.lang.String" value="清華"/> </bean>
第2種配置方法,利用無參構造器注入:
<bean name="a2" class="com.edu.bean.Address"/>
第3種配置方法,利用屬性的setter方法注入:
<bean name="a3" class="com.edu.bean.Address"> <property name="city" value="北京"></property> <property name="school" value="清華"></property> </bean>
第4種配置方法,利用屬性的setter方法注入引用屬性:
<bean name="addr" class="com.edu.bean.Address"> <property name="city" value="北京"></property> <property name="school" value="清華"></property> </bean> <bean name="ss" class="com.edu.bean.Student"> <property name="name" value="張三"></property> <property name="age" value="20"></property> <property name="address" ref="addr"></property> </bean>
(三)Spring表達式——SpEL(Spring Expression Lanuage)
使用「#{...}」做爲定界符。全部在大括號中的字符都將被認爲是SpEL。SpEL爲Bean的屬性動態賦值提供了便利。
如下示例每一組兩條語句均爲等價表示:
<property name="count" value="#{5}"></property> <property name="count" value="5"></property> <property name="address" value="#{addr}"></property> <property name="address" ref="addr"></property> <property name="address" value="#{addr.city}"></property>
(四)基於註解方式的Bean配置
先說個例子:
打開eclipse,創建java web工程以下:
注意:除常規web項目導入包外,另需導入aop方面的jar包(放在lib目錄下)
其中,UserDao類:
package com.edu.annotation; import org.springframework.stereotype.Service; @Service(value="abc") public class UserDao { public void save(){ System.out.println("保存數據完成!"); } }
beans-annotation.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.edu.annotation"/> </beans>
用於測試的主類Main:
package com.edu.annotation; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext act = new ClassPathXmlApplicationContext("beans-annotation.xml"); UserDao userDao=(UserDao)act.getBean("abc"); userDao.save(); } }
運行結果爲:保存數據完成!
從例子中咱們能夠看到,基於註解方式和基於XML方式Bean配置做用相同。
在java的實現類中,Spring提供了在類內進行Bean定義的標註(寫在類名上一行),從而標識該類建立Bean,讓Spring管理。
爲了便於分類管理,基於註解方式的Bean配置分爲4類:
1.@Component:基本註解(通用Bean標註)
2.@Respository:標識持久層組件
3.@Service:標識服務層(業務層)組件
4.@Controller:標識表現層組件
當一個類(組件被標註爲Bean後),每個Bean都有一個標識名稱(給Bean命名)。分兩種:
1.若沒有在註解中指定,則實行Spring的默認命名策略:使用非限定類名,將類名的第一個字母小寫;
2.若在註解中指定(使用value屬性),就像例子中同樣,則使用指定名稱。
使用基於註解的Bean裝配時的幾點注意:
1.beans-annotation.xml中命名空間和不使用時的不一樣;
2.需導入aop的jar包。
更多詳細的基於註解的Bean裝配,請各位移步官網自行查看,這裏再也不贅述。
本篇參考書籍《Java EE框架開發技術與案例教程》