Spring框架入門--loc的兩種實現方式


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);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM