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(); }
测试结果:
如果需要用Oracle数据,只需要修改Spring的配置文件Beans.xml : 将
<property name="userDao" ref="MySQLimpl"></property>
改为:
<property name="userDao" ref="Oracleimpl"></property>
降低代码耦合度,实现简单的依赖注入。