IoC即控制反转,简单说就是由容器控制程序之间的关系,而非传统中的由代码直接控制。控制权由应用代码转到了外部容器,控制权的转移即为反转。IoC也称为依赖注入,即由容器动态的将某种依赖关系注入到组件中。
在开发过程中,我们常常遇到一个类中调用另一个类的情况,传统的做法是在使用者内部创建一个被调用类的对象,即new Object()的方式,这样对象始终和其他的类或者接口耦合。
IoC如何做呢?类似于我们通过中介租房,在我们和房东之间引入第三者:房产中介(容器)。房产中介有很多房屋信息,我们可以向房产中介提出一个列表,告之需要的房屋信息,比如一室一厅,价格500元以内,房东要为女性等。然后房产中介按照我们要求提供一个房东,我们只需要和房东谈租房问题了。如果房屋中介给我们找的房东不符合要求,我们就抛出异常。整个过程由房产中介这样一个容器来控制。
Spring的开发方式如上所述,所有的类都会在Spring容器中登记,告诉Spring你是什么,你需要什么,然后Spring会在系统运行到适当的时候,把你要的东西主动交给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由Spring来控制,也就是说控制对象生存周期内不再是引用它的对象,而是Spring。对应某个具体的对象而言,以前他控制其他对象,现在所有对象被Spring控制。
1、 创建一个类UserBean.java。该类将被另一个类所调用。
package com.bean;
public class UserBean { private String username; private int userage; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getUserage() { return userage; } public void setUserage(int userage) { this.userage = userage; } } |
2、 创建一个服务接口UserService.java
package com.service;
public interface UserService { public void addUser(); } |
3、 创建接口的实现UserServiceImpl.java。该类引用UserBean.java类
package com.service.impl;
import com.bean.UserBean; import com.service.UserService;
public class UserServiceImpl implements UserService {
private UserBean user; private int num;
public int getNum() { return num; }
public void setNum(int num) { this.num = num; }
public UserBean getUser() { return user; }
public void setUser(UserBean user) { this.user = user; }
public void addUser() { System.out.println("添加第"+this.getNum()+"个用户:"); System.out.println("添加的用户姓名"+user.getUsername()); System.out.println("添加的用户年龄"+user.getUserage()); }
} |
4、 编写配置文件applicationContext.xml.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" 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-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> <!-- 配置UserBean --> <bean id="userbean" class="com.bean.UserBean"> <property name="username" value="laopeng" /> <property name="userage" value="27" /> </bean> <bean id="userService" class="com.service.impl.UserServiceImpl"> <property name="num" value="1" /> <!-- 该处user为UserServiceImpl中的属性 --> <property name="user"> <!-- userbean与前面配置的UserBean里的id一致 --> <ref bean="userbean"/> </property> </bean> </beans> |
5、 编写测试文件Test.java
package com.test;
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.service.UserService;
public class Test { public static void main(String[] args) { ApplicationContext context = null; context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService)context.getBean("userService"); userService.addUser(); } } |
6、 运行结果:
添加第1个用户: 添加的用户姓名laopeng 添加的用户年龄27 |