Java之spring新手教程(包教包会)
Java-Spring(一)之IoC以及bean的生命周期
文章目錄
- Java-Spring(一)之IoC以及bean的生命周期
- 一、什么是Spring
- 二、Spring的核心
- 三、什么是耦合
- 四、spring項目的搭建
- 五、配置文件
- 六、IoC(控制反轉)
- 七、屬性注入的方式
- 1、設值注入
- 2、構造方法注入
- 八、DI(依賴注入)
- 九、集合屬性的注入
- 1、內部注入
- 2、外部注入
- 十、Spring管理Bean的作用域
- 1、singleton(單實例)
- 2、prototype
- 3、request
- 4、session
- 5、global session
- 十一、Bean的生命周期
- 1、五步
- 2、七步
- 十二、Bean的兩種方式
- 1、創建普通Bean對象
- 2、創建工程Bean工廠
一、什么是Spring
這是度娘上的比較官方的解釋。
說得更加詳細一點,Spring是一個開源框架,Spring是于2003年興起的一個輕量級的Java開發框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個組件,同時為J2EE應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和面向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架。
二、Spring的核心
Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。
輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴于Spring的特定類。
控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統級關注點,例如日志或事務支持。
容器——Spring包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創建——基于一個可配置原型(prototype),你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不應該被混同于傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
框架——Spring可以將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件里。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。
所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎支持。
三、什么是耦合
簡單來講耦合指的就是兩個類之間的聯系的緊密程度
最簡單的例子就是我些了一段代碼,而在另外一個地方又寫了一遍差不了太對的代碼。這樣可以成為耦合度高。
在java編程的過程中,我們盡量要避免重復的造輪子,應運而生的框架就誕生了,Spring就能夠做到解耦合。
四、spring項目的搭建
這里我是用的是maven倉庫來添加的依賴
把以下依賴加入pom文件中
這就是我們spring所需要的基礎的依賴
五、配置文件
在資源文件包下建立一個XML文件作為我們spring的一個配置文件
六、IoC(控制反轉)
在基本的項目搭建完成之后,我們就要先來了解Spring的核心之一:
IoC(控制反轉)
在我們以前的程序書寫中,我們用到對象大都是以new的方式去創建對象:
以前學到創建對象的方式
1、new
2、反射
3、序列化
那么Spring給我們提供的一種全新的創建對象的方式。
我們可以把創建對象的工作全部交給Spring來給我們完成
這個就叫做IoC
比如:
我這里有一個對象,那么我們要創建對象就可以去配置文件中書寫
<bean id="per" class="pojo.Person" p:name="張三" p:car-ref="car" p:list-ref="list1"/>來表示我們創建的對象,以及相應的賦值
在主方法中調用
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");Person person = (Person) ac.getBean("per");以getBean()的方式來獲取我們的bean對象
七、屬性注入的方式
1、設值注入
<!-- set 注入(設值注入) spring 調用對象中set方法簡單類型注入<property name="屬性名" value="值"/> --><bean id="user" class="pojo.User"><property name="userName" value="張三"/><property name="password" value="123456"/><property name="role" ref="role"/></bean>這其實就是簡單的調用set方法來給屬性賦初值,如果在類中沒有set方法,就會出現異常
2、構造方法注入
<!-- 構造注入 調用有參構造方法 聲明對象不用關心順序,二次掃描--><bean id="user1" class="pojo.User"><constructor-arg name="userName" value="李四"/><constructor-arg name="password" value="654321"/><constructor-arg name="role" ref="role"/></bean>顧名思義,和設置注入一樣就是通過構造器去給屬性賦值,同set一樣,也是必須要有有參構造方法的書寫的。
八、DI(依賴注入)
IoC的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency IInjection,依賴注入)來實現的。
比如對象A需要操作數據庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring我們就只需要告訴spring,A中需要一個Connection,至于這個Connection怎么構造,何時構造,A不需要知道。在系統運行時,spring會在適當的時候制造一個Connection,然后像打針一樣,注射到A當中,這樣就完成了對各個對象之間關系的控制。A需要依賴 Connection才能正常運行,而這個Connection是由spring注入到A中的,依賴注入的名字就這么來的。那么DI是如何實現的呢? Java 1.3之后一個重要特征是反射(reflection),它允許程序在運行的時候動態的生成對象、執行對象的方法、改變對象的屬性,spring就是通過反射來實現注入的。
其實在上面的例子中我們也用到了DI,
<constructor-arg name="role" ref="role"/>這里的User也依賴與我們的Role的一個對象,
所以我們要在配置文件中添加一個新的Bean對象。
<bean id="user" class="pojo.User"><property name="userName" value="張三"/><property name="password" value="123456"/><property name="role" ref="role"/></bean> <!-- 對象注入 --><bean id="role" class="pojo.Role"><property name="roleName" value="openlab"/></bean>注意:在我們DI的過程中我們是不需要去注意Bean對象的順序,spring會進行二次掃描,來創建我們需要有依賴的對象。
九、集合屬性的注入
其實集合也是一種對象我們可以通過DI的方式去注入集合屬性
1、內部注入
<bean id="per" class="pojo.Person" p:name="張三" p:car-ref="car"><property name="list"><list><value>123</value><value>123</value><value>123</value></list></property></bean>在我們的Bean對象的內部去注入我們的屬性<list>就是我們注入的集合類型
set集合 map映射改這里就行
<map><entry key="1" value="123"></entry></map>由于map是以鍵值對的形式存儲的,我們在給值的同時,也要以entry來給值
2、外部注入
這里我們就要用到我們的頭部文件,
xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">就能在我們xml配置文件中來用到我們的util工具
<util:list id="list1"><value>123</value><value>123</value><value>123</value></util:list>十、Spring管理Bean的作用域
spring bean作用域的作用域有5種
Spring Bean 中所說的作用域,在配置文件中即是“scope”
1、singleton(單實例)
是默認的作用域
在不配置scope時我們創建的對象時單例的
所有對象的地址相同
2、prototype
修改scope的值為prototype之后
就變成了不同的對象
3、request
Request作用域針對的是每次的Http請求,Spring容器會根據相關的Bean的
定義來創建一個全新的Bean實例。而且該Bean只在當前request內是有效的。
4、session
針對某個HTTP Session,Spring容器會根據userPreferences bean定義創建一個全新的userPreferences bean實例, 且該userPreferences bean僅在當前HTTP Session內有效。 與request作用域一樣,你可以根據需要放心的更改所創建實例的內部狀態,而別的HTTP Session中根據userPreferences創建的實例, 將不會看到這些特定于某個HTTP Session的狀態變化。 當HTTP Session最終被廢棄的時候,在該HTTP Session作用域內的bean也會被廢棄掉。
5、global session
global session作用域類似于標準的HTTP Session作用域,不過它僅僅在基于portlet的web應用中才有意義。Portlet規范定義了全局Session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定于全局portlet Session的生命周期范圍內。
十一、Bean的生命周期
1、五步
1、構造
2、set賦值
3、初始化
4、對象獲取到了
5、銷毀
這里我們要重寫init方法和destroy方法
public class BeanLife {private String name;public BeanLife () {System.out.println("無參構造");}public void setName (String name) {System.out.println("Set");this.name = name;}public void init(){System.out.println("init");}public void destroy(){System.out.println("destroy");} }執行結果為
2、七步
在Bean創建對象的時還有一種在前后插入方法的類
public class BeanLife1 implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization (Object bean, String beanName) throws BeansException {System.out.println("之前");return bean;}@Overridepublic Object postProcessAfterInitialization (Object bean, String beanName) throws BeansException {System.out.println("之后");return bean;} } <bean class="pojo.BeanLife" id="beanLife" p:name="張三" init-method="init" destroy-method="destroy"/><bean class="pojo.BeanLife1" id="beanLife1"/>我們創建BeanLife時就會出現
1、構造
2、set賦值
3、之前插入方法
4、初始化
5、對象獲取到了
6、之后回去方法
7、銷毀
十二、Bean的兩種方式
1、創建普通Bean對象
就是最普通的創建普通Bean對象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext1.xml");Person person = ac.getBean("factory",Person.class);person.setName("lili");System.out.println(person);2、創建工程Bean工廠
public class Factory implements FactoryBean<Person> {@Overridepublic Person getObject () throws Exception {return new Person();}@Overridepublic Class<?> getObjectType () {return Person.class;} }然后來通過工廠來創建隊形的實例
總結
以上是生活随笔為你收集整理的Java之spring新手教程(包教包会)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring新手教程
- 下一篇: (一)spring Boot菜鸟教程-搭