1. 什么是 Spring 框架?
Spring中文翻譯過來是春天的意思,被稱為J2EE的春天,是一個開源的輕量級的Java開發框架, 具有控制反轉(IoC)和面向切面(AOP)兩大核心。Java Spring框架通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。
Spring框架不僅限于服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何 Java 應用都可以從Spring中受益。Spring框架還是一個超級粘合平臺,除了自己提供功能外,還提供粘合其他技術和框架的能力。
1)IOC 控制反轉
對象創建責任的反轉,在Spring中BeanFactory是IOC容器的核心接口,負責實例化,定位,配置應用程序中的對象及建立這些對象間的依賴。XmlBeanFactory實現BeanFactory接口,通過獲取xml配置文件數據,組成應用對象及對象間的依賴關系。
Spring中有3中注入方式,一種是set注入,另一種是注解注入,另一種是構造方法注入。
2)AOP面向切面編程
AOP是指縱向的編程,比如兩個業務,業務1和業務2都需要一個共同的操作,與其往每個業務中都添加同樣的代碼,通過寫一遍代碼,讓兩個業務共同使用這段代碼。
Spring中面向切面編程的實現有兩種方式,一種是動態代理,一種是CGLIB,動態代理必須要提供接口,而CGLIB實現是由=有繼承。
2. Spring框架的設計目標,設計理念,和核心是什么
Spring設計目標:Spring為開發者提供一個一站式輕量級應用開發平臺;
Spring設計理念:在JavaEE開發中,支持POJO和JavaBean開發方式,使應用面向接口開發,充分支持OO(面向對象)設計方法;Spring通過IoC容器實現對象耦合關系的管理,并實現依賴反轉,將對象之間的依賴關系交給IoC容器,實現解耦;
Spring框架的核心:IoC容器和AOP模塊。通過IoC容器管理POJO對象以及他們之間的耦合關系;通過AOP以動態非侵入的方式增強服務。
IoC讓相互協作的組件保持松散的耦合,而AOP編程允許你把遍布于應用各層的功能分離出來形成可重用的功能組件。
3. Spring 框架中使用了哪些設計模式?
Spring框架中使用大量的設計模式,下面列舉比較有代表性的:
代理模式
AOP能夠將那些與業務無關(事務處理、日志管理、權限控制等)封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度有利于可拓展性和可維護性。
單例模式
Spring中bean的默認作用域是單例模式,在Spring配置文件中定義bean默認為單例模式。
模板方法模式
模板方法模式是一種行為設計模式,用來解決代碼重復的問題,如RestTemplate、JmsTemplate、JpaTemplate。
包裝器設計模式
Spring根據不同的業務訪問不同的數據庫,能夠動態切換不同的數據源。
觀察者模式
定義對象鍵一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都會得到通知被制動更新,如Spring中listener的實現–ApplicationListener。
Spring事件驅動模型就是觀察者模式很經典的一個應用。
工廠模式
Spring使用工廠模式通過BeanFactory、ApplicationContext創建bean對象。
4. Spring 依賴注入有幾種實現方式?
1)Constructor構造器注入:通過將@Autowired注解放在構造器上來完成構造器注入,默認構造器參數通過類型自動裝配。
public class Test { private UserInterface user; @Autowired private Test(UserInterface user) { this.user = user; }
}
2)Field接口注入:通過將@Autowired注解放在構造器上來完成接口注入。
@Autowired //接口注入
private IUserService userService;
3)Setter方法參數注入:通過將@Autowired注解放在方法上來完成方法參數注入。
public class Test {private User user;@Autowiredpublic void setUser(User user) { this.user = user; } public String getuser() { return user; }
}
5. Spring 中常用的注解包含哪些?
1)聲明bean的注解
@Component 組件,沒有明確的角色
@Service 在業務邏輯層使用(service層)
@Repository 在數據訪問層使用(dao層)
@Controller 在展現層使用,控制器的聲明(C*上使用)
2)注入bean的注解
@Autowired:由Spring提供
@Inject:由JSR-330提供
@Resource:由JSR-250提供
都可以注解在set方法和屬性上,推薦注解在屬性上(一目了然,少寫代碼)。
3)java配置類相關注解
@Configuration 聲明當前類為配置類,相當于xml形式的Spring配置(類上使用),其中內部組合了@Component注解,表明這個類是一個bean(類上使用)
@Bean 注解在方法上,聲明當前方法的返回值為一個bean,替代xml中的方式(方法上使用)
@ComponentScan 用于對Component進行掃描,相當于xml中的(類上使用)
@WishlyConfiguration 為@Configuration與@ComponentScan的組合注解,可以替代這兩個注解
4)切面(AOP)相關注解
Spring支持AspectJ的注解式切面編程。
@Aspect 聲明一個切面(類上使用)
使用@After、@Before、@Around定義建言(advice),可直接將攔截規則(切點)作為參數。
@After 在方法執行之后執行(方法上使用)
@Before 在方法執行之前執行(方法上使用)