Spring中IOC的实现
2016-02-25 19:46
429 查看
IOC:简单的来讲,就是由容器控制程序之间的关系,而不是由我们手动编写由程序代码直接操控。这也就是
所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
创建项目,写Dao层接口IUserDao.java
Dao接口的实现类 UserDaoImpl.java
业务层接口IUserManager.java
业务层接口的实现UserManagerImpl.java
其实从这里就可以看出,业务层其实也是依赖了Dao层的具体实现,没有起到解耦的作用。
Client.java
客户端也还是依赖于业务层的具体实现。接下来我们使用IOC容器。
使用IOC容器很简单,就是将我们的对象放到配置文件里,让Spring知道,从而由Spring来帮我们管理。
Spring 框架的 IOC 容器采用两种方法实现:
(一)【setter方法注入】:通过 JavaBean的属性分配依赖性。
(二)【构造器注入】:依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开。
首先看setter方法注入,是IOC通过set方法将需要的对象注入。需要提供被注入对象的set方法。
重点是配置Spring的核心配置文件applicationContext.xml,在配置文件中配置上userDao的信息,使得
IOC容器自己将UserDao对象注入到UserManagerImpl中。
这样我们就可以看出,业务层里只出现了Dao层的接口,是依赖于接口,而没有依赖于真正的实现。客户端
对业务层的依赖是同样道理,可以只依赖业务层接口,通过IOC注入解决。
下面看另一种通过构造器注入。这种方法不需要提供set方法,但需要提供构造方法。看代码
配置文件也有不同:
applicationContext.xml
这两种注入方式,在客户端进行调用都是一样的。来看客户端代码:
所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
创建项目,写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"); } }
相关文章推荐
- 326. Power of Three
- java的System.getProperty()方法可以获取的值
- 263. Ugly Number
- [工作]双核系统struts-config.xml
- Java Modbus CRC16校验
- java 堆和栈的区别
- 【JavaWeb Structs2学习】Struts2_标签,property、iterator
- Java并发-类库新组件 - CountDownLatch 理解
- 开源 免费 java CMS - FreeCMS2.1 会员站内信
- Eclipse中java文件生成jar文件的方法
- 阿里云服务器云数据库免费体验(Java Web详细实例)
- 阿里云服务器云数据库免费体验(Java Web详细实例)
- 阿里云服务器云数据库免费体验(Java Web详细实例)
- 阿里云服务器云数据库免费体验(Java Web详细实例)
- 整数转换成罗马数字java实现
- Spring 4.2.4.RELEASE MVC 学习笔记 - 4 - FreeMarker(咋个办呢 zgbn)
- JAVA设计模式--工厂方法模式
- 【JAVA知识】反射和注解(1)
- JAVA_接口演示_InterfaceDeamo.java____接口(interface)、默认(default)
- JAVA_接口演示_InterfaceDeamo.java____接口(interface)、默认(default)