前情提要
DI
- 依賴注入,是控制反轉的實現方式;
- 依賴:兩個或多個對象之間的關係
public class A {
public B b;
}
- 以上可以看出,A類依賴(需要)B類,當A類實例化對象和運行時,如果需要B類的實例對象,IoC容器會主動創建一個B對象注入到A對象所需要的地方,A對象獲得依賴B對象的過程,由主動行爲變成了被動行爲,即把創建對象交給了IoC容器處理,控制權顛倒過來了,這就是控制反轉的由來!
實現方式
public class B {
}
new方式
public class A {
public B b = new B();
}
setter方式
public class A {
public B b;
public void setB (B b) {
this.b= b;
}
}
項目目錄
項目代碼
配置文件xml
常用名稱:applicationContext.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 -->
<bean id="UserService" class="com.zhangzibu.spring.ioc.service.impl.UserServiceDi">
<property name="userDao" ref="UserDao" ></property>
</bean>
<bean id="UserDao" class="com.zhangzibu.spring.ioc.dao.impl.UserDaoImpl"></bean>
</beans>
- <bean id=“UserService” …>:配置bean
- <bean id=“UserDao” …>:配置bean
- <property>:用於進行屬性注入,相當於setter方法
- name:bean的屬性名,即UserServiceDi實現類裏的userDao對象
- ref:另一個bean的id值的引用,即xml中的<bean id=“UserDao” …>
Java代碼
dao層
接口
package com.zhangzibu.spring.ioc.dao;
public interface UserDao {
void save(String para);
}
實現類
package com.zhangzibu.spring.ioc.dao.impl;
import com.zhangzibu.spring.ioc.dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public void save(String para) {
System.out.println("Save " + para);
}
}
service層
接口
package com.zhangzibu.spring.ioc.service;
public interface UserService {
void save(String para);
}
實現類
New方式
package com.zhangzibu.spring.ioc.service.impl;
import com.zhangzibu.spring.ioc.dao.UserDao;
import com.zhangzibu.spring.ioc.dao.impl.UserDaoImpl;
import com.zhangzibu.spring.ioc.service.UserService;
public class UserServiceNew implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void save(String para) {
this.userDao.save(para);
}
}
DI方式
package com.zhangzibu.spring.ioc.service.impl;
import com.zhangzibu.spring.ioc.dao.UserDao;
import com.zhangzibu.spring.ioc.dao.impl.UserDaoImpl;
import com.zhangzibu.spring.ioc.service.UserService;
public class UserServiceDi implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save(String para) {
this.userDao.save(para);
}
}
測試類
package com.zhangzibu.spring;
import com.zhangzibu.spring.ioc.service.UserService;
import com.zhangzibu.spring.ioc.service.impl.UserServiceDi;
import com.zhangzibu.spring.ioc.service.impl.UserServiceNew;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
/**
* DI-XML配置
*/
@Test
public void testDi(){
// 1,new方式
UserService userServiceNew = new UserServiceNew();
userServiceNew.save("New 張子布");
// 2,DI方式
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml");
UserService userServiceDi = (UserService) applicationContext.getBean("UserService");
userServiceDi.save("DI 張子布");
}
}
結果
Save New 張子布
Save DI 張子布