三分鐘輕松了解Spring框架基礎知識
struts:web層,比較簡單(ValueStack值棧,攔截器);
hibernate:dao層,知識點雜;
spring:service層,重要,講多少用多少。
腦海中的架構:
一、spring框架概述
1.1 什麽是spring
Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和面向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。
輕量級:與EJB對比,依賴資源少,銷毀的資源少。
分層: 一站式,每一個層都提供的解決方案
web層:struts,spring-MVC
service層:spring
dao層:hibernate,mybatis , jdbcTemplate –> spring-data
1.2 spring由來
Expert One-to-One J2EE Design and Development
Expert One-to-One J2EE Development without EJB
1.3 spring核心
Spring的核心是控制反轉(IoC)和面向切面(AOP)
?1.4 spring優點
方便解耦,簡化開發 (高內聚低耦合)
Spring就是一個大工廠(容器),可以將所有對象創建和依賴關系維護,交給Spring管理
spring工廠是用於生成bean
AOP編程的支持
Spring提供面向切面編程,可以方便的實現對程序進行權限攔截、運行監控等功能
聲明式事務的支持
只需要通過配置就可以完成對事務的管理,而無需手動編程
方便程序的測試
Spring對Junit4支持,可以通過註解方便的測試Spring程序
方便集成各種優秀框架
Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
降低JavaEE API的使用難度
Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低
?1.5 spring體系結構
Spring 框架是一個分層架構,它飲食一系列的功能要素並被分為大約20個模塊。這些模塊分為Rore Container、Date Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和測試部分,如下圖所示:
核心容器:beans、core、context、expression
二、入門案例:IoC【掌握】
2.1 導入jar包
4 + 1 : 4個核心(beans、core、context、expression) + 1個依賴(commons-loggins…jar)
?2.2 目標類
1. 提供UserService接口和實現類
2. 獲得UserService實現類的實例
之前開發中,直接new一個對象即可。
學習spring之後,將由Spring創建對象實例–> IoC 控制反轉(Inverse of Control)。
之後需要實例對象時,從spring工廠(容器)中獲得,需要將實現類的全限定名稱配置到xml文件中。
UserService接口:
1 public interface UserService {
2 public void addUser();
3 }
UserServiceImpl實現類:
1 public class UserServiceImpl implements UserService {
2 @Override
3 public void addUser() {
4 System.out.println("a_ico add user");
5 }
6 }
?2.3 配置文件
位置:任意,開發中一般在classpath下(src)
名稱:任意,開發中常用applicationContext.xml
內容:添加schema約束
約束文件位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\ xsd-config.html
<?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">
<!-- 配置service
<bean> 配置需要創建的對象
id :用於之後從spring容器獲得實例時使用的
class :需要創建實例的全限定類名
-->
<bean id="userServiceId" class="com.itheima.a_ioc.UserServiceImpl"></bean>
</beans>
?2.4 測試
@Test
public void demo02(){
//從spring容器獲得
//1 獲得容器
String xmlPath = "com/itheima/a_ioc/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//2獲得內容 --不需要自己new,都是從spring容器獲得
UserService userService = (UserService) applicationContext.getBean("userServiceId");
userService.addUser();
}
三、入門案例:DI【掌握】
DI Dependency Injection ,依賴註入
is a :是一個,繼承。
has a:有一個,成員變量,依賴。
class B {
private A a; //B類依賴A類
}
依賴:一個對象需要使用另一個對象
註入:通過setter方法進行另一個對象實例設置。
例如:
class BookServiceImpl{
//之前開發:接口 = 實現類 (service和dao耦合)
//private BookDao bookDao = new BookDaoImpl();
//spring之後 (解耦:service實現類使用dao接口,不知道具體的實現類)
private BookDao bookDao;
setter方法
}
模擬spring執行過程
1. 創建service實例:BookService bookService = new BookServiceImpl() –>IoC <bean>
2. 創建dao實例:BookDao bookDao = new BookDaoImple() –>IoC
3. 將dao設置給service:bookService.setBookDao(bookDao); –>DI<property>
3.1 ?目標類
· 創建BookService接口和實現類
· 創建BookDao接口和實現類
· 將dao和service配置 xml文件
· 使用api測試
3.1.1 dao
public interface BookDao {
public void addBook();
}
public class BookDaoImpl implements BookDao {
@Override
public void addBook() {
System.out.println("di add book");
}
}
3.1.2 service
public interface BookService {
public abstract void addBook();
}
public class BookServiceImpl implements BookService {
// 方式1:之前,接口=實現類
// private BookDao bookDao = new BookDaoImpl();
// 方式2:接口 + setter
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void addBook(){
this.bookDao.addBook();
}
}
3.2 配置文件
<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">
<!--
模擬spring執行過程
創建service實例:BookService bookService = new BookServiceImpl() IoC <bean>
創建dao實例:BookDao bookDao = new BookDaoImpl() IoC
將dao設置給service:bookService.setBookDao(bookDao); DI <property>
<property> 用於進行屬性註入
name: bean的屬性名,通過setter方法獲得
setBookDao ##> BookDao ##> bookDao
ref :另一個bean的id值的引用
-->
<!-- 創建service -->
<bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">
<property name="bookDao" ref="bookDaoId"></property>
</bean>
<!-- 創建dao實例 -->
<bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>
</beans>
3.3 測試
@Test
public void demo01(){
//從spring容器獲得
String xmlPath = "com/itheima/b_di/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
BookService bookService = (BookService) applicationContext.getBean("bookServiceId");
bookService.addBook();
}
三分鐘輕松了解Spring框架基礎知識