淺析 Spring IoC - 注入方式

1. IoC 容器的概念java

    IoC 容器指 具備依賴注入功能的容器,IoC 容器負責實例化、定位、配置應用程序中的對象及創建這些對象間的依賴。應用程序無需直接在代碼中 new 相關對象,而是由 IoC 容器進行組裝。在Spring 中 BeanFactory 是 IoC 容器的實際表明者。
spring

    Spring IoC 容器經過讀取配置文件中配置元數據,經過元數據對用中的各個對象進行實例化及裝配。通常使用基於 xml 配置文件進行配置元數據,並且 spring 與 配置文件 徹底解耦,可使用其餘方式進行配置元數據,好比 註解、基於 Java 文件的、基於屬性文件的配置。。
ide

2. Bean 的概念
this

    由 IoC 容器管理的那些 對象稱之爲 Bean,Bean 就是由 Spring 容器初始化、裝配及管理的對象,除此以外,bean 與應用程序中其餘對象沒有什麼區別了。
spa

3. 下面咱們搭建一個項目來演示一下Spring IoC 的基本使用code

(環境 JDK 1.7.0_79,Eclipse 以及 spring 4.2.2 release,注意:該版本spring 只支持 JDK 1.6+xml

(下載地址:http://repo.spring.io/release/org/springframework/spring/))對象

使用 Eclipse 新建 Java project,命名爲 Spring_IOC,同時import spring的 jar 包。接口

  

    User.javaip

public class User {
	private int userId;
	private String username;// 用戶姓名
	private String sex;// 性別
	private Date birthday;// 出生日期
	private String address;// 地址
	private String detail;// 詳細信息
	private Float score;// 成績
	
	//getter() and setter()...
}

    UserService.java

public interface UserService {
	public void addUser(User user);
}

    UserServiceImpl.java

public class UserServiceImpl implements UserService {

	private UserDAO userDAO;
	
	public UserDAO getUserDAO() {
		return userDAO;
	}
	
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	@Override
	public void addUser(User user) {
		this.userDAO.saveUser(user);
	}
}

    UserDAO.java

public interface UserDAO {
	public void saveUser(User user);
}

    UserDAOImpl.java

public class UserDAOImpl implements UserDAO {

	@Override
	public void saveUser(User user) {
		System.out.println("save user to Database");
	}
}

    UserServiceTest.java (Junit test case)

public class UserServiceTest {

	@Before
	public void setUp() throws Exception {
	}

	@Test
	public void testAddUser() throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		
		UserServiceImpl service = (UserServiceImpl) ctx.getBean("userService");
		
		User user = new User();
		user.setUsername("Olive");
		service.addUser(user);
	}
}

    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="userDAO" class="com.dao.impl.UserDAOImpl" />

    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO" />
    </bean>
</beans>

4. 注入方式

    OK,Demo搭建起來了,下面講一下 IoC 容器的幾種注入方式:接口注入、構造方法、setter方法注入(前二者用的比較少)。

    (1)構造方法注入:

    首先,在依賴對象(UserServiceImpl)中構建顯式的構造方法,構造方法包含 被依賴對象(UserDAOImpl)。在配置文件(beans.xml)中配置好 userDAOImpl 和 UserDAOImpl,以下:

    在 UserServiceImpl 中添加構造方法:

//constructor
public UserServiceImpl(UserDAO userDAO) {
	super();
	this.userDAO = userDAO;
}

    修改配置文件:

<?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="userDAO" class="com.dao.impl.UserDAOImpl" />

    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <!-- <property name="userDAO" ref="userDAO" /> -->
        
        <!-- constructor -->
        <constructor-arg>
        	<ref bean="userDAO"/>
        </constructor-arg>
    </bean>
</beans>

    (2)setter 方法注入:

    要求在依賴對象(UserServiceImpl)中提供被依賴對象(UserDAOImpl)的setter() 方法,then 在配置文件 <bean><property /></bean> property中配置被依賴對象。

public class UserServiceImpl implements UserService {

	private UserDAO userDAO;
	
	public UserDAO getUserDAO() {
		return userDAO;
	}
	
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	//constructor
//	public UserServiceImpl(UserDAO userDAO) {
//		super();
//		this.userDAO = userDAO;
//	}

	@Override
	public void addUser(User user) {
		this.userDAO.saveUser(user);
	}
}
<?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="userDAO" class="com.dao.impl.UserDAOImpl" />

    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO" />
        
        <!-- constructor -->
        <!-- <constructor-arg>
        	<ref bean="userDAO"/>
        </constructor-arg> -->
    </bean>
</beans>

    (3)接口注入:因爲筆者本身也不太清楚,先暫時空着,待之後弄清楚後補充

相關文章
相關標籤/搜索