標籤:

Spring(1):概念及ioc操作

Spring 概念

1.Spring是開源的輕量級框架

2.Spring核心主要兩部分:

(1)aop:面向切面編程,擴展功能不是通過修改源代碼實現。

(2)ioc:控制反轉:

-比如有一個類,在類裡面有方法(不是靜態的方法),調用類裡面的方法,

創建類的對象,使用對象調用方法,創建類對象的過程,需要new出來新的

對象。---之前的做法

-把對象的創建不是通過new方式實現,而是交給Spring配置創建類對象

3.Spring是一站式框架:

(1)Spring在javaee三層結構中,每一層都提供不同的解決技術。

-web層:SpringMVC

-service層:spring的ioc

-dao層:spring的jdbcTemplate

Spring的ioc操作

1.把對象的創建交給Spring進行管理

2.ioc操作兩部分:

(1)ioc的配置文件方式

(2)ioc的註解方式

ioc底層原理

(1)xml配置文件

(2)dom4j解決xml

(3)工廠設計模式

(4)反射

public class User{ public void add(){.....} }//調用類中的方法User user=new User();user.add();

如果我們在servlet中需要調用User類中的方法,則需要實例化對象

假如User類名改變或add()方法名改變 ,servlet也要改變,很麻煩

缺陷:耦合度太高

解決方法發展歷程:

1.使用工廠模式解耦合操作

public class UserService{ public void add(){}}public class UserServlet{ UserService s=Factory.getService(); s.add();}//創建工廠類public class Factory{ public static UserService getService(){ return new UserService(); }}

做程序應該有一種思路:

高內聚,低耦合

ioc原理:

public class UserService{}public class UserServlet{ //得到UserService的對象,原始方法:new創建}第一步:創建一個xml配置文件,配置要創建的對象類<bean id="userService" class="cn.itcast.UserService">第二部:創建工廠類,使用dom4j解析配置文件+反射public class UserFactory{ public static UserService getService(){ //1 使用dom4j解析xml文件 //根據id值userService,得到id值對應class屬性值 String classValue="calss屬性值" //2.使用反射創建類對象 Class c=Class.forName(classValue); //創建類對象 UserService service=c.newInstance(); return service; }}

IOC入門案例

第一步 導入jar包

(1)解壓資料zip文件

Jar的特點:都有3個jar包 .jar javadoc.jar sources.jar

(2)做Spring最基本的功能的時候,導入4個核心jar包就可以了

Beans Core Context Expression

第二步 創建類,在類中創建方法

第三步 創建Spring配置文件,配置創建類

(1)Spring核心配置文件名稱和位置不是固定的

--建議放到src下,

(2)引入約束

(3)配置對象創建

第四步 通過代碼測試對象創建

public class TestIOC { @Test public void testUser(){ //1.載入Spring配置文件,根據創建對象 ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml"); //2.得到配置創建的對象 User user=(User)context.getBean("user"); System.out.println(user); user.add(); }}

配置文件沒有提示約束問題

1.Spring引入schema約束,吧約束文件引入到eclipse

(1)複製約束的路徑

springframework.org/sch

Spring的bean管理(xml配置文件)

一、bean實例化的三中方式

第一種 使用類的無參數構造創建(重點)

<bean id="user" class="cn.itcast.ioc.User"></bean>

當類裡面沒有無參數的構造,會出現異常

第二種 使用靜態工廠創建

工廠類中的靜態方法為

public static User getUser(){

return new User();

}

<bean id="user" class="cn.itcast.ioc.UserFactory" factory-method="getUser"></bean>

第三種 使用實例工廠創建

<bean id="userFactory" class="cn.itcast.ioc.UserFactory"></bean>

<bean id="user" factory-bean="bean3Factory" factory-method="getUser"></bean>

二、bean標籤常用屬性

(1)id 屬性

id屬性值名稱任意命名

代碼中根據id值得到配置對象

(2)class屬性

創建對象所在類的全路徑

(3)name屬性

功能和id屬性是一樣的,id屬性值不能包含特殊符號,name屬性值可以包含特殊符號,

現在一般不使用name屬性,多使用id

(4)scope屬性

bean的作用範圍

singleton:默認值,單例的

prototype:多例的

request:創建對象然後把對象放到request域裡面

session:創建對象然後把對象放到session域裡面

globalSession:創建對象然後把對象放到globalSession域裡面

三、屬性注入

1.創建對象的時候,向類裡面屬性裡面設置值

2.屬性注入的方式介紹(三種方式)

第一種 使用set方法注入

public class User{

private String name;

public void setName(String name){

this.name=name;

}

}

第二種 有參數構造注入

第三種 使用介面注入

在Spring框架中,支持前兩種方式注入

(1)使用有參數構造注入屬性

配置文件中:

<!-- 使用有參數函數構造-->

<bean id="" class="">

<constructor-arg name="" value=""></constructor-arg>

</bean>

(2)set注入

<bean id="" class="">

<property name="類中的屬性名字" value="屬性設置的值"></property>

</bean>

注入對象類型屬性(重點)

創建一個Service類和一個Dao類,在Service類中使用Dao類中的方法,不通過new的方法,而是交給Spring去完成這件事。

public class UserService { //1.定義Dao屬性 private UserDao userdao; //2.生成set方法 public void setUserdao(UserDao userdao) { this.userdao = userdao; } //3.在配置文件中注入對象類型屬性 public void add(){ System.out.println("service...."); /** * 以前的做法 * UserDao dao=new UserDao(); * dao.add(); */ userdao.add(); }}public class UserDao { public void add(){ System.out.println("dao...."); }}<!--1.配置Service和Dao對象 --> <bean id="dao" class="cn.itcast.ioc.UserDao"></bean> <bean id="service" class="cn.itcast.ioc.UserService"> <!--注入dao對象,不寫value因為不是字元串,使用ref屬性 ,ref=dao的ID值,name屬性值是UserService 中的屬性名稱--> <property name="userdao" ref="dao"></property> </bean>

P名稱空間注入

配置文件中格式:

注入複雜類型屬性(List ,Map,數組,properties)

使用set方法注入

IOC和DI的區別

IOC: 控制反轉,把對象創建交給Spring進行配置

DI:依賴注入,向類裡面的屬性中設置值

關係:依賴注入不能單獨存在,需要在 IOC基礎之上完成操作。

Spring整合web項目原理

1.載入Spring核心配置文件

ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");

但是每次載入都得new對象

2.實現思想:把載入配置文件和創建對象過程,在伺服器啟動的時候就完成。

3.實現原理

(1)ServletContext對象 ;(2)監聽器

具體使用:在伺服器啟動的時候,為每個項目創建一個ServletContext對象

在ServletContext對象創建的時候,使用監聽器可以具體監聽到ServletContext

對象在什麼時候創建。

當監聽器發現ServletContext對象創建的時候

載入Spring配置文件,把配置文件配置對象創建

把創建出來的對象放到ServletContext域對象中(setAttribute方法)

獲取對象的時候,到ServletContext域中得到(getAttribute方法)


推薦閱讀:

為Spring Cloud Ribbon配置請求重試(Camden.SR2+)
如何學好ssh框架,spring學起來怎麼這麼難呢?
Spring之CROS解決AJAX跨域問題
【spring指南系列】使用Redis進行消息傳遞
[應用]Spring——小短腿的第二春

TAG:Spring |