Spring中主要用到的設計模式有工廠模式和代理模式。
IOC:Inversion of Control控制反轉,也叫依賴注入,通過 sessionfactory 去注入實例;IOC就是一個生產和管理bean的容器就行了,原來需要在調用類中new的東西,現在都是通過容器生成,同時,要是產生的是單例的bean,他還可以給管理bean的生命周期;通過注解配置或者進行xml配置實現,如@Controller,@Service,@Repository等注解配置
AOP:面向切面編程,可以將一些系統性相關的編程工作,獨立提取出來,獨立實現,然后通過切面切入進系統,從而避免了在業務邏輯的代碼中混入很多的系統相關的邏輯,比如安全,日志,事務功能;也可以通過注解配置或者進行xml配置實現,如@Aspect ,@Before,@After等或<aop config/>注解配置;主要是JDK動態代理和cglib動態代理
Spring的AOP和IOC都是為了解決系統代碼耦合度過高的問題,使代碼重用度高,易於維護。
一、Ioc :通過Spring配置來創建對象,而不是new的方式
兩種方法:配置文件,注解
1.Ioc底層原理
(1)xml配置文件
(2)dom4j解析
(3)工廠設計模式
(4)反射
步驟:
第一步:創建類的.xml文件
<bean id="userService" class="....."/>
第二步:創建一個工廠類:使用dom4j解析配置文件+反射
public class UserFactory{ public static UserService getUserService(){ //使用dom4j解析配置文件 //根據id值userService,得到id值對應class的屬性值 String classValue="userService"; //使用反射來創建class對象 Class class=Class.forName(classValue); UserService service=class.newInstatnce(); return service; } }
通過IOC,我們如果改掉UserService類,只需更改bean里面的配置屬性就行了,降低了類之間的耦合度
2.Ioc和DI的區別:
(1)Ioc:控制反轉,把創建對象交給Spring進行配置
(2)DI:依賴注入,向類里面的屬性中設置值
(3)二者關系:DI不能單獨存在,要在Ioc基礎之上來完成操作,即要先創建對象才能注入屬性值。
3.Spring整合web項目原理
(1)加載Spring核心配置文件
ApplicationContext context=new ClassPathXmlApplicationContext(“bean1.xml”);
加載文件要new一個對象,每次訪問都要new對象加載配置,效率低
(2)實現思想:吧加載配置文件和創建對象過程,在服務器啟動時候完成
(3)實現原理:
a) ServletContext對象
b) 監聽器(ServletContextListener接口)
c) 具體使用:
i. 服務器啟動時,為每個項目創建一個ServletContext對象
ii. 使用監聽器可以監聽到ServletContext在何時創建
iii. 在監聽器的,ServletContextListener接口的contextInitialized()方法方法中加載Spring配置文件(括號1中代碼),創建對象。
iv. 把創建出來的對象放到ServletContext域對象里面(setAttribute方法)
v. 獲取對象時,從ServletContext域對象中得到(getAttribute方法)
二、Aop:面向切面,擴展功能時不通過源代碼,橫向抽取機制。
底層使用動態代理方式---增強方法
具體分兩種情況:
(1)有接口的情況:創建接口的實現類的代理對象,jdk動態代理(由java的反射機制實現,對實現了接口的類產生代理,需要實現 InvocationHandler 接口,並實現 invoke() 方法)
(2)沒有接口的情況:創建User類的子類的代理對象,cglib動態代理(借助 asm 來實現的,對沒有實現接口的類產生代理,生產子類對象,需要實現 MethodInterceptor 接口,實現 intercepter 方法)。子類可以通過super調用父類方法
增強:before,after,(前置,后置,異常,最終,環繞增強)