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)複製約束的路徑http://www.springframework.org/schema/beans/spring-beans.xsdSpring的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 |