注:本人理解可能不够到位,代码内容也不完整,bean的实现是比较早期的方式,现在有注解的方式用来实现,不需要xml配置,本文的目的主要是为了自己记笔记。。。。
spring之DI
IOC容器负责了对象的初始化和管理等工作,但是在案例演示中业务层对象的创建需要用到数据层的对象,为了降低业务层和数据层的耦合度,应该避免使用new关键字创建对象。spring为了解决这个问题,实现了IOC容器,通过容器来管理对象的创建等工作,但是对于不同对象的依赖关系还是不能处理,这需要用到spring的另一个核心思想,DI(依赖注入)。
问题演示
首先回顾一下业务层和数据层的依赖情况
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao{
public void save(){
System.out.println("book dao save...");
}
}
public interface BookService{
public void save();
}
public class BookServiceImpl implements BookService{
private BookDao bookDao = new BookDaoImpl();
public void save(){
System.out.println("book service save...");
bookDao.save();
}
}
可以看到案例中的BookService使用了new创建bookDao,为了解决上述问题,spring提供了一套方案。
案例演示
为了去掉上面的new关键字,让spring自动的在创建BookService时要首先创建一个BookDao,我们需要告诉springBookService是依赖于BookDao的,这个通知的方式可以通过xml文件配置的方式实现。
首先在BookService实现类中提供set方法
public class BookServiceImpl implements BookService{
private BookDao bookDao;
public void save(){
System.out.println("book service save...");
bookDao.save();
}
public void setBookDao(BookDao bookDao){
this.bookDao = bookDao;
}
}
然后在xml中通知spring依赖关系
..........
<bean id="bookDao" class="com.xxx.xxx.xxx.BookDaoImpl"/>
<bean id="bookService" class="com.xxx.xxx.xxx.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
..........
name是通知spring将name大写第一个字母然后加上set去找对应的方法,ref是通知spring去找id为bookDao的bean进行注入。
注:本人理解可能不够到位,代码内容也不完整,bean的实现是比较早期的方式,现在有注解的方式用来实现,不需要xml配置,本文的目的主要是为了自己记笔记。。。。