Spring框架入門--loc的兩種實現方式
Spring框架01
一、spring簡介
1、spring的作用
Spring致力於提供一種方法管理你的業務對象。
Spring的主要目的是使JavaEE易用和促進好編程習慣。
Spring致力於J2EE應用的各層的解決方案,而不是僅僅專注於某一層的方案。可以說Spring是企業應用開發的“一站式”選擇,並貫穿表現層、業務層及持久層。然而,Spring並不想取代那些已有的框架,而是與它們無縫地整合。
2、spring體系結構
Spring 框架是一個分層架構,它包含一系列的功能要素並被分為大約20個模塊。這些模塊分為Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和測試部分,如下圖所示:
1、核心容器(Core Container)
Core和Beans模塊提供了Spring最基礎的功能,提供IoC(控制反轉)和DI(依賴注入)特性。這里的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關系和配置。
Context模塊基於Core和Beans來構建,它提供了用一種框架風格的方式來訪問對象,有些像JNDI注冊表。Context封裝包繼承了beans包的功能,還增加了國際化(I18N),事件傳播,資源裝載,以及透明創建上下文,例如通過servlet容器,以及對大量JavaEE特性的支持,如EJB、JMX。核心接口是ApplicationContext。
Expression Language,表達式語言模塊,提供了在運行期間查詢和操作對象圖的強大能力。支持訪問和修改屬性值,方法調用,支持訪問及修改數組、容器和索引器,命名變量,支持算數和邏輯運算,支持從Spring 容器獲取Bean,它也支持列表投影、選擇和一般的列表聚合等。
2、數據訪問/集成部分(Data Access/Integration)
JDBC模塊,提供對JDBC的抽象,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。
ORM模塊,提供了常用的"對象/關系"映射API的集成層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進行"對象/關系"映射,如簡單聲明性事務管理 。
OXM模塊,提供一個支持Object和XML進行映射的抽象層,其中包括JAXB、Castor、XMLBeans、JiBX和XStream。
JMS模塊,提供一套"消息生產者、消費者"模板用於更加簡單的使用JMS,JMS用於在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。
Transaction模塊,支持程序通過簡單聲明性事務管理,只要是Spring管理對象都能得到Spring管理事務的好處,即使是POJO,也可以為他們提供事務。
3、Web
Web-Socket模塊, WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信,spring支持webSocket通信。
Web模塊,提供了基礎的web功能。例如多文件上傳、集成IoC容器、遠程過程訪問、以及Web Service支持,並提供一個RestTemplate類來提供方便的Restful services訪問
Web-Servlet模塊,提供了Web應用的Model-View-Controller(MVC)實現。Spring MVC框架提供了基於注解的請求資源注入、更簡單的數據綁定、數據驗證等及一套非常易用的JSP標簽,完全無縫與Spring其他技術協作。
Web-Portlet模塊,提供了在Portlet環境下的MVC實現
spring本身提供springmvc
4、AOP
AOP模塊,提供了符合AOP 聯盟規范的面向方面的編程實現,讓你可以定義如方法攔截器和切入點,從邏輯上講,可以減弱代碼的功能耦合,清晰的被分離開。而且,利用源碼級的元數據功能,還可以將各種行為信息合並到你的代碼中 。
Aspects模塊,提供了對AspectJ的集成。
Instrumentation模塊, 提供一些類級的工具支持和ClassLoader級的實現,可以在一些特定的應用服務器中使用。
5、Test
Test模塊,提供對使用JUnit和TestNG來測試Spring組件的支持,它提供一致的ApplicationContexts並緩存這些上下文,它還能提供一些mock對象,使得你可以獨立的測試代碼。
3、spring的優點
- 方便解耦,簡化開發
Spring就是一個大工廠,可以將所有對象創建和依賴關系維護,交給Spring管理 - AOP編程的支持
Spring提供面向切面編程,可以方便的實現對程序進行權限攔截、運行監控等功能 - 聲明式事務的支持
只需要通過配置就可以完成對事務的管理,而無需手動編程 - 方便程序的測試
Spring對Junit4支持,可以通過注解方便的測試Spring程序 - 方便集成各種優秀框架
Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持 - 降低JavaEE API的使用難度
Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等)都提供了封裝,使這些API應用難度大大降低
二、IOC控制反轉和DI依賴注入
- IOC 的思想是:用框架的方式替代耦合度高的 new 構造方法();的形式創建對象,這樣可以在需要的時候去創建,不需要的時候 統一管理、 銷毀,節約資源, 提高效率
- DI 的思想是:Spring框架替我們完成屬性賦值的操作
三、spring的IOC配置版
1、pom.xml添加spring相關依賴
<dependencies>
<!--測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!--支持注解-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
</dependencies>
12345678910111213141516171819202122232425262728293031323334
2、spring的配置文件:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--IOC:控制反轉,即利用反射的原理,創建service的實例對象-->
<bean id="service" class="com.java.service.impl.EmpServiceImpl">
<!--DI:依賴注入,即調用set方法,為屬性dao賦值-->
<property name="dao" ref="dao"/>
</bean>
<!--IOC:控制反轉,即利用反射的原理,創建dao的實例對象-->
<bean id="dao" class="com.java.dao.impl.EmpDaoImpl"></bean>
<!--IOC:控制反轉,即利用反射的原理,創建Emp的實例對象-->
<bean id="Emp" class="com.java.model.Emp">
<!--DI:依賴注入,即調用set方法,為屬性name賦值-->
<property name="name" value="黃容"></property>
</bean>
</beans>
12345678910111213141516171819202122
3、service層實現類
package com.java.service.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
/**
* @author Liushun
* @date Created in 2018/6/1 20:42
* @description service層實現類
*/
public class EmpServiceImpl implements IEmpService {
private IEmpDao dao;
public IEmpDao getDao() {
return dao;
}
// 配置版需要提供set方法
public void setDao(IEmpDao dao) {
this.dao = dao;
}
// 調用dao的方法
@Override
public void saveEmp(Emp emp) {
dao.insertEmp(emp);
}
}
123456789101112131415161718192021222324252627282930
4、dao層實現類
package com.java.dao.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
/**
* @author Liushun
* @date Created in 2018/6/1 20:50
* @description dao層實現類
*/
public class EmpDaoImpl implements IEmpDao {
@Override
public void insertEmp(Emp emp) {
System.out.println("模擬新增:" + emp);
}
}
1234567891011121314151617
5、web測試類
package com.java.test;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Liushun
* @date Created in 2018/6/1 20:53
* @description web測試類
*/
public class LocTest {
// 使用通用工廠類來實例化application.xml中配置的bean標簽的對象
@Test
public void addEmpTest(){
// 加載spring配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 加載application.xml配置文件中相應的bean標簽
Emp emp = (Emp) context.getBean("Emp");
IEmpService service = (IEmpService) context.getBean("service");
IEmpDao dao = (IEmpDao) context.getBean("dao");
service.saveEmp(emp);
}
}
1234567891011121314151617181920212223242526272829
四、spring的IOC注解版
1、簡介:
注解的原理和配置xml中的bean標簽,property標簽是相同的,注解的本質就是封裝好的方法的調用
類的注解相當於在xml中配置bean標簽,利用反射的原理實例化對象
屬性的注解相當於xml中配置property標簽,借助反射實現為屬性賦值
使用屬性注解不需要提供set方法
2、類的注解:
通用型:@Component
Dao層:@Repository
Service層:@Service
Web層:@Controller
3、屬性注解
@Autowired:根據類型進行注入
4、示例
1、在applicationContext.xml中開啟spring的注解
<!--開啟spring注解:所有類的注解默認是關閉的-->
<context:component-scan base-package="com.java"/>
12
2、dao層
package com.java.dao.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import org.springframework.stereotype.Repository;
/**
* @author Liushun
* @date Created in 2018/6/1 20:50
* @description dao層實現類
*/
@Repository
public class EmpDaoImpl implements IEmpDao {
@Override
public void insertEmp(Emp emp) {
System.out.println("模擬新增:" + emp);
}
}
12345678910111213141516171819
3、service層
package com.java.service.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author Liushun
* @date Created in 2018/6/1 20:42
* @description service層實現類
*/
@Service
public class EmpServiceImpl implements IEmpService {
@Autowired
private IEmpDao dao;
// 調用dao的方法
@Override
public void saveEmp(Emp emp) {
dao.insertEmp(emp);
}
}
12345678910111213141516171819202122232425
4、測試類
package com.java.test;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Liushun
* @date Created in 2018/6/1 20:53
* @description 測試類
*/
// 開啟spring自帶的測試功能
@RunWith(SpringJUnit4ClassRunner.class)
// 讀取spring配置文件
@ContextConfiguration("/applicationContext.xml")
public class LocTest {
@Autowired
private IEmpService service;
@Autowired(required = false)
private Emp emp;
@Test
public void springTest(){
service.saveEmp(emp);
}
}