您的位置:首页 > 编程语言 > Java开发

Spring中IOC的实现

2016-02-25 19:46 429 查看
IOC:简单的来讲,就是由容器控制程序之间的关系,而不是由我们手动编写由程序代码直接操控。这也就是

所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

创建项目,写Dao层接口IUserDao.java

public interface IUserDao {
public void InsertUser(String username,String password);
}


Dao接口的实现类 UserDaoImpl.java

public  class  UserDaoImpl  implements  IUserDao{
@Override
public void InsertUser(String username, String password){
System.out.println("----UserDaoImpl --addUser----");
}
}


业务层接口IUserManager.java

public interface IUserManager {
public void addUser(String username,String password);
}


业务层接口的实现UserManagerImpl.java

public class UserManagerImpl implements IUserManager {
private IUserDao  userDao;
@Override
public void addUser(String username, String password) {
userDao=new IUserDaoImpl();
userDao.InsertUser(username,password);
}
}


其实从这里就可以看出,业务层其实也是依赖了Dao层的具体实现,没有起到解耦的作用。

Client.java

public classClient {
public static void main(String[] args) {
IUserManager usermanager=new UserManagerImpl();
userManager.addUser("wanghuan","password");
}
}


客户端也还是依赖于业务层的具体实现。接下来我们使用IOC容器。

使用IOC容器很简单,就是将我们的对象放到配置文件里,让Spring知道,从而由Spring来帮我们管理。

Spring 框架的 IOC 容器采用两种方法实现:

(一)【setter方法注入】:通过 JavaBean的属性分配依赖性。

(二)【构造器注入】:依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开。

首先看setter方法注入,是IOC通过set方法将需要的对象注入。需要提供被注入对象的set方法。

Public  class  UserManagerImpl  implements  IUserManager {

private  IUserDao  userDao;

//set方法

public void  setUserDao(IUserDao  userDao) {

this.userDao = userDao;

}

@Override

public void addUser(String username, String password) {

//不需要实例化,直接可以使用

userDao.InsertUser(username,password);

}

}


重点是配置Spring的核心配置文件applicationContext.xml,在配置文件中配置上userDao的信息,使得

IOC容器自己将UserDao对象注入到UserManagerImpl中。

<bean id="userManager"  class="UserManagerImpl" >
<!—property代表是通过set方法注入,ref的值表示注入的内容-->
<property  name="userDao"  ref="userDao"/>
</bean>
<bean id="userDao"  class="UserDaoImpl"/>
</beans>


这样我们就可以看出,业务层里只出现了Dao层的接口,是依赖于接口,而没有依赖于真正的实现。客户端

对业务层的依赖是同样道理,可以只依赖业务层接口,通过IOC注入解决。

下面看另一种通过构造器注入。这种方法不需要提供set方法,但需要提供构造方法。看代码

Public  class  UserManagerImpl  implements  UserManager {
private  IUserDao  userDao;
//构造函数
public  UserManagerImpl(IUserDao  userDao) {
this.userDao = userDao;
}
@Override
public void addUser(String username, String password) {
userDao.InsertUser(username,password);
}
}


配置文件也有不同:

applicationContext.xml

<bean id="userManager" class="UserManagerImpl" >
<!—constructor-arg代表是通过构造函数注入,ref的值表示注入的内容-->
<constructor-arg  ref="userDao "/>
</bean>
<bean id="userDao" class="UserDaoImpl"/>
</beans>


这两种注入方式,在客户端进行调用都是一样的。来看客户端代码:

public  class  Client{
public staticvoidmain(String[] args) {
/*这句话就不用出现了
IUserManager  usermanager=new UserManagerImpl();
*/
//使用Spring的工厂将ioc容器中的对象取出
BeanFactory factory=newClassPathXmlApplicationContext("applicationContext.xml");
//依赖于接口,不会出现具体实现
IUserManager userManager=(IUserManager)factory.getBean("userManager");
userManager.addUser("wanghuan", "password");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: