Spring 依赖注入简单理解,写给对Spring完全莫不着门路的朋友。
首先需要想清楚MVC每层之间的调用关系,然后再来看Spring会感到比较容易理解了。假设我们新建一个项目:com.java.ibatis 那么对应这个项目应该有他点dao层(interface)、dao的实现层(impl)、服务层(service)、模型层/实体层(Model/Bean)
假设我们在UserDao(全类名:com.java.ibatis.dao.UserDao.java)里面定义如下接口:
int insert(UserModel user);
这个接口需要接收的类型是我们的实体层:UserModel 接收的参数是user,那么我们现在要做的就是在impl层去写DAO的实现。假设我们的impl层点全类名:com.java.ibatis.impl.UserDaoImpl.java。
那么理所当然的我们需要实现insert:
public int insert(UserModel user) {
System.out.println("User Add!");
return 0;
}
写完了Dao的实现之后我们需要做的就是写服务层:service。假设我们的service全类名是:com.java.ibatis.service.UserServie.java:
public class UserService {
private UserDao userdao;
public void add(UserModel user)
{
userdao.insert(user);
}
public UserDao getUserdao() {
return userdao;
}
public void setUserdao(UserDao userdao) {
this.userdao = userdao;
}
}
private UserDao userdao 是我们的Dao层的,写service层是为了让Dao的实现层impl变得更加灵活可变。这点也许不是那么好让人理解,假设我们在Test.java里面
UserModel user=new UserModel();
UserService service=new UserService();
service.add(user);
//或调用
service.getUserdao().insert(user);
以上二者都是调用了UserDao的insert接口的实现!让我们来看看Spring的ServiceTest类的流程吧!新建一个测试类,并引入JUnit4的支持(Myeclipse项目名build path-->add libaries-->JUnit)。UserServiceTest代码如下:
public class UserServiceTest {
public void testInsert()
{
//推荐使用ApplicationContext而不是BeanFactory官方文档内有说明。
ApplicationContext atc=new ClassPathXmlApplicationContext("beans.xml");//读取我们的配置beans.xml文件
UserService service=(UserService) atc.getBean("userService");//获取我们的配置文件里面配置Id是userService的bean。
UserModel user=new UserModel();//new个实体层
user.setUsername("admin");//设值
user.setPassword("admin888");
// service.add(user);//调用添加方法
service.getUserdao().insert(user);//调用添加方法
}
}
我们一起来看一下beans.xml:
< xml version="1.0" encoding="UTF-8" >
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-2.5.xsd">
让我来给大家解释下配置:
一个id叫userImpl的bean它对应的全路径叫com.java.ibatis.impl.UserDaoImpl.java也就是我们的Dao的实现类!下面来看下第二个bean的配置:
一个id是userImpl的全类名是:com.java.ibatis.service.UserService.java也就是我们的Service层。property name="userdao" 属性名为userdao。这里需要注意:userdao是private UserDao userdao;此处千万别写错来哦,亲。
ref="userImpl" 引用userImpl也可以理解成把我们的userImpl注入到我们的service层里面。我知道有可能有的朋友还是不理解什么叫注入?怎么就注入来呢?让我们回到service层的private UserDao userdao;还是这段代码,现在我们注入之后可以理解成这样new出来的是一个UserDao的实现UserDaoImpl。以前我们写service的时候控制权在于人而今控制权转换给了我们的容器这应该就是传说中的控制反转了吧。
Run as JUnit:如果是绿色说明测试OK,红色则需要查看下是不是哪儿写错了。正确应该打印:User impl Add!