Spring-依赖注入的实现(四)

Dependency Injection:

Spring的核心机制是依赖注入。依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。

下面写demo进行简单的实现:

创建包:com.xuli.spring.dao 在其中写接口UserDao:

package com.xuli.spring.dao;

public interface UserDao {
           void show();
}

另外在写MySQLimpl  Oracleimpl 两个类实现UserDao接口:

package com.xuli.spring.dao;

public class MySQLimpl implements UserDao{

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("这里是mysql的实现接口");
	}

}
package com.xuli.spring.dao;

public class Oracleimpl implements UserDao {

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("这里是oracle实现的接口");
	}

}

创建包 : com.xuli.spring. service 中写接口UserService :

package com.xuli.spring.service;

public interface UserService {
    void show();
}

写实现UserService 接口类:UserServiceimpl :

package com.xuli.spring.service;

import com.xuli.spring.dao.UserDao;

public class UserServiceimpl implements UserService{
      private UserDao userDao;
	@Override
	public void show() {
		// TODO Auto-generated method stub
		userDao.show();
	}
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
    
}

在这个接口中调用了UserDao的方法userDao.show();  一般需要在之前实例化一个UserDao的对象,例如:

UserDao  userDao = new MySQLimpl();

但是这样代码的耦合度较高,为了降低耦合度我们可以在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" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
                http://www.springframework.org/schema/context 
                http://www.springframework.org/schema/context/spring-context-2.5.xsd  
               http://www.springframework.org/schema/tx 
               http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


	<!-- 使用类构造器直接实例化 --><!-- lazy-init="true"可以用来延迟初始化Bean -->
	<bean id="userBean" class="com.xuli.spring.implement.UserBean" scope="singleton" init-method="init" destroy-method="destroy"></bean>
	<!-- 使用静态工厂的方法实例化 -->
	<bean id="userBean1" class="com.xuli.spring.factory.BeanFactory"
		factory-method="UserBeanService"></bean>
	<!-- 使用实例工厂方法实例化 -->
	<bean id="factory" class="com.xuli.spring.factory.BeanFactory"></bean>
	<bean id="userBean2" factory-bean="factory" factory-method="getUserBeanService" />
	<bean id="MySQLimpl" class="com.xuli.spring.dao.MySQLimpl" />
	<bean id="Oracleimpl" class="com.xuli.spring.dao.Oracleimpl" />
	<bean id="UserService" class="com.xuli.spring.service.UserServiceimpl">
	     <!-- 根据构造方法注入 -->
		 <property name="userDao" ref="MySQLimpl"></property> 
	</bean>
</beans>

配置完毕后我们进行测试,在UserTest里写测试代码:

 //依赖注入的demo
	@Test
	public void UserTest4() {
		ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
		UserService service = (UserService) context.getBean("UserService");
		service.show();
	}

测试结果:

Spring-依赖注入的实现(四)_第1张图片

如果需要用Oracle数据,只需要修改Spring的配置文件Beans.xml : 将

 <property name="userDao" ref="MySQLimpl"></property>

改为:

                 <property name="userDao" ref="Oracleimpl"></property>

降低代码耦合度,实现简单的依赖注入。

你可能感兴趣的:(DI,IOC,依赖注入,控制反转)