Java學習之Spring框架入門篇
0x00 前言
最近在學SSM的三大框架,上篇文章,已經更新了Mybatis的相關內容,那么這篇文章就來寫寫Spring的入門。
0x01 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)。
0x02 Spring使用的意義
首先我們來看一段代碼。
dao接口:
package com.test.dao;
public interface userdao {
void select();
}
mysqldaoimpl:
package com.test.dao;
public class mysqldaoimpl implements userdao{
public void select() {
System.out.println("mysqldaoimpl");
}
}
mssqldaodimpl:
package com.test.dao;
public class mssqldaoimpl implements userdao {
public void select() {
System.out.println("mssqlselect ");
}
}
test類:
package com.test.domain;
import com.test.dao.mysqldaoimpl;
import com.test.dao.userdao;
public class test1 {
public static void main(String[] args) {
userdao mysqldaoimpl = new mysqldaoimpl();
mysqldaoimpl.select();
}
}
具體的實現就不寫了,這里只是演示一下區別。
這里寫了一個接口代表某一個查詢方法,然后寫了2個實現類,分別是mysql的連接和mssql的連接查詢。
我們可以注意到,我們在test類里面想要調用mysql的方法就直接new了一個實現類的對象,那么如果在后面想要mssql的查詢的話,就需要修改代碼,這樣的代碼效率不高,而且在后面代碼如果多了也不好改了。而且這樣寫的話控制權全在開發者手里,而不是在用戶的手里,要實現什么樣的功能控制權應該是在用戶手里,而不是開發者手里。
那么這里就可以用到 Spring框架,來實現。雖然是也有其他辦法能解決這個問題,但是實現起來代碼比較繁瑣,那么我們為什么不用更加簡單便捷的方法呢?
0x03 Spring 使用
首先也還是配置一下spring的坐標。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
配置完成后,就來配置一下我們的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">
<bean id="mysqldaoimpl" class="com.test.dao.mysqldaoimpl"/>
<bean id="mssqldaoimpl" class="com.test.dao.mssqldaoimpl"/>
</beans>
test類:
package com.test.domain;
import com.test.dao.userdao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test1 {
public static void main(String[] args) {
ApplicationContext cl = new ClassPathXmlApplicationContext("bean.xml"); //傳入xml文件
userdao mysqldaoimpl = (userdao)cl.getBean("mysqldaoimpl"); //獲取mysqldaoimpl方法
mysqldaoimpl.select();//調用mysqldaoimpl方法
}
}
配置並直接傳入xml文件,並獲取一下方法,就可以直接來調用方法就可以使用了。無需在new實現類的實例化對象。
Bean標簽詳解:
作用:
用於配置對象讓 spring 來創建的。
默認情況下它調用的是類中的無參構造函數。如果沒有無參構造函數則不能創建成功。
屬性:
id: 給對象在容器中提供一個唯一標識。用於獲取對象。
class: 指定類的全限定類名。用於反射創建對象。默認情況下調用無參構造函數。
*scope: 指定對象的作用范圍。
* singleton :默認值,單例的.
* prototype :多例的.
* request :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中.
* session :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中.
* global session :WEB 項目中,應用在 Portlet 環境.如果沒有 Portlet 環境那么
*globalSession 相當於 session.
*init-method: 指定類中的初始化方法名稱。
*destroy-method: 指定類中銷毀方法名稱。
0X04 依賴注入
bean對象的創建來於容器,bean對象中的所有屬性,都有容器來注入。下面來看看常用的幾種注入方式
構造注入
構造注入:顧名思義,就是使用類中的構造函數,給成員變量賦值。注意,賦值的操作不是我們自己做的,而是通過配置
的方式,讓 spring 框架來為我們注入。
首先定義一個實體類:
package com.test.doamin;
import java.util.Date;
public class Perpon {
private String name;
private Integer age;
public Perpon() {
}
@Override
public String toString() {
return "Perpon{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
'}';
}
public Perpon(String name, Integer age, Date date) {
this.name = name;
this.age = age;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
private Date date;
}
在平時我們都是直接在new的時候,或者是使用set方式對他進行賦值,那么在spring框架下,只需要配置一下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">
<bean id="person" class="com.test.doamin.Perpon">
<constructor-arg name="name" value="xiaoming"/>
<constructor-arg name="age" value="18"/>
<constructor-arg name="date" ref="now"/>
</bean>
<bean id = "now" class="java.util.Date"/>
</beans>
test類:
public static void main(String[] args) {
ApplicationContext cl = new ClassPathXmlApplicationContext("bean.xml"); //傳入xml文件
Perpon person = (Perpon) cl.getBean("person");
System.out.println(person);
}
}
注意事項:
類中需要提供一個對應參數列表的構造函數。
然后我們就可以看到執行結果了。
Perpon{name='xiaoming', age=18, date=Sun Aug 30 05:32:35 CST 2020}
把person打印出來,這里看到這些成員變量都被賦值了,是由我們框架去完成的。
constructor-arg標簽屬性:
index:指定參數在構造函數參數列表的索引位置
type:指定參數在構造函數中的數據類型
name:指定參數在構造函數中的名稱
value:它能賦的值是基本數據類型和 String 類型
ref:它能賦的值是其他 bean 類型,也就是說,必須得是在配置文件中配置過的 bean
Set 注入
<bean id="person" class="com.test.doamin.Perpon">
<property name="name" value="xiaoming"/>
<property name="age" value="18"/>
<property name="date" ref="now"/>
</bean>
<bean id = "now" class="java.util.Date"/>
property標簽屬性:
name:找的是類中 set 方法后面的部分
ref:給屬性賦值是其他 bean 類型的
value:給屬性賦值是基本數據類型和 string 類型的
實際開發中,此種方式用的較多。
0x05 結尾
在前面看到這個東西其實是懵的,后來看着看着發現其實還是挺簡單的,大部分都是一些概念上的東西比較難以理解,但是一般框架使用都比較簡單。
