一嚷辅、什么是spring
Spring是一個(gè)開源框架,Spring是于2003年興起的一個(gè)輕量級(jí)的Java開發(fā)框架署海,由Rod Johnson在其著作Expert One-On-One J2EE
Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的呐籽『拥框架的主要優(yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個(gè)組件沙庐,同時(shí)為J2EE應(yīng)用程序開發(fā)提供集成的框架鲤妥。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情佳吞。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)棉安。從簡(jiǎn)單性底扳、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益贡耽。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)衷模。簡(jiǎn)單來說,Spring是一個(gè)分層的JavaSE/EEfull-stack(一站式)輕量級(jí)開源框架菇爪。
EE開發(fā)分成三層結(jié)構(gòu):
* WEB層:Spring MVC.
*業(yè)務(wù)層:Bean管理:(IOC)
*持久層:Spring的JDBC模板.ORM模板用于整合其他的持久層框架.
Expert One-to-One J2EE Design andDevelopment:J2EE的設(shè)計(jì)和開發(fā):(2002.EJB)
Expert One-to-One J2EE Development withoutEJB:J2EE不使用EJB的開發(fā).
2.學(xué)習(xí)Spring的優(yōu)勢(shì)
方便解耦算芯,簡(jiǎn)化開發(fā)
Spring ?就是一個(gè)大工廠,可以將所有對(duì)象創(chuàng)建和依賴關(guān)系維護(hù)凳宙,交給Spring管理
AOP編程的支持
Spring提供面向切面編程熙揍,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截、運(yùn)行監(jiān)控的功能
聲明式事物的支持
只需要通過配置就可以完成對(duì)事物的管理氏涩,而無需手動(dòng)編程届囚。
方便程序的測(cè)試
Spring對(duì)Junit4支持,可以通過注解方便的測(cè)試Spring程序
方便集成各種優(yōu)秀的框架
Spring不排斥各種優(yōu)秀的開源框架是尖,其內(nèi)部提供了各種優(yōu)秀框架(struts2意系、Hibernate)的直接支持
降低JavaEE API的使用難度
Spring對(duì)javaee開發(fā)中非常難用的一些API,都提供可封裝饺汹。是用難度降低蛔添。
IOC:Inversion of
Control控制反轉(zhuǎn).指的是對(duì)象的創(chuàng)建權(quán)反轉(zhuǎn)(交給)給Spring.
作用是實(shí)現(xiàn)了程序的解耦合.
3.使用Spring
3.1下載Spring開發(fā)包
http://spring.io/
3.2創(chuàng)建WEB項(xiàng)目,導(dǎo)包
lQ?
1.1.1.1步驟三:引入相關(guān)配置文件:
log4j.properties
applicationContext.xml
引入約束:
spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
1.1.1.2步驟四:編寫相關(guān)的類:
publicinterfaceUserDao {
publicvoidsayHello();
}
publicclassUserDaoImplimplementsUserDao {
@Override
publicvoidsayHello() {
System.out.println("Hello
Spring...");
}
}
1.1.1.3步驟五:完成配置:
"userDao"class="cn.itcast.spring.demo1.UserDaoImpl">
1.1.1.4步驟六:編寫測(cè)試程序:
@Test
// Spring的方式:
publicvoiddemo2(){
//創(chuàng)建Spring的工廠類:
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");
//通過工廠解析XML獲取Bean的實(shí)例.
UserDaouserDao= (UserDao)applicationContext.getBean("userDao");
userDao.sayHello();
}
1.1.1.5IOC和DI:
IOC:控制反轉(zhuǎn),將對(duì)象的創(chuàng)建權(quán)交給了Spring.
DI:DependencyInjection依賴注入.需要有IOC的環(huán)境,Spring創(chuàng)建這個(gè)類的過程中,Spring將類的依賴的屬性設(shè)置進(jìn)去.
1.1.2Spring中的工廠:
1.1.2.1ApplicationContext:
ApplicatioContext接口有兩個(gè)實(shí)現(xiàn)類:
ClassPathXmlApplicationContext:加載類路徑下Spring的配置文件.
FileSystemXmlApplicationContext:加載本地磁盤下Spring的配置文件.
1.1.2.2BeanFactory:
1.1.2.3BeanFactory和ApplicationContext的區(qū)別:
BeanFactory:是在getBean的時(shí)候才會(huì)生成類的實(shí)例.
ApplicationContext:在加載applicationContext.xml時(shí)候就會(huì)創(chuàng)建.
1.1.3配置STS的XML的提示:
1.1.3.1Spring配置文件中提示的配置
復(fù)制路徑:
*http://www.springframework.org/schema/beans/spring-beans.xsd
查找XML Catalog:
點(diǎn)擊Add..
1.1.4Spring的相關(guān)配置:
1.1.4.1id屬性和name屬性標(biāo)簽的配置
id:Bean起個(gè)名字.在約束中采用ID的約束:唯一.必須以字母開始兜辞,可以使用字母迎瞧、數(shù)字、連字符逸吵、下劃線凶硅、句話、冒號(hào)id:不能出現(xiàn)特殊字符.
name:Bean起個(gè)名字.沒有采用ID的約束.name:出現(xiàn)特殊字符.如果沒有id的話, name可以當(dāng)做id使用.
*整合struts1的時(shí)候:
1.1.4.2scope屬性:Bean的作用范圍.
* singleton:默認(rèn)值扫皱,單例的.
* prototype:多例的.
* request:WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到request域中.
* session:WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到session域中.
* globalSession:WEB項(xiàng)目中,應(yīng)用在Porlet環(huán)境.如果沒有Porlet環(huán)境那么globalSession相當(dāng)于session.
1.1.4.3Bean的生命周期的配置:
通過配置標(biāo)簽上的init-method作為Bean的初始化的時(shí)候執(zhí)行的方法足绅,配置destroy-method作為Bean的銷毀的時(shí)候執(zhí)行的方法。
銷毀方法想要執(zhí)行韩脑,需要是單例創(chuàng)建的Bean而且在工廠關(guān)閉的時(shí)候氢妈,Bean才會(huì)被銷毀.
1.1.5Spring的Bean的管理XML的方式:
1.1.5.1Spring的Bean的屬性注入:
【構(gòu)造方法的方式注入屬性】
"car"class="cn.itcast.spring.demo4.Car">
undefined"name"value="保時(shí)捷"/>undefined
undefined"price"value="1000000"/>undefined
【set方法的方式注入屬性】
"car2"class="cn.itcast.spring.demo4.Car2">
"name"value="奇瑞QQ"/>
"price"value="40000"/>
1.1.5.2Spring的屬性注入:對(duì)象類型的注入:
"person"class="cn.itcast.spring.demo4.Person">
"name"value="會(huì)希"/>
"car2"ref="car2"/>
1.1.5.3名稱空間p的屬性注入的方式:Spring2.x版本后提供的方式.
第一步:引入p名稱空間
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
第二步:使用p名稱空間.
*普通屬性:p:屬性名稱=””
*對(duì)象類型屬性:p:屬性名稱-ref=””
p:price="1200000"/>
1.1.5.4SpEL的方式的屬性注入:Spring3.x版本后提供的方式.
SpEL:Spring Expression Language.
語法:#{ SpEL }
"car2"class="cn.itcast.spring.demo4.Car2">
"name"value="#{'奔馳'}"/>
"price"value="#{800000}"/>
引用了另一個(gè)類的屬性
1.1.5.5注入復(fù)雜類型:
"collectionBean"class="cn.itcast.spring.demo5.CollectionBean">
"arrs">
會(huì)希
冠希
天一
"list">
芙蓉
如花
鳳姐
"map">
"aaa"value="111"/>
"bbb"value="222"/>
"ccc"value="333"/>
"properties">
"username">root
"password">123
1.1.5.6Spring的分配置文件的開發(fā)
一種:創(chuàng)建工廠的時(shí)候加載多個(gè)配置文件:
ApplicationContext applicationContext = newClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
二種:在一個(gè)配置文件中包含另一個(gè)配置文件:
1.2案例代碼
1.2.1搭建環(huán)境:
1.2.1.1創(chuàng)建web項(xiàng)目,引入jar包.
WEB層使用Struts2:
* Struts2開發(fā)的基本的包
Spring進(jìn)行Bean管理:
*Spring開發(fā)的基本的包
1.2.1.2引入配置文件:
Struts2:
*web.xml
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
*struts.xml
Spring:
*applicationContext.xml
*log4j.properties
1.2.1.3引入頁面:
1.2.1.4創(chuàng)建包結(jié)構(gòu)和類:
1.2.1.5在添加頁面提交內(nèi)容到Action:
1.2.1.6改寫Action類并配置Action:
"crm"extends="struts-default"namespace="/">
"customer_*"class="cn.itcast.crm.web.action.CustomerAction"method="{1}">
1.2.1.7在Action調(diào)用業(yè)務(wù)層:
將業(yè)務(wù)層類配置到Spring中:
在Action中獲取業(yè)務(wù)層類:
publicString save(){
System.out.println("Action中的save方法執(zhí)行了...");
System.out.println(customer);
//傳統(tǒng)方式:
/*CustomerService customerService = new CustomerServiceImpl();
customerService.save(customer);*/
// Spring的方式進(jìn)行操作:
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");
CustomerServicecustomerService= (CustomerService)applicationContext.getBean("customerService");
customerService.save(customer);
returnNONE;
}
****每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)工廠類,服務(wù)器端的資源就浪費(fèi)了,一般情況下一個(gè)工程只有一個(gè)Spring的工廠類就OK了.
*將工廠在服務(wù)器啟動(dòng)的時(shí)候創(chuàng)建好,將這個(gè)工廠放入到ServletContext域中.每次獲取工廠從ServletContext域中進(jìn)行獲取.
*ServletContextLinstener:監(jiān)聽ServletContext對(duì)象的創(chuàng)建和銷毀.
1.2.2Spring整合WEB項(xiàng)目
1.2.2.1引入spring-web.jar包:
配置監(jiān)聽器:
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
1.2.2.2改寫Action:
/**
*保存客戶的執(zhí)行的方法:save
*/
publicString save(){
//傳統(tǒng)方式:
/*CustomerService
customerService = new CustomerServiceImpl();
customerService.save(customer);*/
// Spring的方式進(jìn)行操作:
/*ApplicationContext
applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService customerService = (CustomerService)
applicationContext.getBean("customerService");*/
WebApplicationContextapplicationContext=WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
CustomerServicecustomerService= (CustomerService)applicationContext.getBean("customerService");
System.out.println("Action中的save方法執(zhí)行了...");
System.out.println(customer);
customerService.save(customer);
returnNONE;
}
1.2.2.3編寫Dao并配置:
1.2.2.4業(yè)務(wù)層調(diào)用DAO:
publicclassCustomerServiceImplimplementsCustomerService {
privateCustomerDaocustomerDao;
publicvoidsetCustomerDao(CustomerDaocustomerDao) {
this.customerDao=customerDao;
}
…
}
??