Spring框架課堂筆記
1.1 簡介
spring 春天----給軟體行業帶來了春天
-
2002年,spring前身interface 21框架
-
2004年3月24號,spring框架誕生
-
Rod johnson,spring創始人
-
spring理念:使現有的技術更加的容易使用,本身是一個大雜燴,整合了現有的技術框架!
-
SSH:Struct2+Spring+Hibernate
-
SSM:SpringMvc + Spring + Mybatis
官網:https://spring.io/projects/spring-framework
官方下載地址:http://repo.spring.io/release/org/springframework/spring
GitHub:https://github.com/spring-projects/spring-framework
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
1.2 優點
-
Spring是一個開源的免費的框架(容器)
-
Spring是一個輕量級的、非入侵式的框架
-
控制反轉{IOC},面向切面程式設計(AOP)
-
支援事務的處理,對框架整合的支援
總結一句話:Spring就是一個輕量級的控制反轉(IOC)和麵向切面程式設計(AOP)的框架
1.3 Spring的組成
1.4 擴充套件
在Spring的官網有這個介紹:現代化的Java開發,說白了就是spring的開發
-
Spring Boot
-
一個快速開發的腳手架
-
基於SpringBoot可以快速的開發單個微服務
-
約定大於配置
-
-
Spring Cloud
-
-
SpringCloud是基於SpringBoot實現的
-
因為現在大多數公司都在使用SpringBoot進行快速開發,學習SpringBoot的前提,需要完全掌握Spring及SpringMVC,承上啟下的作用
弊端:發展了太久之後,違背了原來的理念 ,配置十分繁瑣
2. IOC理論推導
-
UserDao 介面
-
UserDaoImpl 實現類
-
UserService 業務介面
-
UserServiceImpl 業務實現類
在我們之前的業務中,使用者的需求可能會影響我們原來的程式碼,我們需要根據使用者的需求去修改原始碼,如果程式程式碼量很大,修改代價十分昂貴!
我們使用一個set介面實現,已經發現革命性變化
private UserDao userDao;
//利用set進行動態實現值得植入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
-
之前程式是主動建立物件,控制權在程式設計師手上
-
使用了set注入後,程式不在具有主動性,而是變成了被動的接受物件
這種思想,從本質上解決了問題,我們程式設計師不用再去管理對 象的建立了,系統的耦合性大大降低,可以更加專注在業務實現上。這是IOC原型
IOC本質 控制反轉 loC(Inversion of Control),是一種設計思想,Dl(依賴注入)是實現loC的一種方法,也有人認為DI只是loC的另一種說法。沒有loC的程式中,我們使用面向物件程式設計,物件的建立與物件間的依賴關係完全硬編碼在程式中,物件的建立由程式自己控制,控制反轉後將物件的建立轉移給第三方,個人認為所謂控制反轉就是︰獲得依賴物件的方式反轉了。
採用XML方式配置Bean的時候,Bean的定義資訊是和實現分離的,而採用註解的方式可以把兩者合為一體,Bean的定義資訊直接以註解的形式定義在實現類中,從而達到了零配置的目的。
控制反轉是一種通過描述(XML或註解)並通過第三方去生產或獲取特定物件的方式。在Spring中實現控制反轉的是loC容器,其實現方法是依賴注入(Dependency Injection,Dl) 。
3. HelloSpring
Hello.java
package com.kuang.pojo;
public class Hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
beans.xml
MyTest.java
import com.kuang.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
//獲取spring的上下文物件
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//我們的物件現在都在spring中管理了,我們要使用,直接取出來就可以
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
}
}
思考問題?
-
Hello物件是誰建立的?
hello物件是由Spring建立的.
-
Hello物件的屬性是怎麼設定的? hello物件的屬性是由Spring容器設定的
這個過程就叫控制反轉:
控制∶誰來控制物件的建立,傳統應用程式的物件是由程式本身控制建立的,使用Spring後,物件是由Spring來建立的.
反轉:程式本身不建立物件,而變成被動的接收物件.
依賴注入:就是利用set方法來進行注入的.
IOC是一種程式設計思想,由主動的繽程變成被動的接收.
可以通過newClassPathXmlApplicationcontext去瀏覽一下底層原始碼. OK,到了現在,我們徹底不用再程式中去改動了,要實現不同的操作,只需要在xml配置檔案中進行修改,所謂的loc.一句話搞定;物件由Spring來建立,管理,裝配!
4. IOC建立物件的方式
-
使用無參構造建立物件,預設
-
假設我們要使用有參構造建立物件
-
下標賦值
<!--1. 下標賦值 -->
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg index="0" value="kuangshenshuo"></constructor-arg>
</bean> -
型別賦值
<!--2. 通過型別建立不建議使用 -->
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg type="java.lang.String" value="qinjiangshuo"></constructor-arg>
</bean> -
引數名
<!--3. 直接通過引數名 -->
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg name="name" value="qinjiangshuo"></constructor-arg>
</bean>
總結:在配置檔案載入的時候,容器中管理的物件就已經初始化了
-
5. Spring配置
5.1 別名
<!-- 別名,如果添加了別名,我們可用別名-->
<alias name="user" alias="asdvcda"></alias>
5.2 Bean的配置
<!--
id:bean的唯一識別符號,也就是我們學的物件名
class:bean物件所對應的許可權命名:包名+型別
name:也是別名,而且name可以取多個別名
-->
<bean id="userT" class="com.kuang.pojo.UserT" name="u2,user2;u4">
<property name="name" value="西部開源"></property>
</bean>
5.3 import
import一般用於團隊開發使用,可以將多個配置檔案匯入合併為一個
假設現在專案中有多個人開發,這三個人負責不同的類開發,不同的類需要註冊在不同的bean當中
用import將所有人的beans.xml合併為總的
-
張三
-
李四
-
王五
-
applicationContext.xml
<import resource="beans.xml"></import>
<import resource="beans2.xml"></import>
<import resource="beans3.xml"></import>
6. DI依賴注入
6.1 構造器注入
前面已經說過
6.2 Set方式注入[重點]
-
依賴注入:Set注入
-
依賴:bean物件的建立依賴於容器
-
注入:bean物件中的所有屬性,由容器來注入
-
【環境搭建】
-
複雜型別
package com.kuang.pojo;
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
} -
真實測試物件
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String,String> card;
private Set<String > games;
private Properties info;
private String wife;
-
beans.xml
-
測試類
import com.kuang.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.getName());
//System.out.println(student.getAddress());
}
} -
完善注入資訊
<bean id="student" class="com.kuang.pojo.Student">
<!-- 1. 普通值注入,value-->
<property name="name" value="宋晨旭"></property>
<!--2. bean注入,ref:引用spring容器中建立好的物件-->
<property name="address" ref="address"></property>
<!--3. 陣列注入,array-->
<property name="books">
<array>
<value>紅樓夢</value>
<value>西遊記</value>
<value>水滸傳</value>
<value>三國演義</value>
</array>
</property>
<!--4. list注入,list-->
<property name="hobbies">
<list>
<value>聽歌</value>
<value>玩遊戲</value>
<value>看電影</value>
</list>
</property>
<!--5. map注入,map-->
<property name="card">
<map>
<entry key="身份證" value="1234567823"></entry>
<entry key="銀行卡" value="12345562315677"></entry>
</map>
</property>
<!--6. set注入,set-->
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
<value>BOB</value>
</set>
</property>
<!--7. null注入-->
<property name="wife">
<null></null>
</property>
<!--8. Properties注入-->
<property name="info">