1.IOC:控制反轉(zhuǎn)(DI:依賴注入)對(duì)控制反轉(zhuǎn)和依賴注入的理解:
image.png
其中原理是利用反射機(jī)制調(diào)用setXxx方法
2.新建的applicationContext.xml雖然是xml文件,但是是一個(gè)bean類型榜苫,新建時(shí)應(yīng)按下圖選擇。
image.png
3.applicationContext.xml中新增加對(duì)象的方式(簡(jiǎn)單對(duì)象用value,如果是對(duì)象類型紧索,用ref圾旨,且值為需要應(yīng)用的id值):
image.png
4.獲得對(duì)象的三種方法:
- 直接new毒租,最麻煩悴侵,代碼分散是整,不好管理
- 用工廠管理肖揣,代碼相對(duì)流暢,易于管理
- 用ioc容器浮入,是一個(gè)超級(jí)工廠
5.三種賦值方式:
-
根據(jù)屬性的setXxx方法賦值:image.png
注意:在ioc中定義bean的前提龙优,該bean的類必須提供了無(wú)參構(gòu)造
-
根據(jù)構(gòu)造方法賦值(順序分別對(duì)應(yīng)構(gòu)造方法中的屬性順序):image.pngimage.png
-
p命名空間賦值image.png
image.png -
當(dāng)屬性是對(duì)象類型時(shí)事秀,需要在屬性名后加-ref
image.png
注意:value與<value>注入的區(qū)別image.png
6.對(duì)集合類型的屬性賦值
注入各種集合數(shù)據(jù)類型: List Set map properties
7.給對(duì)象類型賦null值與“”的區(qū)別
給對(duì)象類型賦值null :
<property name="name" >
<null/> #注意 沒(méi)有<value>
</property>
賦空值 ""
<property name="name" >
<value></value>
</property>
8.自動(dòng)裝配
(只適用于 ref類型 ):
約定優(yōu)于配置
自動(dòng)裝配:
<bean ... class="org.lanqiao.entity.Course" autowire="byName|byType|constructor|no" >
byName本質(zhì)是byId
byName: 自動(dòng)尋找:其他bean的id值=該Course類的屬性名
byType: 其他bean的類型(class) 是否與 該Course類的ref屬性類型一致 (注意宰衙,此種方式 必須滿足:當(dāng)前Ioc容器中 只能有一個(gè)Bean滿足條件 )
constructor: 其他bean的類型(class) 是否與 該Course類的構(gòu)造方法參數(shù) 的類型一致;此種方式的本質(zhì)就是byType
可以在頭文件中 一次性將該ioc容器的所有bean 統(tǒng)一設(shè)置成自動(dòng)裝配:
<beans xmlns="http://www.springframework.org/schema/beans"
...
default-autowire="byName">
自動(dòng)裝配雖然可以減少代碼量睹欲,但是會(huì)降低程序的可讀性供炼,使用時(shí)需要謹(jǐn)慎。
9.使用注解定義bean
通過(guò)注解的形式 將bean以及相應(yīng)的屬性值 放入ioc容器
<context:component-scan base-package="org.lanqiao.dao">
</context:component-scan>
Spring在啟動(dòng)的時(shí)候窘疮,會(huì)根據(jù)base-package在 該包中掃描所有類袋哼,查找這些類是否有注解@Component("studentDao"),如果有,則將該類 加入spring Ioc容器闸衫。
@Component細(xì)化:
dao層注解:@Repository
service層注解:@Service
控制器層注解:@Controller
10.使用注解實(shí)現(xiàn)聲明性事務(wù)
待學(xué)習(xí)
11.AOP:面向方面編程
一個(gè)普通的類 -> 有特定功能的類
a.繼承類 b.實(shí)現(xiàn)接口 c.注解 d.配置
public class MyFilter exntends/implements Xx
{
}
類 -> “通知” :實(shí)現(xiàn)接口
前置通知實(shí)現(xiàn)步驟:
a.jar
aopaliance.jar
aspectjweaver.jar
c.編寫
aop:每當(dāng)之前add()之前 自動(dòng)執(zhí)行一個(gè)方法log();
addStudent(); 業(yè)務(wù)方法(IStudentService.java中的 addStudent())
before(); 自動(dòng)執(zhí)行的通知涛贯,即aop前置通知
public class Xxx
{
@Test
a(){}
}
如果出現(xiàn)異常:類似java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
則說(shuō)明缺少jar
后置通知:
a.通知類 ,普通實(shí)現(xiàn)接口
b.業(yè)務(wù)類楚堤、業(yè)務(wù)方法
StudentServiceImpl中的addStudent()
c.配置:
將業(yè)務(wù)類疫蔓、通知 納入springIOC容器
定義切入點(diǎn)(一端)、定義通知類(另一端)身冬,通過(guò)pointcut-ref將兩端連接起來(lái)
異常通知:
根據(jù)異常通知接口的定義可以發(fā)現(xiàn)衅胀,異常通知的實(shí)現(xiàn)類 必須編寫以下方法:
public void afterThrowing([Method, args, target], ThrowableSubclass):
a.public void afterThrowing(Method, args, target, ThrowableSubclass)
b.public void afterThrowing( ThrowableSubclass)
環(huán)繞通知: 在目標(biāo)方法的前后、異常發(fā)生時(shí)酥筝、最終等各個(gè)地方都可以 進(jìn)行的通知滚躯,最強(qiáng)大的一個(gè)通知;
可以獲取目標(biāo)方法的 全部控制權(quán)(目標(biāo)方法是否執(zhí)行嘿歌、執(zhí)行之前掸掏、執(zhí)行之后、參數(shù)宙帝、返回值等)
在使用環(huán)繞通知時(shí)丧凤,目標(biāo)方法的一切信息 都可以通過(guò)invocation參數(shù)獲取到
環(huán)繞通知 底層是通過(guò)攔截器實(shí)現(xiàn)的。
12.基于注解形式的AOP
a.jar
與實(shí)現(xiàn)接口的方式相同
b.配置
將業(yè)務(wù)類步脓、通知納入springIOC容器
開啟注解對(duì)AOP的支持<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
業(yè)務(wù)類addStudent - 通知
c.編寫
通知:
@Aspect //聲明該類是一個(gè)通知
圖片.png
注意:通過(guò)注解形式 將對(duì)象增加到 ioc容器時(shí)愿待,需要設(shè)置 掃描器
<context:component-scan base-package="org.lanqiao.aop"></context:component-scan>
掃描器 會(huì)將 指定的包 中的 @Componet @Service @Respository @Controller修飾的類產(chǎn)生的對(duì)象 增加到IOC容器中
@Aspect不需要 加入掃描器浩螺,只需要開啟即可:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
通過(guò)注解形式 實(shí)現(xiàn)的aop,如果想獲取 目標(biāo)對(duì)象的一些參數(shù)仍侥,則需要使用一個(gè)對(duì)象:JointPoint
注解形式的返回值:
a.聲明返回值 的參數(shù)名:
@AfterReturning( pointcut= "execution(public * addStudent(..))" ,returning="returningValue" )
public void myAfter(JoinPoint jp,Object returningValue) {//returningValue是返回值要出,但需要告訴spring
System.out.println("返回值:"+returningValue );
注解形式實(shí)現(xiàn)aop時(shí),通知的方法的參數(shù)不能多农渊、少
實(shí)現(xiàn)接口形式患蹂、注解形式 只捕獲聲明的特定類型的異常,而其他類型異常不捕獲砸紊。
13.基于Schema配置實(shí)現(xiàn)AOP
類似 與 實(shí)現(xiàn)接口的方式
- 接口方式通知:public class LogAfter implements AfterReturningAdvice
- Schema方式通知:
a.編寫一個(gè)普通類 public class LogAfter {}
b.將該類 通過(guò)配置传于,轉(zhuǎn)為一個(gè)“通知”
如果要獲取目標(biāo)對(duì)象信息:
注解、schema:JoinPoint
接口:Method method, Object[] args, Object target
schema形式 和注解形式相似批糟,不同之處: 注解形式 使用了注冊(cè)@After格了, schmema形式進(jìn)行了多余的配置
14.spring開發(fā)Web項(xiàng)目
Web項(xiàng)目如何初始化SpringIOC容器 :思路:當(dāng)服務(wù)啟動(dòng)時(shí)(tomcat),通過(guò)監(jiān)聽(tīng)器將SpringIOC容器初始化一次(該監(jiān)聽(tīng)器 spring-web.jar已經(jīng)提供)
因此用spring開發(fā)web項(xiàng)目 至少需要7個(gè)jar: spring-java的6個(gè)jar + spring-web.jar徽鼎,
注意:web項(xiàng)目的jar包 是存入到WEB-INF/lib中
web項(xiàng)目啟動(dòng)時(shí) 盛末,會(huì)自動(dòng)加載web.xml,因此需要在web.xml中加載 監(jiān)聽(tīng)器(ioc容器初始化)否淤。
Web項(xiàng)目啟動(dòng)時(shí)悄但,啟動(dòng)實(shí)例化Ioc容器:
<!-- 指定 Ioc容器(applicationContext.xml)的位置-->
<context-param>
<!-- 監(jiān)聽(tīng)器的父類ContextLoader中有一個(gè)屬性contextConfigLocation,該屬性值 保存著 容器配置文件applicationContext.xml的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<!-- 配置spring-web.jar提供的監(jiān)聽(tīng)器石抡,此監(jiān)聽(tīng)器 可以在服務(wù)器啟動(dòng)時(shí) 初始化Ioc容器檐嚣。
初始化Ioc容器(applicationContext.xml) ,
1.告訴監(jiān)聽(tīng)器 此容器的位置:context-param
2.默認(rèn)約定的位置 :WEB-INF/applicationContext.xml
-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
15.拆分spring配置文件
- java項(xiàng)目:
applicationContext1.xml
applicationContext2.xml
applicationContext3.xml
ApplicationContext conext = new ClassPathXmlApplicationContext("applicationContext3.xml") ;
- Web項(xiàng)目:
根據(jù)什么拆分啰扛?
i.三層結(jié)構(gòu)
UI(html/css/jsp 嚎京、Servlet) applicationController.xml
Service :applicationService.xml
Dao:applicationDao.xml
公共 數(shù)據(jù)庫(kù):applicationDB.xml
ii.功能結(jié)構(gòu)
學(xué)生相關(guān)配置 applicationContextStudent.xml <bean id="" class="X...Student">
班級(jí)相關(guān)配置 applicationContextClass.xml
合并:如何將多個(gè)配置文件 加載
(1)
<context-param>
<!-- 監(jiān)聽(tīng)器的父類ContextLoader中有一個(gè)屬性contextConfigLocation,該屬性值 保存著 容器配置文件applicationContext.xml的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml,
classpath:applicationContext-Dao.xml,
classpath:applicationContext-Service.xml,
classpath:applicationContext-Controller.xml
</param-value>
</context-param>
(2)推薦
<context-param>
<!-- 監(jiān)聽(tīng)器的父類ContextLoader中有一個(gè)屬性contextConfigLocation隐解,該屬性值 保存著 容器配置文件applicationContext.xml的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml,
classpath:applicationContext-*.xml
</param-value>
</context-param>
(3)只在web.xml中加載主配置文件鞍帝,
<param-value>
classpath:applicationContext.xml
</param-value>
然后在主配置問(wèn)加中,加載其他配置文件
<import resource="applicationContext-*.xml"/>
16.Spring整合mybatis
思路:
SqlSessionFactory -> SqlSession ->StudentMapper ->CRUD
可以發(fā)現(xiàn) 煞茫,MyBatis最終是通過(guò)SqlSessionFactory來(lái)操作數(shù)據(jù)庫(kù)帕涌,
Spring整合MyBatis 其實(shí)就是 將MyBatis的SqlSessionFactory 交給Spring
SM整合步驟:
1.jar
mybatis-spring.jar spring-tx.jar spring-jdbc.jar spring-expression.jar
spring-context-support.jar spring-core.jar spring-context.jar
spring-beans.jar spring-aop.jar spring-web.jar commons-logging.jar
commons-dbcp.jar ojdbc.jar mybatis.jar log4j.jar commons-pool.jar
2.類-表
3.MyBatis配置文件conf.xml
4.通過(guò)mapper.xml將 類、表建立映射關(guān)系
之前使用MyBatis: conf.xml ->SqlSessionFacotry
現(xiàn)在整合的時(shí)候续徽,需要通過(guò)Spring管理SqlSessionFacotry 蚓曼,因此 產(chǎn)生qlSessionFacotry 所需要的數(shù)據(jù)庫(kù)信息 不在放入conf.xml 而需要放入spring配置文件中
配置Spring配置文件(applicationContext.xml)
6.使用Spring-MyBatis整合產(chǎn)物開發(fā)程序
目標(biāo):通過(guò)spring產(chǎn)生mybatis最終操作需要的 動(dòng)態(tài)mapper對(duì)象(StudentMapper對(duì)象)
Spring產(chǎn)生 動(dòng)態(tài)mapper對(duì)象 有3種方法:
a.第一種方式
DAO層實(shí)現(xiàn)類 繼承 SqlSessionDaoSupport類
SqlSessionDaoSupport類提供了一個(gè)屬性 SqlSession
b.第二種方式
就是省略掉 第一種方式的 實(shí)現(xiàn)類
直接MyBatis提供的 Mapper實(shí)現(xiàn)類:org.mybatis.spring.mapper.MapperFactoryBean
缺點(diǎn):每個(gè)mapper都需要一個(gè)配置一次
c.第三種方式
批量配置 實(shí)現(xiàn)類
注意:
Autowired+Service+Repository是通過(guò)byType自動(dòng)裝配的
Autowired、Qualifier(name)+Service(name)+Reposutory(name)是通過(guò)byName自動(dòng)裝配的