Spring能做什麼 1. 能根據配置文件創建及組裝對象之間的依賴關係; 2. 面向切麵編程,能幫助我們無耦合的實現日誌記錄,性能統計,安全控制等; 3. 提供第三方數據訪問框架(如Hibernate),而且自己也提供了一套JDBC訪問模板方便訪問資料庫; 4. 非常簡單的管理資料庫事務; 5. 集 ...
Spring能做什麼
1. 能根據配置文件創建及組裝對象之間的依賴關係;
2. 面向切麵編程,能幫助我們無耦合的實現日誌記錄,性能統計,安全控制等;
3. 提供第三方數據訪問框架(如Hibernate),而且自己也提供了一套JDBC訪問模板方便訪問資料庫;
4. 非常簡單的管理資料庫事務;
5. 集成第三方Web框架(如Struts1/2),而且本身有Spring MVC方便搭建web層
6. 與Java EE整合,與更多技術整合(比如緩存)
Spring的特色
1. 方便解耦,簡化開發
Spring IoC完成對象創建,依賴關係維護等
2. AOP的支持
Spring提供面向切麵編程,實現攔截,監控等
3. 聲明式事務管理
只需通過配置完成對事務的管理,而無需手動操作
4. 方便測試
支持Junit4,可以通過註解方便測試
5. 方便集成其他框架
一直在提供並完善各種框架(如Struts,MyBatis,Hibernate等)
6. 降低開發難度,一站式開發項目
提供各種優秀前端框架,以及後臺框架,一站式開髮網站
Spring的定義
先看看百度百科的解釋
Spring框架是一個輕量級的DI/IoC和AOP容器的開源框架;
Spring為瞭解決企業應用開發的複雜性而創建的;
Spring的用途不僅限於伺服器端的開發,只是為了簡化Java開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和麵向切麵(AOP)。
簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。
Spring使用基本的JavaBean來完成開發。
Spring框架結構
- Data Access/Integration層包含有JDBC、ORM、OXM、JMS和Transaction模塊。
- Web層包含了Web、Web-Servlet、WebSocket、Web-Porlet模塊。
- AOP模塊提供了一個符合AOP聯盟標準的面向切麵編程的實現。
- Core Container(核心容器):包含有Beans、Core、Context和SpEL模塊。
- Test模塊支持使用JUnit和TestNG對Spring組件進行測試。
Bean規範
每一個類實現了Bean的規範才能有Spring來接管
必須有個公有類
有無參數構造函數
用公共方法暴露內部成員屬性(getter,setter )
Bean的生命周期
Bean的作用域
Spring定義了多種Bean作用域,可基於這些作用域創建bean,包括:
單例(Singleton):在整個應用中,只創建一個bean實例
原型(Prototype):每次註入或者通過Spring應用上下文獲取的時候,都會創建一個新的bean實例
會話(Session):在web應用中,為每個會話創建一個bean實例
請求(Request):在web應用中,為每個請求創建一個bean實例。預設情況下,Spring應用上下文中所有bean都是作為單例的形式創建。也就是說,不管既定的一個bean被註入到其他bean多少次,每次所註入的都是同一個實例。
IoC瞭解一下
一種設計思想。就是將原本在程式中手動創建對象的控制權,交由Spring框架來管理。不用new對象,而直接從Spring那裡獲取對象。
開始Spring的Coding漫漫路
1. 新建Java項目,命名 spring
2.新建lib目錄,並添加jar包,
3.開始編寫程式
3.1 在src下新建bean包,然後新建User類
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package bean; public class User { private Integer id; private String name; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }View Code
3.2 在src下新建 applicationContext.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="beanUser" class="bean.User"> <property name="id" value="1001"></property> <property name="name" value="Jesse"></property> <property name="gender" value="male"></property> </bean> </beans>View Code
4.測試程式
4.1 在src下新建test類
import bean.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class test { @Test public void demo1() { ApplicationContext context = new ClassPathXmlApplicationContext( new String[]{"applicationContext.xml"}); User user = (User) context.getBean("beanUser"); System.out.println(user.getId()); System.out.println(user.getName()); System.out.println(user.getGender()); } }
運行結果:
DI:Dependency Injection (依賴註入)
Spring 在創建對象的過程中,將對象依賴屬性(簡單值,集合,對象)通過配置設值給該對象。或者說拿到對象的屬性,已經被註入到了相關值了,可以直接使用。
1. 在bean下新建 SaySomething類
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package bean; public class SaySomething { private User user = null; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String sayHi() { return user.getId() + " " + user.getName() + " " + user.getGender(); } }View Code
2.修改applicationContext.xml,如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="beanUser" class="bean.User"> <property name="id" value="1001"></property> <property name="name" value="Jesse"></property> <property name="gender" value="male"></property> </bean> <bean name="saySomething" class="bean.SaySomething"> <property name="user" ref="beanUser"></property> </bean> </beans>View Code
3.在test.java里,添加新的方法,測試上面代碼
@Test public void demo2() { ApplicationContext context = new ClassPathXmlApplicationContext( new String[]{"applicationContext.xml"}); SaySomething saySomething = (SaySomething) context.getBean("saySomething"); System.out.println(saySomething.sayHi()); }
運行結果:
AOP Aspect Oriented Program 面向切麵編程
Aspect Oriented Program面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP採取橫向抽取機制,取代了傳統縱向繼承體系重覆性代碼
核心業務,比如登陸,CUD
周邊功能,統計,日誌,事務管理。在spring的面向切麵編程AOP思想里,即被定義為切麵
在面向切麵的思想里,核心業務功能和切麵功能單獨開發,然後把兩個組合在一起,就是AOP
目的:AOP 能夠將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任(事務,日誌,許可權等)封裝起來,便於減少系統的重覆代碼,降低模塊間的耦合度,並有利於未來的可拓展性和可維護性。
AOP實現原理
AOP底層將採用代理機制進行實現
介面+實現類:spring採用jdk的動態代理Proxy
實現類:spring採用cglib位元組碼增強