Java框架學習_Spring(一)Spring相關的概念、Spring的配置和屬性注入
阿新 • • 發佈:2019-01-10
學習java框架的路線定為Spring + Mybatis + SpringMVC,即SSM,下面先開始經典的Spring的學習
Spring的開發包:spring-framework-4.2.4.RELEASE-dist
1、Spring相關的概念:
Spring:full-stack一站式/全棧式框架,下面是它的整體框架:其中最主要的就是Core Container
Tips:為什麼叫一站式?
Web層:SpringMVC
Service層:Spring的Bean管理,宣告式事務
Dao層:ORM模組、JDBC模板
spring的底層實現:
工廠類通過解析配置檔案(XML)拿到類的名字然後反射獲取類的例項
IOC和DI的區別(面試):
IOC:控制反轉(Inversion of Control),將物件的建立權反轉給Spring,方便解耦和,Spring的主要思想
DI:依賴注入(Dependency Injection),前提必須有IOC的環境,spring管理這個類的時候通過配置將類的依賴的屬性注入(設定set)進來(設定這個值的過程就是DI)
比如:
這個類需要一個
private String name;
就可以在配置檔案中來設定,這就是DI
<property name="name" value="吳彥祖" \>
進一步擴充套件----java類之間的關係:依賴、繼承、聚合
依賴:
B裡面的方法有A的屬性
Class A{
}
Class B{
public void XXX(A a)
繼承:
is a 麻雀是鳥
聚合:
has a 人有頭髮(程式設計師除外)
Spring的工廠類:
- BeanFactory(老版本,在呼叫getBean的時候才會生成類的例項)
- ApplicationContext(繼承了BeanFactory介面,在載入配置檔案的時候,就會將Spring管理的類都例項化)
ApplicationContext介面的兩個實現類及其區別:
- ClassPathXmlApplicationContext:載入類路徑下的檔案(就是src下的檔案,最終會被儲存在WEB-INF下的class檔案裡,常用)
- FileSystemXmlApplicationContext:載入檔案系統下的檔案(就是硬碟下的)
2、Spring的配置和屬性注入(其實就是在配置檔案裡構造類和對類的屬性賦值,就不需要我們在寫程式碼的時候再對類進行操作了):
基本上學習框架都包含了:
- 導包:Core Container的jar包
- 配置日誌記錄:log4j.properties(和xml一起放在src下面)
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout
- 配置xml檔案,預設檔名為 applicationContext.xml,配置是以Bean為單位的(只要引入上面的一部分就行了,注入可選)
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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">
1、基本配置(就相當於使用了無參構造方法構造了一個例項物件):
id="類的代號,和name沒多大區別"
class="要執行的類的全路徑名"
2、生命週期配置:
init-method="初始化方法,預設執行"
destroy-method="銷燬方法,bean必須是單例建立的"
3、作用範圍的配置:
scope:
singleton:單例模式,預設,只建立有一個物件
prototype:多例模式(struts2和Spring整合的時候用到)
request:應用在web專案中,Spring建立這個類後,將這個類存入到request範圍中
session:應用在web專案中,Spring建立這個類後,將這個類存入到session範圍中
globalsession:應用在web專案中,必須在porlet環境下使用,但是如果沒有這種環境,相當於session
<bean id="類的代號,和name沒多大區別" class="要執行的類的全路徑名"
init-method="初始化方法,預設執行" destroy-method="銷燬方法,bean必須是單例建立的" scope=""></bean>
4、Spring的屬性注入
4.1 構造方法的方式的屬性注入
<bean id="類的代號" class="要執行的類的全路徑名" >
<constructor-arg name="屬性名name" value="屬性值"></constructor-arg>
<constructor-arg name="屬性名age" value="屬性值"></constructor-arg>
</bean>
4.2 Set方法的方式的屬性注入
<bean id="類的代號" class="要執行的類的全路徑名" >
普通型別
<property name="屬性名name" value="屬性值"></property>
物件型別,ref:設定其他類的id或者name
<property name="user" ref="user"></property>
</bean>
4.3 p名稱空間的方式(2.5以後版本)
<bean id="類的代號" class="要執行的類的全路徑名"
p:name="" p:age="" p:user-ref="">
4.3 SpEL的方式(3.5以後版本)
<bean id="類的代號" class="要執行的類的全路徑名" >
<property name="屬性名name" value="#{‘吳彥祖’}"></property>
<property name="屬性名age" value="#{23}"></property>
<property name="屬性名user" value="#{user}"></property>
</bean>
5、Spring的集合屬性注入(就是類的屬性裡有集合元素,比如:陣列、list、set、map)
<bean id="類的代號" class="要執行的類的全路徑名" >
<property name="陣列/list">
<list>
<value>普通型別</value>
<ref>物件型別</ref>
</list>
</property>
<property name="set">
<set>
<value>普通型別</value>
<ref>物件型別</ref>
</set>
</property>
<property name="map">
<map>
<entry key="" value=""></entry>
<entry key-ref="" value-ref=""></entry>
</map>
</property>
</bean>
</beans>
在配置和屬性注入完成後,我們可以用下面的程式碼引入這個類:
package cn.nupt.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public void test() {
//載入配置檔案
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//根據ID找到相應的類
UserDaoImpl userdaoImpl = (UserDaoImpl)applicationContext.getBean("id的名字");
//呼叫類裡面的方法
}
}
Tips:id和name的區別:
1、id使用了約束中的唯一約束,不能重複,不能出現特殊字元
2、name沒有使用約束中的唯一約束,原則上可以重複