1.spring的工作原理
spring 是按照設計模式精心打造的,它實作了工廠模式的工廠類,這個類名為BeanFactory(接口),在程式中通常使用它的子類ApplicationContext(也是接口)。
spring的核心是IOC(反轉控制)容器,IOC也是一種程式設計思想,用于實作子產品之間的解耦,在Spring中它的作用是對對象的建立,維護和銷毀等生命周期的控制。IOC:把對象的建立、初始化、銷毀交給spring來管理,而不是由開發者控制,實作控制反轉。
spring是一個大的工廠類,spring的特點就是基于配置,在其配置檔案中通過元素來建立執行個體對象。
根據業務邏輯來看,對象經常不是獨立的,一個對象的建立往往涉及另一個對象的建立,當然這個對象也要由IOC容器負責,負責的方式就是依賴注入DI,通過反射機制實作。有三種注入方式:
(1)接口注入
(2)構造器注入
(3)Setter方法注入。
2.spring的核心技術
spring的核心技術有:IOC,AOP
java 的 進階特性:反射機制,代理
AOP:面向切面程式設計,系統中有很多各不相幹的類的方法,在這衆多方法中加入某種系統功能的代碼,如加入日志,權限判斷等,AOP可以實作橫切關注點(如日志,安全,緩存和事務管理)與他們所影響的對象之間的解耦。
實作AOP 功能采用的是代理技術,調用代理類,代理類與目标類具有相同的方法聲明。
AOP 在spring中主要表現在兩個方面:提供聲明式的事務管理 、spring支援使用者自定義切面。
AOP主要包括通知(Advice)切點(PointCut)連接配接點(JoinPoint)
下面貼一段在springboot 中使用AOP的代碼
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Aspect
@Component
public class ControllerInterceptor {
private final Logger logger = LogManager.getLogger(this.getClass());
@Pointcut("execution(public * com.example.homework.controller..*(..))")
public void controllerMethodPointcut(){}
@Before("controllerMethodPointcut()") //指定攔截器規則
public Object interceptor(JoinPoint jp){
MethodSignature signature = (MethodSignature) jp.getSignature();
Method method = signature.getMethod(); //擷取被攔截的方法
String methodName = method.getName(); //擷取被攔截的方法名
logger.info("interceptor ***************************");
logger.info("methodName: "+methodName);
return null;
}
}
2018-08-21 11:07:22.906 INFO 10392 --- [nio-8088-exec-1] a.s.s.m.AbstractValidatingSessionManager : Enabling session validation scheduler...
2018-08-21 11:07:22.987 INFO 10392 --- [nio-8088-exec-1] c.e.h.controller.ControllerInterceptor : interceptor ***************************
2018-08-21 11:07:22.987 INFO 10392 --- [nio-8088-exec-1] c.e.h.controller.ControllerInterceptor : methodName: loginIn
3.spring 的優缺點
Spring 的核心概念是IOC和AOP,這兩個核心服務的對象算是bean(POJO),定位是一個輕量級的架構,但是随着他的發展變得很龐大,我們稱它為spring 全家桶。
它具備以下優點:
spring中避免了關鍵字new造成的耦合問題。
spring本身就是一個工廠,不需要再編寫工廠類了。
spring不需要進行明确的引用關系的傳遞,直接通過配置完成
所有架構幾乎都可以在spring中整合在一起使用。
spring程式設計=factory設計模式+proxy設計模式
當然,它的缺點也是不少的:
spring基于大量的xml 配置檔案,使得我們花了大量的時間放在配置上,拖慢了開發的進度,springboot 問世後,提倡代碼優于配置解決了這個問題。
spring 的内容太龐大,随便打斷點檢視的時候會出現十幾二十層代碼,閱覽性不強,在實際開發的過程中spring的角色更像是膠水一樣,充當整合各種技術的角色,同時作為bean的容器。