專業(yè)術(shù)語了解
- 組件/框架設(shè)計(jì)
- 侵入式設(shè)計(jì) : 引入了框架,對(duì)現(xiàn)有的類的結(jié)構(gòu)有影響;即需要實(shí)現(xiàn)或繼承某些特定類。例如:Struts框架
- 非侵入式設(shè)計(jì) : 引入了框架,對(duì)現(xiàn)有的類結(jié)構(gòu)沒有影響。例如:Hibernate框架 / Spring框架
- 控制反轉(zhuǎn)與依賴注入
- 控制反轉(zhuǎn)IOC (Inversion on Control) : 對(duì)象的創(chuàng)建交給外部容器完成,這個(gè)就做控制反轉(zhuǎn).
- 依賴注入 (dependency injection) : 處理對(duì)象的依賴關(guān)系
- 區(qū)別 :
- 控制反轉(zhuǎn), 解決對(duì)象創(chuàng)建的問題【對(duì)象創(chuàng)建交給別人】
- 依賴注入,在創(chuàng)建完對(duì)象后,對(duì)象的關(guān)系處理就是依賴注入【通過set方法依賴注入】
- AOP(面向切面編程)
- 切面 : 簡(jiǎn)單來說來可以理解為一個(gè)類,由很多重復(fù)代碼形成的類。
- 切面舉例:事務(wù)、日志、權(quán)限;
Spring框架
- 概述 :
- Spring框架可以解決<strong>對(duì)象創(chuàng)建以及對(duì)象之間依賴關(guān)系</strong>的一種框架。且可以和其他框架一起使用 : Spring與Struts, Spring與hibernate (起到整合(粘合) 作用的一個(gè)框架)
- Spring提供了一站式解決方案(六大模塊功能)
1)Spring Core spring的核心功能(CORE) : IOC容器, 解決對(duì)象創(chuàng)建及依賴關(guān)系
2)Spring Web Spring (WEB) : 對(duì)web模塊的支持- 可以與struts整合,讓struts的action創(chuàng)建交給spring
- spring mvc模式
3)Spring DAO Spring (DAO) : 對(duì)jdbc操作的支持(JdbcTemplate模板工具類)
4)Spring ORM spring (ORM) : 對(duì)orm的支持 - 既可以與hibernate整合(session)
- 也可以使用spring的對(duì)hibernate操作的封裝
5)Spring AOP (AOP) : 切面編程
6)SpringEE spring (JEE) : 對(duì)javaEE其他模塊的支持
- 開發(fā)步驟
-
spring各個(gè)版本中:
- 在3.0以下的版本,源碼有spring中相關(guān)的所有包 (spring功能 + 依賴包) ; 如2.5版本;
- 在3.0以上的版本,源碼中只有spring的核心功能包 (沒有依賴包) (如果要用依賴包,需要單獨(dú)下載)
開發(fā)步驟
- 源碼, jar文件:spring-framework-3.2.5.RELEASE
- `` commons-logging-1.1.3.jar `` : 日志
- `` spring-beans-3.2.5.RELEASE.jar `` : bean節(jié)點(diǎn)
- `` spring-context-3.2.5.RELEASE.jar `` : spring上下文節(jié)點(diǎn)
- `` spring-core-3.2.5.RELEASE.jar `` : spring核心功能
- `` spring-expression-3.2.5.RELEASE.jar `` : spring表達(dá)式相關(guān)表
- <strong>以上是必須引入的5個(gè)jar文件,在項(xiàng)目中可以用戶庫(kù)管理!</strong>
- jar包下載地址 : http://repo.spring.io/release/org/springframework/spring/
- 核心配置文件: applicationContext.xml
- Spring配置文件:applicationContext.xml / bean.xml
- 約束參考:spring-framework-3.2.5.RELEASE\docs\spring-framework-reference\htmlsingle\index.html
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!-- IOC容器的配置: 要?jiǎng)?chuàng)建的所有的對(duì)象都配置在這里 -->
<bean id="user" class="sh.anderson.a_hello.User"></bean>
</beans>
- Api
public class App {
// 1. 通過工廠類得到IOC容器創(chuàng)建的對(duì)象
@Test
public void testIOC() throws Exception {
// 創(chuàng)建對(duì)象
// User user = new User();
// 現(xiàn)在,把對(duì)象的創(chuàng)建交給spring的IOC容器
Resource resource = new ClassPathResource("sh/anderson/a_hello/applicationContext.xml");
// 創(chuàng)建容器對(duì)象(Bean的工廠), IOC容器 = 工廠類 + applicationContext.xml
BeanFactory factory = new XmlBeanFactory(resource);
// 得到容器創(chuàng)建的對(duì)象
User user = (User) factory.getBean("user");
System.out.println(user.getId());
}
//2. (方便)直接得到IOC容器對(duì)象
@Test
public void testAc() throws Exception {
// 得到IOC容器對(duì)象
ApplicationContext ac = new ClassPathXmlApplicationContext("sh/anderson/a_hello/applicationContext.xml");
// 從容器中獲取bean
User user = (User) ac.getBean("user");
System.out.println(user);
}
}
bean對(duì)象創(chuàng)建的細(xì)節(jié)
- 對(duì)象創(chuàng)建 :
-
scope="singleton": 默認(rèn)值,即默認(rèn)是單例【service/dao/工具類】 -
scope="prototype": 多例【Action對(duì)象】
-
- 創(chuàng)建時(shí)間 :
-
scope="singleton": 在啟動(dòng)(容器初始化之前),就已經(jīng)創(chuàng)建了bean,且整個(gè)應(yīng)用只有一個(gè) -
scope="prototype": 在用到對(duì)象的時(shí)候,才創(chuàng)建對(duì)象
-
- 延遲創(chuàng)建 : (只對(duì)單例有效)
-
lazy-init="false": 默認(rèn)為false, 不延遲創(chuàng)建,即在啟動(dòng)時(shí)候就創(chuàng)建對(duì)象 -
lazy-init="true": 延遲初始化,在用到對(duì)象的時(shí)候才創(chuàng)建對(duì)象
-
- 對(duì)象創(chuàng)建之后的初始化和銷毀
-
init-method="init_user": 對(duì)應(yīng)對(duì)象的init_user方法, 在對(duì)象創(chuàng)建愛之后執(zhí)行 -
destroy-method="destroy_user": 在調(diào)用容器對(duì)象的destriy方法時(shí)候執(zhí)行 (容器用實(shí)現(xiàn)類)
-
- 示例代碼 :
@Test
public void testIOC() throws Exception {
// 得到IOC容器對(duì)象 【用實(shí)現(xiàn)類,因?yàn)橐{(diào)用銷毀的方法】
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/a_hello/applicationContext.xml");
System.out.println("-----容器創(chuàng)建-----");
// 從容器中獲取bean
User user1 = (User) ac.getBean("user");
User user2 = (User) ac.getBean("user");
System.out.println(user1);
System.out.println(user2);
// 銷毀容器對(duì)象
ac.destroy();
}
SpringIOC容器
- SpringIOC容器,是spring核心內(nèi)容。其作用是創(chuàng)建對(duì)象 & 處理對(duì)象的依賴關(guān)系
- IOC容器創(chuàng)建對(duì)象:
- 創(chuàng)建對(duì)象, 有幾種方式:
1)調(diào)用無參數(shù)構(gòu)造器
2)帶參數(shù)構(gòu)造器
3)工廠創(chuàng)建對(duì)象- 工廠類,靜態(tài)方法創(chuàng)建對(duì)象
- 工廠類,非靜態(tài)方法創(chuàng)建對(duì)象
- 創(chuàng)建對(duì)象, 有幾種方式:
<?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:p="http://www.springframework.org/schema/p"
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">
<!-- ###############對(duì)象創(chuàng)建############### -->
<!-- 1. 默認(rèn)無參數(shù)構(gòu)造器
<bean id="user1" class="cn.itcast.b_create_obj.User"></bean>
-->
<!-- 2. 帶參數(shù)構(gòu)造器, 引用參數(shù)類型一定要寫全名 -->
<bean id="user2" class="cn.itcast.b_create_obj.User">
<constructor-arg index="0" type="int" value="100"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" value="Jack"></constructor-arg>
</bean>
<!-- 定義一個(gè)字符串,值是"Jack" ; String s = new String("jack")-->
<bean id="str" class="java.lang.String">
<constructor-arg value="Jacks"></constructor-arg>
</bean>
<bean id="user3" class="cn.itcast.b_create_obj.User">
<constructor-arg index="0" type="int" value="100"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" ref="str"></constructor-arg>
</bean>
<!-- 3. 工廠類創(chuàng)建對(duì)象 -->
<!-- # 3.1 工廠類,實(shí)例方法 -->
<!-- 先創(chuàng)建工廠 -->
<bean id="factory" class="cn.itcast.b_create_obj.ObjectFactory"></bean>
<!-- 在創(chuàng)建user對(duì)象,用factory方的實(shí)例方法 -->
<bean id="user4" factory-bean="factory" factory-method="getInstance"></bean>
<!-- # 3.2 工廠類: 靜態(tài)方法 -->
<!--
class 指定的就是工廠類型
factory-method 一定是工廠里面的“靜態(tài)方法”
-->
<bean id="user" class="cn.itcast.b_create_obj.ObjectFactory" factory-method="getStaticInstance"></bean>
</beans>
2)對(duì)象依賴關(guān)系
- Spring中,如何給對(duì)象的屬性賦值? 【DI, 依賴注入】
- 通過構(gòu)造函數(shù)
- 通過set方法給屬性注入值
<!-- dao instance -->
<bean id="userDao" class="cn.itcast.c_property.UserDao"></bean>
<!-- service instance -->
<bean id="userService" class="cn.itcast.c_property.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- action instance -->
<bean id="userAction" class="cn.itcast.c_property.UserAction">
<property name="userService" ref="userService"></property>
</bean>
3) p名稱空間
<?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:p="http://www.springframework.org/schema/p"
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">
<!-- ###############對(duì)象屬性賦值############### -->
<!--
給對(duì)象屬性注入值:
# p 名稱空間給對(duì)象的屬性注入值
(spring3.0以上版本才支持)
-->
<bean id="userDao" class="cn.itcast.c_property.UserDao"></bean>
<bean id="userService" class="cn.itcast.c_property.UserService" p:userDao-ref="userDao"></bean>
<bean id="userAction" class="cn.itcast.c_property.UserAction" p:userService-ref="userService"></bean>
<!-- 傳統(tǒng)的注入:
<bean id="user" class="cn.itcast.c_property.User" >
<property name="name" value="xxx"></property>
</bean>
-->
<!-- p名稱空間優(yōu)化后 -->
<bean id="user" class="cn.itcast.c_property.User" p:name="Jack0001"></bean>
</beans>
4)自動(dòng)裝配(了解)
- 根據(jù)名稱自動(dòng)裝配:autowire="byName"
- 自動(dòng)去IOC容器中找與屬性名同名的引用的對(duì)象,并自動(dòng)注入
<!-- ###############自動(dòng)裝配############### -->
<bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean>
<bean id="userService" class="cn.itcast.d_auto.UserService" autowire="byName"></bean>
<!-- 根據(jù)“名稱”自動(dòng)裝配: userAction注入的屬性,會(huì)去ioc容器中自動(dòng)查找與屬性同名的對(duì)象 -->
<bean id="userAction"
class="cn.itcast.d_auto.UserAction" autowire="byName"></bean>
- 也可以定義到全局, 這樣就不用每個(gè)bean節(jié)點(diǎn)都去寫autowire=”byName”
<?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:p="http://www.springframework.org/schema/p"
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" default-autowire="byName"> 根據(jù)名稱自動(dòng)裝配(全局)
<!-- ###############自動(dòng)裝配############### -->
<bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean>
<bean id="userService" class="cn.itcast.d_auto.UserService"></bean>
<bean id="userAction" class="cn.itcast.d_auto.UserAction"></bean>
</beans>
- 根據(jù)類型自動(dòng)裝配:autowire="byType"
- 必須確保改類型在IOC容器中只有一個(gè)對(duì)象;否則報(bào)錯(cuò)
<?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:p="http://www.springframework.org/schema/p"
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" default-autowire="byType">
<!-- ###############自動(dòng)裝配############### -->
<bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean>
<bean id="userService" class="cn.itcast.d_auto.UserService"></bean>
<!-- 如果根據(jù)類型自動(dòng)裝配: 必須確保IOC容器中只有一個(gè)該類型的對(duì)象 -->
<bean id="userAction" class="cn.itcast.d_auto.UserAction"></bean>
<!-- 報(bào)錯(cuò): 因?yàn)樯厦嬉呀?jīng)有一個(gè)該類型的對(duì)象,且使用了根據(jù)類型自動(dòng)裝配
<bean id="userService_test" class="cn.itcast.d_auto.UserService" autowire="byType"></bean>
-->
</beans>
- 總結(jié) : Spring提供的自動(dòng)裝配主要是為了簡(jiǎn)化配置; 但是不利于后期的維護(hù)(一般不推薦使用)
5) 注解
- 注解方式可以簡(jiǎn)化spring的IOC容器的配置!
- 使用注解步驟:
1)先引入context名稱空間 : `` xmlns:context="http://www.springframework.org/schema/context" ``
2)開啟注解掃描 : `` <context:component-scan base-package="cn.itcast.e_anno2"></context:component-scan> ``
3)使用注解 : 通過注解的方式,把對(duì)象加入ioc容器
- 創(chuàng)建對(duì)象以及處理對(duì)象依賴關(guān)系,相關(guān)的注解:
- `` @Component `` : 指定把一個(gè)對(duì)象加入IOC容器
- `` @Repository `` : 作用同@Component, 在持久層使用
- `` @Service `` : 作用同@Component, 在業(yè)務(wù)邏輯層使用
- `` @Controller `` : 作用同@Component, 在控制層使用
- `` @Resource `` : 屬性注入
- 總結(jié):
1> 使用注解, 可以簡(jiǎn)化配置, 且可以把對(duì)象加入IOC容器及處理依賴關(guān)系(DI)
2> 注解可以和XML配置一起使用。
Spring與Struts框架整合
-
SSH整合:
- Spring與Struts
- Spring,負(fù)責(zé)對(duì)象對(duì)象創(chuàng)建
- Struts, 用Action處理請(qǐng)求
- 關(guān)鍵點(diǎn):讓struts框架action對(duì)象的創(chuàng)建,交給spring完成!
- Spring與Hibernate
- 關(guān)鍵點(diǎn) : sessionFactory對(duì)象交給spring創(chuàng)建!
- Spring與Struts
-
步驟:
- 引入jar文件
1)引入struts .jar相關(guān)文件
2)spring-core 相關(guān)jar文件
3)spring-web 支持jar包-
spring-web-3.2.5.RELEASE.jar: Spring源碼 -
struts2-spring-plugin-2.3.4.1.jar: Struts源碼
-
- 配置XML
-
struts.xml: struts路徑與action映射配置 -
bean.xml: spring ioc容器配置 -
web.xml: 核心過濾器, 引入struts功能
【初始化spring的ioc容器】
-
- 引入jar文件