第五章spring框架基础
spring框架
- 一.spring
- 概念:
- 開發步驟:
- 第1步: 添加jar包
- 第2步: 創建Java類
- 第3步: 創建Spring配置文件
- 第4步: 編寫Spring配置文件
- 二 .控制反轉
- 概念:
- 控制反轉實現方式:
- 第1種: 構造方法
- 第2種: 工廠類的靜態方法
- 第3種: 工廠類的對象方法
- 第4種: 注解方式
- 三.依賴注入
- 概念:
- 依賴注入實現方式
- 方式1: setter方式
- 方式2: 構造函數
- 方式3: 注解方式
- 方式4: P命名空間
- 四.使用注解實現SpringAOP
- 面向切面編程:
- 術語:
- 通知類型:
- AOP通知執行過程
- 實現AOP方式
- 方式一JDK動態代理:
- 方式二CGLIB代理:
- 使用注解方式實現AOP開發步驟:
- 第1步: 添加jar包
- 第2步:編寫切面類,設置切入點和通知
- 第3步: 開啟aspectj自動代理,并注冊切面類
- 第4步: 注冊AOP
- 第5步: 正常編寫程序,測試AOP效果
- 使用XML方式實現AOP
- 第1步: 添加jar包
- 第2步: 編寫切面類
- 第3步: 編寫Spring配置文件
- 第4步: 編寫程序,測試
- mybatis與spring框架整合
- 框架的作用:
- Spring整合MyBatis:
- 整合目標:
- 整合步驟:
- 第1步: 整合jar包
- 第2步: 整合配置文件
- 第3步: 整合代碼
一.spring
概念:
Spring是由Rod Johnson開發的一個開源容器框架,提供了控制反轉[IoC],依賴注入,面向切面[AOP],事務管理,框架整合等功能,用于簡化企業級應用開發.
特點:
1.輕量級:
Spring提供了許多服務,但這些服務默認關閉.同時,完整的Spring框架可以以在1M多大小的jar文件發布.
2.控制反轉:
應用本身不負責依賴對象(被調用對象)的創建及維護,由外部容器負責依賴對象的創建及維護.
3.面向切面:
在運行時,動態的將代碼切入到類的指定方法或位置上.
4.容器:
Spring包含并管理應用對象的配置和生命周期,因此Spring稱為容器.
下載Spring:
官網地址:http://www.springsource.org/download
下載地址:https://repo.spring.io/libs-release-local/org/springframework/spring/
JDK與版本:
Spring Framework3.x: JDK5+
Spring Framework4.x: JDK6+
Spring Framework5.x: JDK8+
開發步驟:
第1步: 添加jar包
commons-logging-1.2.jar spring-aop-5.1.2.RELEASE.jarspring-beans-5.1.2.RELEASE.jarspring-context-5.1.2.RELEASE.jarspring-core-5.1.2.RELEASE.jarspring-expression-5.1.2.RELEASE.jar第2步: 創建Java類
創建1個實體類備注: 測試Spring框架控制實體類[創建實體類,提供實體類對象]第3步: 創建Spring配置文件
配置文件名稱[beans.xml,application.xml,spring.xml,spring-bean.xml等等]任意,位置不限[src下].
配置文件模板位置[參考pdf或html]
第4步: 編寫Spring配置文件
<bean>用于將指定位置的Java類,交給Spring容器管理[控制反轉(幫你創建對象),依賴注入(向你提供對象)等等]示例:<bean class="bean.User" id="myuser" />第5步: 測試程序
public static void main(String[] args) {//讀取配置文件ApplicationContext app=new ClassPathXmlApplicationContext("配置文件名.xml");//從Spring容器中獲得1個對象Object object= (Object ) app.getBean("id匿名");//Object-->Useruser.setName("小白");System.out.println(user);}二 .控制反轉
概念:
控制反轉[Inversion of Control]指應用本身不負責依賴對象(被調用對象)的創建及維護,由外部容器負責依賴對象的創建及維護.
控制反轉實現方式:
第1種: 構造方法
<bean id="Bean匿名" class="類全名" /> 第2種: 工廠類的靜態方法
<!-- Bean匿名=工廠類.靜態方法名() --> <bean id="Bean匿名" class="工廠類全名" factory-method="靜態方法名"/> 
第3種: 工廠類的對象方法
<bean id="別名A" class="工廠類全名"/> <bean id="別名" factory-bean="別名A" factory-method="方法名"/>第4種: 注解方式
a.添加context命名空間和context約束文件的地址b.添加<context:component-scan base-package="包名">c.在相關類上添加注解:注解: @Controller[標注在Action類上],@Service[標注在業務類上],@Repository,@Component[無法分辨層級,比如實體]作用: 聲明將當前類交給Spring容器管理. 
三.依賴注入
概念:
依賴注入[Dependency Injection]指在運行期,由外部容器動態地將依賴對象[要使用的對象]注入到組件中. 注意: 依賴注入的前提是控制反轉,被注入對象和接受注入的對象都必須被Spring容器管理.依賴注入實現方式
方式1: setter方式
Java類: private 普通屬性類型 屬性名; private 自定義類類型 屬性名; private 集合類型 屬性名; //提供setter和getter 配置文件: <bean id="Bean對象匿名" class="類全名"><property name="屬性名" value="值" /><property name="屬性名" ref="Bean對象匿名" /><property name="屬性名"><list>\<value><set>\<value><map>\<entry><props>\<prop></property> </bean>//使用setter方式示例代碼 <bean class="bean.Car" id="car"/> <bean id="di_setter" class="bean.DI_Setter"><!--1.setter方式--><!--普通數據--><property name="id" value="1"/><property name="name" value="小蜜瓜"/><property name="income" value="12000"/><property name="sex" value="女"/><property name="marry" value="true"/><!--對象數據--><property name="car" ref="car"/><!--集合數據--><property name="myList" ><list ><value>AAA</value><value>BBB</value><value>CCC</value></list></property><property name="myMap"><map><entry key="a" value="1"/><entry key="b" value="2"/><entry key="b" value="3"/></map></property><property name="mySet"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></property> </bean>方式2: 構造函數
Java類: private 普通屬性類型 屬性名; private 自定義類類型 屬性名; private 集合類型 屬性名; //提供有參構造方法 配置文件: <bean id="Bean對象匿名" class="類全名"><constructor-arg index="參數索引" value="值" /><constructor-arg index="參數索引" type="類全名" ref="Bean對象匿名" /><constructor-arg index="參數索引" ><list/set/map/props>[參考setter方式]</constructor-arg> </bean>//構造函數使用示例<bean class="bean.Car" id="car"/> <bean id="di_setter" class="bean.DI_Setter"><!--1.構造函數方式--><!--普通數據--> <constructor-arg name="id" value="1"/><constructor-arg name="name" value="小蜜瓜"/><constructor-arg name="income" value="12000"/><constructor-arg name="sex" value="女"/><constructor-arg name="marry" value="true"/><!--對象數據--><constructor-arg name="car" ref="car"/><!--list集合數據--><constructor-arg name="myList" ><list ><value>AAA</value><value>BBB</value><value>CCC</value></list></constructor-arg><!---map集合數據--><constructor-arg name="myMap"><map><entry key="a" value="1"/><entry key="b" value="2"/><entry key="b" value="3"/></map></constructor-arg><!--set方法--><constructor-arg name="mySet"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></constructor-arg> </bean>方式3: 注解方式
Java類與配置文件:
a.配置文件中context命名空間和context約束文件的地址
b.配置文件中添加<context:component-scan base-package=“包名” />
c.在Java類的屬性或setter上添加注解: @Autowired或@Resource.
@Autowired:
格式: @Autowired [(required=true)]
說明:
1.編寫在屬性或setter上,表示將Spring容器中同類型的Bean對象賦給該屬性
2.根據屬性類型到Spring容器中尋找bean對象,然后注入依賴對象
3.required默認為true,即配置文件中必須有同類型的Bean對象,否則報錯
@Resource:
格式: @Resource[(name=“Bean對象匿名”)]
說明:
1.編寫在屬性或setter上面,表示將Bean對象匿名對應的對象賦給該屬性
2.name屬性值為Bean對象匿名,表示將Bean對象匿名對應的對象賦給該屬性
3.@Resource標注在setter上或不設置name屬性,則name屬性值默認為屬性名
4.若未設置name屬性,并且按照默認名稱仍然找不到依賴對象時,@Resource將會按屬性類型查找同類型的bean對象,然后注入到屬性中.
方式4: P命名空間
Java類:
提供屬性的setter和getter方法,無需其他操作.
配置文件:
第1步: 添加命名空間
xmlns:p=“http://www.springframework.org/schema/p”
第2步: 注冊bean,并注入數據
<bean id=“bean匿名” class=“類全名” p:屬性名/屬性名-ref=“值/匿名” />
四.使用注解實現SpringAOP
面向切面編程:
面向切面編程[Aspect Oriented Programming,簡稱AOP]指在運行時,動態的將代碼切入到類的指定方法或位置上的編程思想.
術語:
- aspect(切面): 指橫切性關注點的抽象即為切面,它與類相似,類是對物體特征的抽象.[通俗講,切面是定義了額外功能的類].
- joinpoint(連接點): 指被攔截的點,分為屬性,方法,構造器.Spring只支持方法類型的連接點.[通俗講,應用額外功能的地方稱為連接點]
- pointcut(切入點): 指對"連接點"進行攔截的定義.[通俗講,控制"哪些地方"應用切面]
- advice(通知): 指攔截到"連接點"之后所要做的事情.通知分為前置通知,后置通知,異常通知,最終通知,環繞通知.
- target(目標對象): 指要使用切面的類.
- weave(織入): 指將"切面"應用到"目標對象"并導致"代理對象"創建的過程稱為織入.
- introduction(引入): 在不修改類代碼的前提下,Introduction可以在運行期為類動態地添加一些方法或Field.
通知類型:
前置通知: 在目標方法執行之前,執行前置通知 后置通知: 在目標方法執行之后,執行后置通知 異常通知: 在目標方法執行并拋出異常時,執行異常通知 最終通知: 在目標方法執行之后或拋出異常時,執行最終通知 環繞通知: 在前置通知和目標方法之前,以及最終通知之前執行環繞通知AOP通知執行過程
實現AOP方式
Spring提供了多種方式實現AOP,常用:(JDK動態代理和CGLIB代理)
方式一JDK動態代理:
使用Proxy類創建代理對象,含有處理類必須實現InvocationHandler接口.目標類必須實現接口[不限制類型],JDK動態代理通過實現目標類實現的所有接口,實現動態代理功能
方式二CGLIB代理:
使用Enhancer類生成代理對象,含有處理類必須實現MethodInterceptor接口.CGLIB通過生成目標類的子類,并重寫目標類非final的方法實現動態代理功能
代理方式選擇:
1.默認情況下,目標對象[被攔截的對象]必須實現了接口,Spring才會使用JDK動態代理.否則,Spring自動使用CGLIB代理
2.當目標對象實現了接口,可以設置aop:aspectj-autoproxy的proxy-target-class為true,強制使用CGLIB代理
使用注解方式實現AOP開發步驟:
第1步: 添加jar包
第2步:編寫切面類,設置切入點和通知
- @Aspect: 編寫在類聲明上面,表示聲明當前類為切面類
- @Pointcut: 編寫在方法上面,定義切入點要求,"方法名()"即為切入點名
格式:@Pointcut(value = “execution(表達式)”)
表達式:
execution(返回值類型 目錄.類名.方法名(參數類型,…) && args(參數名,參數名,…))
說明:
1.返回值類型為void或類型全名,可配合"!“使用.[!void表示有返回值]
2.任意返回值/任意類名/任意方法名,都可以用”“表示.
3.若包含指定目錄的任意子目錄,用”.“表示
4.參數類型為類全名.任意個數和類型用”…"表示
5.args()表示必須有指定個數的參數
示例:@Pointcut(value = "execution( service.UserService.*(…))")
- @Before :編寫在方法上面,鄙視聲明當前方法為前置通知
格式: @Before(value=“切入點名”,argNames=“參名,…”) - @AfterReturning: 編寫在方法上面,表示聲明當前方法為后置通知
格式: @AfterReturning(value=“切入點名”,return=“參數名[接收返回值]”) - @After: 編寫在方法上面,表示聲明當前方法為最終通知
格式: @After(value=“切入點名”) - @AfterThrowing: 編寫在方法上面,表示聲明當前方法為例外通知
格式: @AfterThrowing(value=“切入點名”,throwing=“參數名[接收異常對象]”) - @Around: 編寫在方法上面,表示聲明當前方法為環繞通知
格式: @Around(value=“切入點名”)
說明:
public Object 環繞通知(ProceedingJoinPoint point){
Object rs=point.proceed();//繼續執行下1個通知或調用目標方法
return rs; //必須返回,否則后置通知無法獲得目標方法返回值
}
注意: @Before,@AfterReturning,@After,@AfterThrowing,@Aroud默認屬性為value[切入點名]
第3步: 開啟aspectj自動代理,并注冊切面類
<context:component-scan base-package="bean,service,aop"/<!--開啟自動掃描并將有注釋的類自動注冊--> <aop:aspectj-autoproxy/><!--啟動AspectJ自動代理功能-->第4步: 注冊AOP
<!--注冊切面類--><bean id="myaop" class="aop.MyAOP" />或@Component <!--若使用注釋即可自動注冊該類-->第5步: 正常編寫程序,測試AOP效果
使用XML方式實現AOP
步驟:
第1步: 添加jar包
同annotation方式
第2步: 編寫切面類
同annotation方式,但是移除所有的注解[在配置文件中實現注解的功能].
/*@Component*/ @Aspect /*聲明當前類為切入類 切入類包含額外的方法*/ public class AOP1 {@Pointcut(value = "execution(* service.UserService.*(..))")public void test(){System.out.println("定義切入點:切入點為被標注的方法的名稱");}@Before("test()")public void qianzhitongzhi(){System.out.println("前置通知");}@AfterReturning("test()")public void houzhitongzhi(){System.out.println("后置通知");}@After("test()")public void zuizhongtongzhi(){System.out.println("最終通知");}@AfterThrowing("test()")public void yichangtongzhi(){System.out.println("異常通知");}//環繞通知-@Around("test()")public Object huanraotongzhi(ProceedingJoinPoint point ) throws Throwable {System.out.println("進入環繞通知");Object ob = point.proceed();System.out.println("離開環繞通知");return ob;} }第3步: 編寫Spring配置文件
a.將切面類交給Spring管理
b.配置面向切面
第4步: 編寫程序,測試
同annotation方式
mybatis與spring框架整合
框架的作用:
MyBatis: 用于替代JDBC,用于數據持久化
Spring: 用于整合框架,提供整合功能及其他功能[IoC,DI,AOP,事務管理等等]
SpringMVC: 用于替代JSP,用于處理請求和響應[SpringMVC屬于Spring的一部分]
Spring整合MyBatis:
MyBatis功能/操作: 配置文件[實體類別名,數據源,映射文件等等],映射文件[業務標簽],MyBatis代碼[SqlSessionFactory,SqlSession等對象操作]
Spring功能/操作: IoC,DI,AOP,事務管理
整合目標:
- 用Spring來替代MyBatis中的數據源,提供SqlSessionFactory,SqlSession等對象,管理事務
- .MyBatis整合中要做的內容: 配置文件[保留 實體類別名,映射文件等等],映射文件[業務標簽]無變化,MyBatis代碼[業務代碼]
整合步驟:
第1步: 整合jar包
mybatis-3.5.1.jar
log4j-1.2.17.jar
mysql-connector-java-5.1.22-bin.jar
commons-logging-1.2.jar
spring-aop-5.1.2.RELEASE.jar
spring-beans-5.1.2.RELEASE.jar
spring-context-5.1.2.RELEASE.jar
spring-core-5.1.2.RELEASE.jar
spring-expression-5.1.2.RELEASE.jar
spring-tx-5.1.2.RELEASE.jar
aspectjrt.jar
aspectjweaver.jar
cglib-nodep-2.1_3.jar
連接池: commons-dbcp-1.4.jar,commons-pool-1.6.jar
MyBatis與Spring整合: mybatis-spring-2.0.3.jar
第2步: 整合配置文件
MyBatis配置文件:
mybatis-conf.xml[實體類別名,環境(數據源),加載映射],
log4j.xml[控制日志輸出],映射文件[業務標簽]
Spring配置文件: application.xml[控制反轉]
整合后:
MyBatis配置文件中: 去掉環境配置(數據源),實體類別名,加載映射
log4j.xml[控制日志輸出]: 無需操作
映射文件[業務標簽]: 無需操作、
Spring配置文件中: 添加數據源,提供SqlSessionFactory,提供事務管理
1.開啟自動掃描: 掃描service,action,mapper等等,實現控制反轉[管理相關對象]---->注解方式實現控制反轉
2.提供數據源
3.提供SqlSessionFactoryBean
4.提供事務管理 @@Transactional標注的類中所有關于數據庫操作時,自動提交事務,以及回滾事務
5.注冊其他必須的對象
第3步: 整合代碼
MyBatis代碼正常編寫即可,若需要SqlSessionFactory對象可以從Spring容器中獲得.
Mapper方式實現CURD:
1.Mapper接口: 正常編寫
2.業務類: 聲明Mapper接口類型的屬性,并由Spring注入屬性值
3.注冊Mapper接口:
總結
以上是生活随笔為你收集整理的第五章spring框架基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四章关联映射
- 下一篇: 在安装、重装MySQL时出现could