2.HelloSpring 思考問題? Hello對象是誰創建的? Hello對象是由Spring設置的 Hello 對象的屬性是怎麼設置的? Hello 對象的屬性是Spring容器設置的 這個過程就叫控制反轉 控制:誰來控制對象的創建,傳統應用程式的對象是由程式本身控制創建的,使用Spring後 ...
2.HelloSpring
思考問題?
-
Hello對象是誰創建的?
Hello對象是由Spring設置的
-
Hello 對象的屬性是怎麼設置的?
Hello 對象的屬性是Spring容器設置的
這個過程就叫控制反轉
控制:誰來控制對象的創建,傳統應用程式的對象是由程式本身控制創建的,使用Spring後,對象是由Spring來創建的。
反轉:程式本身不創建對象,而變成被動的接受對象。
依賴註入:就是利用set方法來進行註入的。
IOC是一種編程思想,由主動的編程變成被動的接收。
可以通過ClassPathXmlApplicationContext去瀏覽一下底層源碼。
OK,到了現在,我們徹底不用再回程式中改動了,要是現任不同的操作,只需要再xml配置文件中進行修改,所謂的IOC,一句話搞定:對象由Spring來創建,管理,裝配!
1、由項目一一探究
-
創建了一下新的maven包:spring-02-hellospring
-
在main的java創建一個Hellojavaclass文件
package com.jan.pojo; public class Hello { //很簡單的實體類 private String str; public String getStr(){ return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }
-
-
resources
-
創建beans.xml FIeld
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!--使用spring來創建對象,在spring中這些都稱為Bean 類型 變數名 = new 類型(); Hello hello = new Hello id=變數名 class = new 的對象 property 相當於給對象中的屬性設置一個值! -->852 <bean id="hello" class="com.jan.pojo.Hello"> <property name="str" value="Sprin+g"> </property> </bean> </beans>
-
-
test的java
-
創建名為 MyTest 的 javaclass
import com.jan.pojo.Hello; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { public static void main(String[] args) { //獲取spring的上下文對象! ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //我們的對象現在都在Spring中管理了,我們要使用直接去裡面取出來就可以了! // context.getBean("hello")-- Hello hello = context.getBean("hello") Hello hello = (Hello) context.getBean("hello"); System.out.println(hello.toString()); } }
-
2、項目二:Spring開始的maven 進行控制反轉
-
所有的UserDao、UserDaoImpl、UserDaoMysqlImpl、UserDaoOracleImpl、UserDaoSqlserverImpl、UserService、UserServiceImpl均無變化
-
配置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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="mysqlImpl" class="com.jan.dao.UserDaoMysqlImpl"/> <bean id="oracleImpl" class="com.jan.dao.UserDaoOracleImpl"/> <bean id="sqlserverImpl" class="com.jan.dao.UserDaoSqlserverImpl"/> <bean id="UserServiceImpl" class="com.jan.dao.service.UserServiceImpl"> <!-- ref : 引用spring容器中創建好的對象 value : 具體的值,基本數據類型! --> <property name="userDao" ref="sqlserverImpl"></property> <!-- 只需修改 ref 裡面的值就可以了 <property name="userDao" ref="mysqlImpl"></property> --> </bean> </beans>
-
MyTest 的修改
import com.jan.dao.UserDaoImpl; import com.jan.dao.UserDaoSqlserverImpl; import com.jan.dao.service.UserService; import com.jan.dao.service.UserServiceImpl; import com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { public static void main(String[] args) { /* 原來之前的調用 UserService userService = new UserServiceImpl(); 用戶實際調用的是業務層,dao層它們不需要接觸! ((UserServiceImpl) userService).setUserDao(new UserDaoImpl());//userService.setUserDao userService.getUser(); */ //去獲取ApplicationContext:拿到Spring的容器 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //容器在手,天下我有,就直接get誰! UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("UserServiceImpl"); userServiceImpl.getUser(); } }