首页 新闻 会员 周边

刚开始学习spring 有个小问题 希望能得到高人指点

0
[待解决问题]

​下面这几段代码中有一个地方不是很理解,希望能得到指点

UserServiceTest.java

@Test  public void testAdd() throws Exception {   ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");   UserService service = (UserService)ctx.getBean("userService");   User u = new User();   u.setUsername("zhangsan");   u.setPassword("zhangsan");   service.add(u);  }

}

 

beanx.xml

<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl">   </bean>           <bean id="userService" class="com.bjsxt.service.UserService">            <property name="userDAO" ref="u" />   </bean>

 

 UserService.java

public class UserService {  private UserDAO userDAO; 

 public void add(User user) {   userDAO.save(user);  }  public UserDAO getUserDAO() {   return userDAO;  }  public void setUserDAO(UserDAO userDAO) {   this.userDAO = userDAO;  } }

 

UserDAO.java

public interface UserDAO {  public void save(User user); }

 

UserDAOImpl.java

public class UserDAOImpl implements UserDAO {

 public void save(User user) {   System.out.println("user saved!");  }

}

 

运行UserServiceTest,输出的结果是user saved

 

在beans.xml中,是将UserDAOImpl的实例对象传给UserService类中setUserDAO(UserDAO userDAO)方法的,但为什么这里面接收参数的类型是UserDAO而不是UserDAOImpl类型呢?

 

我知道UserDAO是一个接口,UserDAOImpl是一个实现UserDAO接口的类,这个是不是就是多态呢,我在这个地方不是很明白。是不是UserDAOImpl对象自动提升为UserDAO类型了呢?在UserService类中的add(User user)方法中的userDAO.save(user);调用的是父类的save方法还是实现类的save方法呢,如果是实现类的save方法,那又是为什么呢

 

在这里找了好多的材料也没有能明白,真的指望好心人能帮助一下

冰山上的绿叶的主页 冰山上的绿叶 | 菜鸟二级 | 园豆:202
提问于:2013-05-29 09:54
< >
分享
所有回答(1)
1

在这里,要引入代理对象和真实对象,接口就属于代理对象,而实现类是真实对象,在service中,将userdao接口注入其中,之所以这样做,是因为事务控制。

userDao.save(user);调用的是实现类的save方法

狂奔的程序猿 | 园豆:244 (菜鸟二级) | 2013-05-30 09:32

原来如此 谢谢你的解答

支持(0) 反对(0) 冰山上的绿叶 | 园豆:202 (菜鸟二级) | 2013-05-30 20:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册