javascript
Spring初识
從上學期開始決心開始學習Spring,自己總是利用不好時間,到處瞎忙,結果浪費了好多時間。想著利用暑假的時間,專心看會兒書。最初我在Spring官網下載jar包的時候,忙會兒了半天愣是沒找到下載的鏈接,瞬間覺得學Spring好難,莫名的抵觸心理開始泛濫,無奈只好強抱度娘。這是我找到的鏈接。
教您怎么從spring 官網下載參考文檔
附上小圖:
Spring官網下載
嘿嘿,其實好簡單哦,可是人家當時就是沒找到嘛,也不想那么快地擁抱度娘23333……
Spring下載解壓后可以看到lib目錄下jar包確實有點多哦,每個jar包都有三個不同類型的,一種是含.class文件的jar包(….jar),這也是我們項目中需要的,還有兩種是幫助文檔(…-javadoc.jar)和源碼(…-sources.jar)。以下內容純粹是我的看書筆記哦,我是看的李剛的那本輕量級javaee。自己總是太快忘記一些事,還有一些人,所以記錄下羅。
我看書寫第一個Demo(setter、getter都刪掉羅):
src/cn/edu/cqupt/MySpring/bean/Person.java package cn.edu.cqupt.MySpring.bean.impl; public class Person { private String name;private int age;public String toString(){return "Name:"+this.name+",age:"+this.age;} } src/beans.xml <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <bean id="person" class="cn.edu.cqupt.MySpring.bean.impl.Person"><property name="name" value="xiaofeig"/><property name="age" value="20"/> </bean> </beans> src/cn/edu/cqupt/MyString/test/TestMain.java package cn.edu.cqupt.MySpring.test;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.edu.cqupt.MySpring.bean.impl.Person; public class TestMain {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");Person person=context.getBean("person",Person.class);System.out.println(person);} 打印結果:Name:xiaofeig,age:20Spring的核心機制:依賴注入(Dependency Injection)
我們在xml文件中配置了一個編號為person的實例之后,Spring容器就負責幫助我們來創建這個實例,這個實例包含兩個屬性,分別為name和age,通過property標簽來設置它的值value。配置完成之后,Spring容器就通過反射機制調用Person類的無參構造方法創建一個實例,然后再調用屬性name,age的setter方法,為這兩個屬性設值。這應該就是最簡單的依賴注入啦。我們只需要在容器ApplicationContext中通過實例編號person去取就可以啦。書上還有一些關于依賴關系的一些介紹,加入A組件調用了B組件的方法,我們可稱A組件依賴于B組件。
依賴注入還有個特別高大上的名字,控制反轉(Inversion of Control,IoC),有木有,是不是很難懂。
Spring推薦面向接口編程,更好地讓規范和實現分離,寫代碼會更愉快……好有道理的樣子,好吧,我會試試的!!!
下面的示例是注入一個復雜屬性,就是將一個配置好的bean作為另一個bean的屬性:
src/cn/edu/cqupt/MySpring/bean/Axe.java package cn.edu.cqupt.MySpring.bean; /**斧子,六級沒過,原諒我不認識這個單詞*/ public interface Axe {public String chop(); } src/cn/edu/cqupt/MySpring/bean/impl/StoneAxe.java package cn.edu.cqupt.MySpring.bean.impl; import cn.edu.cqupt.MySpring.bean.Axe; public class StoneAxe implements Axe {@Overridepublic String chop() {return "石斧...";} } src/cn/edu/cqupt/MySpring/bean/impl/Person.java(setter、getter都刪掉羅) package cn.edu.cqupt.MySpring.bean.impl; import cn.edu.cqupt.MySpring.bean.Axe; public class Person {private String name;private int age;private Axe axe;public String toString(){return "Name:"+this.name+",age:"+this.age;} } src/beans.xml(部分代碼) <?xml version="1.0" encoding="utf-8"?><bean id="person" class="cn.edu.cqupt.MySpring.bean.impl.Person"><property name="name" value="xiaofeig"/><property name="age" value="20"/><property name="axe" ref="stoneAxe"/> </bean> <bean id="stoneAxe" class="cn.edu.cqupt.MySpring.bean.impl.StoneAxe"/> src/cn/edu/cqupt/MyString/test/TestMain.java package cn.edu.cqupt.MySpring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.edu.cqupt.MySpring.bean.Axe; import cn.edu.cqupt.MySpring.bean.impl.Person; public class TestMain {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");Person person=context.getBean("person",Person.class);Axe axe=person.getAxe();System.out.println(axe.chop());} } 打印結果:石斧...看這句<property name="axe" ref="stoneAxe"/>,axe表示Person的屬性,stoneAxe是我們配置的是一個實例的編號,通過ref這個標簽屬性,我們就可以輕松地將stoneAxe實例注入到Person的屬性中,看起來是不是也很easy。我看書到537頁的時候,覺得最重要的一點就是依賴注入通過配置的方式將Bean實例之間代碼層次的耦合分離了出來,我們可以清晰地透過xml文件觀察到Bean實例之間的依賴關系。
書上原話總結了Spring IoC容器的3個基本要點:
- 面向接口編程可以將各組件之間的耦合提升到接口層次,從而有利項目后期的擴展
- 應用程度的各組件不再有程序主動產生,而是有Spring容器來負責產生、并初始化
- Spring采用配置文件、或Annotation(注解,書后面會有提到,不過我總是用不來,新事物的自然抵觸)來管理Bean的實現類、依賴關系,Spring容器通過配置文件利用反射來創建實例(所謂的依賴注入)
可以看出,上面寫的Demo都是Spring容器利用setter方法來為實例注入屬性值的,其實,我們也可以讓容器利用有參構造方法來直接創建一個實例,這就是書上提到的構造注入。
src/cn/edu/cqupt/MySpring/bean/impl/Person.java(setter、getter都刪掉羅) package cn.edu.cqupt.MySpring.bean.impl; import cn.edu.cqupt.MySpring.bean.Axe; public class Person {private String name;private int age;private Axe axe;public Person(){}public Person(String name,int age,Axe axe){this.name=name;this.age=age;this.axe=axe;}public String toString(){return "Name:"+this.name+",age:"+this.age;} } src/beans.xml <?xml version="1.0" encoding="utf-8"?> <bean id="person" class="cn.edu.cqupt.MySpring.bean.impl.Person"><constructor-arg value="xiaofeig"/><constructor-arg value="20"/><constructor-arg ref="stoneAxe"/> </bean> <bean id="stoneAxe" class="cn.edu.cqupt.MySpring.bean.impl.StoneAxe"/> src/cn/edu/cqupt/MySpring/test/TestMain.java package cn.edu.cqupt.MySpring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.edu.cqupt.MySpring.bean.impl.Person; public class TestMain {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");Person person=context.getBean("person",Person.class);System.out.println(person);System.out.println(person.getAxe().chop());} } 打印結果: Name:xiaofeig,age:20 石斧...標簽<constructor-arg/>就是用來構造注入的哦,標簽的順序就是構造參數的順序,上面的實例比較簡單,Person類只有一個有參構造方法,第二個屬性在注入的時候直接將”20”轉換成了整型,現在來假想一種情況,如果Person類還有一個構造方法,如:
打印結果: Name:xiaofeig,age:0 石斧...
是不是秒懂啊,Spring容器會優先考慮上面的那個構造方法,如果我們想讓Spring容器先調用含int age的構造方法,可以設置標簽property的屬性type值為’int’。
<constructor-arg value="20" type="int"/> hint: specify index/type/name arguments for simple parameters to avoid type ambiguities好了,簡單地了解了這兩種構造方法,設值注入和構造注入,個人還是比較喜歡設值注入啦。
轉載于:https://www.cnblogs.com/fei-er-blog/p/4741892.html
總結
 
                            
                        - 上一篇: 如何解决Mybatis里mapper文件
- 下一篇: linux+加载迅雷插件,linux下使
