【Spring】Spring快速入門一波 概述

Spring

1. spring概述

1.1 Spring是什麼(理解)

Spring是分層的 Java SE/EE應用 full-stack 輕量級開源框架,以 IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面編程)爲內核。

提供了展現層 SpringMVC和持久層 Spring JDBCTemplate以及業務層事務管理等衆多的企業級應用技術,還能整合開源世界衆多著名的第三方框架和類庫,逐漸成爲使用最多的Java EE 企業應用開源框架。

分層 full stack全棧輕量級 開源 框架 源代碼開放 輕重 什麼標準

小巧 API使用簡單 學習成本比較低 輕量級

full stack 各層都有解決方案 Web層 Dao層

AOP 面向切面編程 IoC 控制反轉

Web Dao 業務層 聲明式事務 整合開源很多框架 集成方便

1.2 Spring發展歷程 (瞭解)

在這裏插入圖片描述
EJB

Rod Johnson ( Spring 之父)

2017 年
9 月份發佈了 Spring 的最新版本 Spring5.0 通用版(GA)

Spring5源碼不搞搞嗎?

1.3 Spring的優勢(理解)

方便解耦,簡化開發

通過 Spring 提供的 IoC容器,可以將對象間的依賴關係交由 Spring 進行控制,避免硬編碼所造成的過度耦合。

用戶也不必再爲單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注於上層的應用。

對象間的依賴關係交由Spring容器進行控制 控制反轉 ,避免過度耦合,不必再爲單例模式類、屬性文件解析等很底層的需求編寫代碼,使得我們可以更加專注於上層的應用。

AOP 編程的支持

通過 Spring的 AOP 功能,方便進行面向切面編程,許多不容易用傳統 OOP 實現的功能可以通過 AOP 輕鬆實現。

面向切面編程 許多不容易用傳統OOP實現的功能可以通過AOP輕鬆實現

面向切面編程呀。 不容易用傳統OOP面向對象編程實現的功能?

聲明式事務的支持

可以將我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務管理,提高開發效率和質量。

事務管理代碼中解脫出來 聲明式方式靈活的進行事務管理 提高開發效率和質量

方便程序的測試

可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是隨手可做的事情。

要多多測試

方便集成各種優秀框架

Spring對各種優秀框架(Struts、Hibernate、Hessian、Quartz等)的支持。

Spring 幾乎爲開發階段的每層都支持對應的優秀的解決方案

降低 JavaEE API 的使用難度

Spring對 JavaEE API(如 JDBC、JavaMail、遠程調用等)進行了薄薄的封裝層,使這些 API 的使用難度大爲降低。

工具的封裝 xxUtil

某某模板

Java 源碼是經典學習範例

Spring的源代碼設計精妙、結構清晰、匠心獨用,處處體現着大師對Java 設計模式靈活運用以及對 Java技術的高深

造詣。它的源代碼無意是 Java 技術的最佳實踐的範例。

優秀 使用很多思想 設計模式 學習這些設計模式 思想 編程能力

1.4 Spring的體系結構(瞭解)

Spring Framework Runtime

Core Container

Beans Core Context SpEL

AOP Aspects Instrumentation Messaging

Data Access/Integration

JDBC ORM OXM JMS Transaction

Web

WebSocket Servlet

Web Portlet

在這裏插入圖片描述

2. spring快速入門

2.1 Spring程序開發步驟

在這裏插入圖片描述
Spring框架 xml配置文件 權限定名 反射 對象

①導入 Spring 開發的基本包座標

②編寫 Dao 接口和實現類

③創建 Spring 核心配置文件

④在 Spring 配置文件中配置 UserDaoImpl

⑤使用 Spring 的 API 獲得 Bean 實例

Spring的開發步驟

①導入座標

②創建Bean

③創建applicationContext.xml

④在配置文件中進行配置

⑤創建ApplicationContext對象getBean

2.2 導入Spring開發的基本包座標

pom.xml

<properties>
        <spring.version>5.2.6.RELEASE</spring.version>
    </properties>
    <dependencies>
        <!--導入spring的context座標,context依賴core、beans、expression-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

2.3 編寫Dao接口和實現類

Dao接口

public interface UserDao {  
    public void save();
}

實現類

public class UserDaoImpl implements UserDao {  
        @Override  
        public void save() {
        	System.out.println("UserDao save method running....");
	}
}

2.4 創建Spring核心配置文件

在類路徑下(resources)創建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"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans      	             http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

2.5 在Spring配置文件中配置UserDaoImpl

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    id不重複   這樣配置的是要存在無參構造  -->
<!--    默認是singleton的  prototype 多例的 -->
    <bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl"></bean>
</beans>

2.6 使用Spring的API獲得Bean實例

@Test
public void test1(){
		ApplicationContext applicationContext = new  
        ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao)applicationContext.getBean("userDao");   		
    	userDao.save();
 }

3. Spring配置文件

Spring配置文件

3.1 Bean標籤基本配置

用於配置對象交由Spring 來創建。

默認情況下它調用的是類中的無參構造函數,如果沒有無參構造函數則不能創建成功。

基本屬性:

id:Bean實例在Spring容器中的唯一標識

class:Bean的全限定名稱

<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl"></bean>

3.2 Bean標籤範圍配置

scope:指對象的作用範圍,取值如下:

取值範圍 說明
singleton 默認值,單例的
prototype 多例的
request WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中
session WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中
global session WEB 項目中,應用在 Portlet 環境,如果沒有 Portlet 環境那麼globalSession 相當於 session

bean的創建

prototype 原型的 多例的

scope 作用域

1)當scope的取值爲singleton時

​ Bean的實例化個數:1個

​ Bean的實例化時機:當Spring核心文件被加載時,實例化配置的Bean實例

​ Bean的生命週期:

對象創建:當應用加載,創建容器時,對象就被創建了

對象運行:只要容器在,對象一直活着

對象銷燬:當應用卸載,銷燬容器時,對象就被銷燬了

scope singleton 單例 只要容器在,對象一直活着 應用卸載 銷燬容器 對象就被銷燬了

2)當scope的取值爲prototype時

​ Bean的實例化個數:多個

​ Bean的實例化時機:當調用getBean()方法時實例化Bean

對象創建:當使用對象時,創建新的對象實例

對象運行:只要對象在使用中,就一直活着

對象銷燬:當對象長時間不用時,被 Java 的垃圾回收器回收了

長期不用 對象拜拜 垃圾回收 我經常不用 我也拜拜了。

3.3 Bean生命週期配置

指定初始化 銷燬方法

init-method:指定類中的初始化方法名稱

destroy-method:指定類中銷燬方法名稱

3.4 Bean實例化三種方式

1) 使用無參構造方法實例化

​ 它會根據默認無參構造方法來創建類對象,如果bean中沒有默認無參構造函數,將會創建失敗

<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl"/>

2)

要有工廠靜態方法

靜態方法 對象的工廠 要告訴Spring哪個是 怎麼搞

​ 工廠的靜態方法返回Bean實例

public class StaticFactoryBean {
    public static UserDao createUserDao(){    
    return new UserDaoImpl();
    }
}
<bean id="userDao" class="cn.liuawen.factory.StaticFactoryBean" 
      factory-method="createUserDao" />

3) 工廠實例方法實例化

先有工廠對象 再調用工廠內部的某個方法

​ 工廠的非靜態方法返回Bean實例

public class DynamicFactoryBean {  
	public UserDao createUserDao(){        
		return new UserDaoImpl(); 
	}
}
<bean id="factoryBean" class="cn.liuawen.factory.DynamicFactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>

可以 private UserDaoImpl userDaoImpl;

return userDaoImpl;

3.5 Bean的依賴注入入門

①創建 UserService,UserService 內部在調用 UserDao的save() 方法

public class UserServiceImpl implements UserService {
	@Override
	public void save() {
         ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml");       	           UserDao userDao = (UserDao) applicationContext.getBean("userDao");	
          userDao.save();
 	}
 }

②將 UserServiceImpl 的創建權交給 Spring

<bean id="userService" class="cn.liuawen.service.impl.UserServiceImpl"/>

③從 Spring 容器中獲得 UserService 進行操作

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();

3.6 Bean的依賴注入概念

依賴注入(Dependency Injection):它是 Spring 框架核心 IOC 的具體實現。

DI 依賴注入 IOC 控制反轉

在編寫程序時,通過控制反轉,把對象的創建交給了 Spring,但是代碼中不可能出現沒有依賴的情況。

控制了什麼 反轉了什麼 把對象的創建交給了Spring容器

IOC 解耦只是降低他們的依賴關係,但不會消除。例如:業務層仍會調用持久層的方法。

那這種業務層和持久層的依賴關係,在使用 Spring 之後,就讓 Spring 來維護了。

簡單的說,就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取

業務層 持久層

編寫程序 控制反轉 把對象的創建交個了Spring容器,解耦降低它們的依賴關係 但不會消除 ,業務層任會調用持久層的方法,控制層任會調用業務層的方法,

依賴關係交給了Spring來管理。

3.7 Bean的依賴注入方式

構造方法

set方法

①構造方法

​ 創建有參構造

public class UserServiceImpl implements UserService {
     //去Spring配置告訴 我構造
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }
@Override
public void save() {
ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml");       UserDao userDao = (UserDao) applicationContext.getBean("userDao");    
          userDao.save();
    }
 }

​ 配置Spring容器調用有參構造時進行注入

<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl"/>
<bean id="userService" class="cn.liuawen.service.impl.UserServiceImpl">      		   	<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

②set方法

​ 在UserServiceImpl中添加setUserDao方法

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
        } 
    @Override    
    public void save() {      
   		 userDao.save();
	}
}

​ 配置Spring容器調用set方法進行注入

<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl"/>
<bean id="userService" class="cn.liuawen.service.impl.UserServiceImpl">
    <!--  name是set方法後面的第一個單詞的字母 大寫變小寫  setUserDao userDao  ref 引用的容器id -->
	<property name="userDao" ref="userDao"/>
</bean>

set方法:P命名空間注入

​ P命名空間注入本質也是set方法注入,但比起上述的set方法注入更加方便,主要體現在配置文件中,如下:

​ 首先,需要引入P命名空間:

xmlns:p="http://www.springframework.org/schema/p"

其次,需要修改注入方式

<bean id="userService" class="cn.liuawen.service.impl.UserServiceImpl" p:userDao-
 ref="userDao"/>

3.8 Bean的依賴注入的數據類型

上面的操作,都是注入的引用Bean,處了對象的引用可以注入,普通數據類型,集合等都可以在容器中進行注入。

注入數據的三種數據類型

普通數據類型

引用數據類型

集合數據類型

其中引用數據類型,此處就不再贅述了,之前的操作都是對UserDao對象的引用進行注入的,下面將以set方法注入爲例,演示普通數據類型和集合數據類型的注入。

Bean的依賴注入的數據類型

(1)普通數據類型的注入

public class UserDaoImpl implements UserDao {
private String company;
    private int age;
    public void setCompany(String company) {
        this.company = company;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void save() {
        System.out.println(company+"==="+age);
        System.out.println("UserDao save method running....");   
    }
}

<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl">
    <property name="company" value="漸若窺宏大"></property>
    <property name="age" value="15"></property>
</bean>

(2)集合數據類型(List)的注入

public class UserDaoImpl implements UserDao {
	private List<String> strList;
	public void setStrList(List<String> strList) {
		this.strList = strList;
	}
	public void save() {
        System.out.println(strList);
        System.out.println("UserDao save method running....");
	}
}
<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
</bean>

(3)集合數據類型(List)的注入

public class UserDaoImpl implements UserDao {
	private List<User> userList;
	public void setUserList(List<User> userList) {
	this.userList = userList;  
 }
public void save() {
	System.out.println(userList);
	System.out.println("UserDao save method running....");
	}
}
<bean id="u1" class="cn.liuawen.domain.User"/>
<bean id="u2" class="cn.liuawen.domain.User"/>
<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl">
    <property name="userList">
        <list>
            <bean class="cn.liuawen.domain.User"/>
            <bean class="cn.liuawen.domain.User"/>
            <ref bean="u1"/>
            <ref bean="u2"/>       
        </list>
    </property>
</bean>

(4)集合數據類型( Map<String,User> )的注入

public class UserDaoImpl implements UserDao {
    private Map<String,User> userMap;
    public void setUserMap(Map<String, User> userMap) {
    this.userMap = userMap;
    }    
public void save() {      
	System.out.println(userMap);
	System.out.println("UserDao save method running....");
	}
}
<bean id="u1" class="cn.liuawen.domain.User"/>
<bean id="u2" class="cn.liuawen.domain.User"/>
<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl">
    <property name="userMap">
        <map>   
            <entry key="user1" value-ref="u1"/>
            <entry key="user2" value-ref="u2"/>
        </map>
    </property>
</bean>

(5)集合數據類型(Properties)的注入

public class UserDaoImpl implements UserDao {
    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
	public void save() {
		System.out.println(properties);
		System.out.println("UserDao save method running....");
	}
}
<bean id="userDao" class="cn.liuawen.dao.impl.UserDaoImpl">
    <property name="properties">
        <props>
            <prop key="p1">aaa</prop>
            <prop key="p2">bbb</prop> 
            <prop key="p3">ccc</prop>
        </props>
    </property>
</bean>

3.9 引入其他配置文件(分模塊開發)

實際開發中,Spring的配置內容非常多,這就導致Spring配置很繁雜且體積很大,所以,可以將部分配置拆解到其他配置文件中,而在Spring主配置文件通過import標籤進行加載

<import resource="applicationContext-xxx.xml"/>

4. spring相關API

4.1 ApplicationContext的繼承體系

applicationContext:接口類型,代表應用上下文,可以通過其實例獲得 Spring 容器中的 Bean 對象

4.2 ApplicationContext的實現類

ApplicationContext的實現類

1)ClassPathXmlApplicationContext

​ 它是從類的根路徑下加載配置文件 推薦使用這種

2)FileSystemXmlApplicationContext

​ 它是從磁盤路徑上加載配置文件,配置文件可以在磁盤的任意位置。

3)AnnotationConfigApplicationContext

​ 當使用註解配置容器對象時,需要使用此類來創建 spring 容器。它用來讀取註解。

4.3 getBean()方法使用

public Object getBean(String name) throws BeansException {  
	assertBeanFactoryActive();   
	return getBeanFactory().getBean(name);
}
public <T> T getBean(Class<T> requiredType) throws BeansException {   			    	assertBeanFactoryActive();
	return getBeanFactory().getBean(requiredType);
}

其中,當參數的數據類型是字符串時,表示根據Bean的id從容器中獲得Bean實例,返回是Object,需要強轉。

當參數的數據類型是Class類型時,表示根據類型從容器中匹配Bean實例,當容器中相同類型的Bean有多個時,則此方法會報錯

相同的類型的Bean有多個

getBean()方法使用

ApplicationContext applicationContext = new 
            ClassPathXmlApplicationContext("applicationContext.xml");
  UserService userService1 = (UserService) applicationContext.getBean("userService");
  UserService userService2 = applicationContext.getBean(UserService.class);

id 可以出現多個類型相同的Bean 可以區分開

相同類型的 區分不開 不能存在多個相同類型的bean

某個類型的只存在一個 可以用Class類型的

ClassPathXmlApplicationContext

getBean id

getBean Class

5、記錄

簡單記錄筆記 - JavaEE在線就業班2.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章