天天看點

關于IOC與DI的學習心得

一.IOC的概念

對于IOC通俗易懂來說,就是對一個控制對象進行建立,主要為了降低耦合度,提高代碼的複用性,在開發中有兩種方法可以來實作IOC的控制反轉。
(一)在applicationContext.xml中進行對象的聲明與建立
           
<bean id="userServiceId" class="spring_1.UserServiceImpl"></bean>
	<bean id="bookDaoId" class="spring_1.BookDaoImpl"></bean>
           
此代碼便是對于兩個對象建立的聲明,其中id是對于他聲明的代名詞,class中代表的便是他的實作類。
此時便可以通過通過以下代碼随意調用其中一個實作類中的任意方法
           
public class TestIoC {
    @Test
    public void demo1(){
//        //從spring容器獲得
//        //1獲得容器
//        String xmlPath="spring_1/applicationContext.xml";
//        ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
//        //2獲得内容---不需要自己new,都是從sping容器獲得
//        spring_ioc_UserService userService=(UserServiceImpl)applicationContext.getBean("userServiceId");
//        userService.addUser();


        String xmlpath="spring_1/beans.xml";
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlpath);

        di_BookService di_bookService=(di_BookService) applicationContext.getBean("bookServiceId");
        di_bookService.addBook();
    }
}

           

此時所顯示的便是把控制權交給了外部容器。

(二)但在日常開發中常常會使用基于注解的形式開發并代替在applicationContext.xml對于對象的聲明。

@Component(“id”)

在你所建立的對象上方加入這行代碼便會等效上面所配置的實作聲明與建立。

而在WEB開發中,常常會有對相應子產品的聲明,使其更明顯的代表所對應的子產品發開,但注意的是需要在applicationContext.xml中進行掃描,并進行命名空間檔案的添加來實作這種功能。

@Repository:便是對dao層裡面的建立對象功能進行聲明。

@Controller:便是對web開發層裡面建立的對象進行聲明。

@Service:便是對service邏輯處理層裡面建立對象進行聲明。

二.DI的概念

DI簡單來說就是對于依賴的注入,簡單來說就是在另一個對象中,通過對其進行依賴注入可達到調用注入實體的方法。
其中有兩種方式進行注入------------------>1.基于xml完成依賴注入。2.基于注解完成依賴注入
(一)基于xml完成依賴注入
           
<bean id="bookServiceId" class="spring_1.di_BookServiceImpl">
		<property name="bookDao" ref="bookDaoId"></property>
	</bean>

           

此時便形成了最簡單的注入,但并不能實作完整的依賴注入,還需要在所需注入的實作類中加入以下私有 靜态變量和setter方法進行完備或者直接接口=實作類的方式。

方式一:之前,接口=實作類
    private spring_di_BookDao bookDao=new BookDaoImpl();
 方式二:接口+setter方法
    private spring_di_BookDao bookDao;

    public void setBookDao(spring_di_BookDao bookDao) {
        this.bookDao = bookDao;
    }

           

此時便可以直接在實作類中調用其BookDao實作類中的方法,當進行測試時,當你調用目标實作類的時候便可以直接調用目标類中的依賴注入。

(二)基于注解方式的注入

這種方式的最大優點就是省去了在xml的配置的,但注意的是需要在applicationContext.xml中進行掃描,并進行命名空間檔案的添加來實作這種功能。

而依賴注入的有三種方式進行注入

當目标為普通值:@Value(" ")

當目标為y引用值:1.按照類型注入@Autowired

2.按照名稱注入@[email protected](“名稱”)

3.按照名稱注入@Resource(“名稱”)

三.對于IOC和DI注入的擴充

(一)對于IOC執行個體bean共有三種方式:預設構造,靜态工廠,執行個體工廠

預設構造的方式

可以在applicationContext.xml檔案中添加如下代碼直接添加即可

<bean id="userId" class="spring_4.User">
		<constructor-arg type="java.lang.String" value="jack"></constructor-arg>
		<constructor-arg type="java.lang.Integer" value="18"></constructor-arg>
	</bean>
           

靜态工廠

在目标實作類中可以建立一個靜态方法

//    public static spring_ioc_UserService CreateService(){
//        return new UserServiceImpl();
//    }
           

并在applicationContext.xml中進行聲明

執行個體工廠(和靜态工廠的實作方法大同小異)

但注意的是在實作類中聲明方法的時候不需要加static,而在applicationContext.xml中需要加入新bean

<!--建立工廠執行個體-->
	<bean id="myBeanFactory" class="spring_2.裝配Bean_基于XML_day1"></bean>
	<!--獲得userService-->
	<bean id="userServiceId" factory-bean="myBeanFactory" factory-method="CreateService"></bean>
           

此時便可以通過直接調用方法實作執行個體的建立

<!--建立工廠執行個體-->
	<bean id="myBeanFactory" class="spring_2.裝配Bean_基于XML_day1"></bean>
	<!--獲得userService-->
	<bean id="userServiceId" factory-bean="myBeanFactory" factory-method="CreateService"></bean>
           

(二)對于注入還可以是

數組:

<array>

List:

<list>

Set:

<set>

Map:

<map>

Properties:

<props>

直接可以通過在applicationContext.xml檔案中實作集合注入

<bean id="CollDataid" class="spring_4.集合注入.CollData">
		<property name="arrayData">
			<array><value></value></array>
		</property>
		<property name="mapData">
			<map>
				<entry>
					<key></key>
					<value></value>
				</entry>
			</map>
		</property>
		<property name="props">
			<props>
				<prop key=""></prop>
			</props>
		</property>
	</bean>
           

以上便是部分注入的代碼示例。

繼續閱讀