1. 程式人生 > >Java框架學習_Spring(一)Spring相關的概念、Spring的配置和屬性注入

Java框架學習_Spring(一)Spring相關的概念、Spring的配置和屬性注入

學習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的配置和屬性注入(其實就是在配置檔案裡構造類和對類的屬性賦值,就不需要我們在寫程式碼的時候再對類進行操作了):

基本上學習框架都包含了:

  1. 導包:Core Container的jar包
  2. 配置日誌記錄: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

  1. 配置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沒有使用約束中的唯一約束,原則上可以重複