沿着咱們上一篇的學習筆記,咱們繼續經過代碼學習IOC這一設計思想.java
6.Hello類mysql
第一步:首先建立一個類Hellospring
package cn.sxt.bean; public class Hello { private String name; public void setName(String name) { this.name = name; } public void show(){ System.out.println("hello,"+name); } }
第二步:建立配置文件beans.xmlsql
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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"> <!-- bean就是java對象,由spring容器來建立和管理 --> <bean name="hello" class="cn.sxt.bean.Hello"> <property name="name" value="張三"></property> </bean> </beans>
第三步:編寫測試類Testapache
package cn.sxt.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.sxt.bean.Hello; public class Test { public static void main(String[] args) { //解析beans.xml文件生成管理相應的bean對象 ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml"); Hello hello=(Hello)context.getBean("hello"); hello.show(); } }
咱們須要導入相關Jar包(在上一篇筆記Spring主要內容中顯示的那些核心jar包)編程
此時運行Test程序,會觸發異常:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactoryoracle
咱們須要添加commons-logging.jar文件函數
步驟總結:學習
1)導入相關jar包測試
2)編寫spring配置文件(名稱能夠自定義)
思考?
Hello對象是誰建立的?
咱們在Hello類中添加一個構造函數,能夠肯定Hello對象肯定被建立:
package cn.sxt.bean; public class Hello { public Hello() { System.out.println("hello 被建立"); } private String name; public void setName(String name) { this.name = name; } public void show(){ System.out.println("hello,"+name); } }
運行Test測試類結果顯示:
hello 被建立
hello,張三
由此能夠得知,Hello對象是由spring容器來建立的:bean工廠,能夠包含多個bean,建立不一樣類的對象
<bean name="hello" class="cn.sxt.bean.Hello"> <property name="name" value="張三"></property> </bean>
Hello對象的屬性是怎樣設置的?
Hello對象的屬性是由spring容器來設置的;
這個過程就叫作控制反轉:
控制的內容:指的是誰來控制對象的建立;傳統的應用程序,對象的建立是由程序自己來控制,使用Spring之後是由spring來建立對象的。
反轉:有反轉就有正轉,正轉指程序來建立對象,反轉指程序自己不去建立對象,而變爲被動的接收容器給咱們建立的對象
總結:之前對象是由程序自己來建立,使用spring後,程序變爲了被動接收spring建立好的對象;
控制反轉有一個別名--依賴注入(DI-dependency injection)
DI:好比在咱們的Hello類中,咱們的類Hello就依賴於name屬性,以來的這個name屬性是由spring容器來設置的,name值的設置過程就叫作依賴注入(經過setName方法進行的依賴注入)
Ioc--是一種編程思想,由主動編程變爲別動接收;
Ioc的實現是經過Ioc容器(Bean工廠)來實現的。Ioc容器--BeanFactory
在第一篇學習筆記中的UserDao和UserDaoService的例子,咱們在這裏就能夠使用spring配置文件的方式來管理對象的生命週期以及依賴對象的注入;
beanx.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- bean就是java對象,由spring容器來建立和管理 --> <bean id="mysqlDao" class="cn.sxt.dao.impl.UserDaoMySqlImpl"></bean> <bean id="oracleDao" class="cn.sxt.dao.impl.UserDaoOracleImpl"></bean> <bean id="service" class="cn.sxt.service.impl.UserServiceImpl"> <!-- ref引用對象(對象是由spring來建立的) --> <property name="userDao" ref="mysqlDao"></property> </bean> <!-- property如何設置:name="setUserDao(去除set,並將剩餘的UserDao首字母小寫)" --> </beans>
當咱們須要替換具體的實現時,就能夠直接在配置文件中進行修改,例如將ref="mysqlDao"修改成ref="oracleDao";
在測試類中咱們就能夠這樣來組織代碼:
package cn.sxt.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.sxt.service.UserService; public class Test { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml"); UserService us=(UserService)ac.getBean("service"); us.getUser(); } }
使用IOC來建立對象的方式:3種方式
1)經過無參的構造方法來建立;
User.java:
package cn.sxt.vo; public class User { public User(){ System.out.println("user的無參構造方法"); } private String name; public void setName(String name) { this.name = name; } public void show(){ System.out.println("name="+name); } }
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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="cn.sxt.vo.User"> <property name="name" value="張三"></property> </bean> </beans>
Test:
package cn.sxt.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.sxt.vo.User; public class Test { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml"); User user=(User)ac.getBean("user"); user.show(); } }
2)經過有參構造方法來建立;
User.java:
package cn.sxt.vo; public class User { private String name; public User(String name) { super(); this.name = name; } public void show(){ System.out.println("name="+name); } }
beans.xml配置(有三種狀況):
第一種:根據參數的下標(index)來設置;
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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"> <bean id="user" class="cn.sxt.vo.User"> <!-- index指的是構造方法參數下標,從0開始 --> <constructor-arg index="0" value="李四"></constructor-arg> </bean> </beans>
第二種:根據參數名稱(name)來設置;
<bean id="user" class="cn.sxt.vo.User"> <!-- name指的是屬性值 --> <constructor-arg name="name" value="王五"></constructor-arg> </bean>
第三種:根據參數類型(type)來設置;
<bean id="user" class="cn.sxt.vo.User"> <constructor-arg type="java.lang.String" value="徐六"></constructor-arg> </bean>
3)經過工廠方法來建立對象(有兩種);
第一種:靜態工廠來建立;
UserFactory.java:
package cn.sxt.factory; import cn.sxt.vo.User; public class UserFactory { public static User newInstance(String name){ return new User(name); } }
beans.xml配置:
<bean id="user" class="cn.sxt.factory.UserFactory" factory-method="newInstance"> <constructor-arg index="0" value="任七"></constructor-arg> </bean>
第二種:動態工廠來建立
UserDynamicFacory.java:
package cn.sxt.factory; import cn.sxt.vo.User; public class UserDynamicFactory { public User newInstance(String name){ return new User(name); } }
beans.xml:
<bean id="userFacotry" class="cn.sxt.factory.UserDynamicFactory"/> <bean id="user" factory-bean="userFacotry" factory-method="newInstance"> <constructor-arg index="0" value="王五"/> </bean>