1、什么是控制反转?
简而言之,就是把对象的创建权由我们之前的手动创建现在由Spring容器来处理,对象创建的控制权发生了反转,故而得名控制反转,Inversion Of Control(IOC);
2、什么叫依赖注入?
Dependency Injection是控制反转的核心,就是把我们对象之间的依赖关系交由我们Spring容器来进行管理,也就是说动态的向某个对象提供他需要的其他对象;
3、在我们实际程序中哪里使用到了我们的控制反转与依赖注入?
在以下例子中,我们创建了userDao、userService接口以及其实现类,我们都知道dao用来处理持久层,也就是操作数据库,而业务层service用来操作Dao层,所以我们写了几个方法来模拟这个过程;
public interface IuserDao {
public void findByUsernameAndPassowrd();
}
public class IuserDaoImpl implements IuserDao{
public void findByUsernameAndPassowrd() {
// TODO Auto-generated method stub
System.out.println("这里是dao层的方法");
}
}
public interface IuserService {
//因为在业务层的话一般是可以处理登录请求的,故写一个登录的方法
public void login();
}
public class UserServiceImpl implements IuserService{
//在这里我们定义一个成员变量,变量名应该对xml文件中的name相对应;
private IuserDao userDao;
//这里给他添加一个set方法
public void setUserDao(IuserDao userDao) {
this.userDao = userDao;
}
public void login() {
// TODO Auto-generated method stub
System.out.println("这里业务层service的 方法");
System.out.println("这里是通过依赖注入打印出来的方法");
//使用Spring配置方式new一个对象,IOC控制反转
//读取Applicationcontext.xml文件,获取Bean节点
// ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
// //根据ID来获取Bean,并且对其进行强转
// IuserDao userDao=(IuserDao)ac.getBean("userDao");
//然后使用这个userDao对象来调用里面的那个方法
userDao.findByUsernameAndPassowrd();
}
}
关于Service层调用Dao层对象(控制反转)
在以上代码中我们可以看到我们在业务层中调用了数据层Dao里面的方法,而我们这里没有选择直接在Service层创建对象,而是把对象的创建过程交给了我们的spring容器,也就是在我们的applicationContext.xml进行配置,在里面通过bean进行创建对象,并且这个创建对象的过程使用到了我们的java反射机制,只要提供dao接口的实现类全路径,就能创建出其dao对象,然后我们在service层使用Appplication对其进行获取,从而可使用该对象对其进行调用dao层里面的方法;
关于我们在test类中访问service对象(依赖注入)
因为我们在test方法里面需要访问service对象,故我们在applicationContext.xml中对对象进行注入;
<!-- 这里的话直接把上面那个对象进行依赖注入,也就是相当于用了set/get方法 -->
<bean id="userService" class="com.runxun.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
注意:我们这里需要使用property对userDao进行注入,这个name必须是我们在seivice层实现类中的创建的dao层对象名,并且给其添加一个set方法,通过该方法进行依赖注入之后在service实现类中我们就可以直接使用该dao对象来调用Dao层里面的方法而无须像之前一样使用applicationContext进行对象获取;