bean.xml<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
  <bean id="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
  </bean>
  <bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl">
  </bean>

  <bean id="userService" class="com.bjsxt.service.UserService" >
  
  </bean>
  </beans>
UserDAO.javapackage com.bjsxt.dao;
import com.bjsxt.model.User;
public interface UserDAO {
public void save(User user);
}UserDAOImpl.javapackage com.bjsxt.dao.impl;import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
public class UserDAOImpl implements UserDAO { public void save(User user) {
//Hibernate
//JDBC
//XML
//NetWork
System.out.println("user saved!");
}}User.javapackage com.bjsxt.model;public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}UserService.javapackage com.bjsxt.service;
import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;public class UserService {

private UserDAO userDAO;  

public void init() {
System.out.println("init");
}

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

@Resource
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
System.out.println(1);
}

public void destroy() {
System.out.println("destroy");
}
}Test类
UserServiceTest.javapackage com.bjsxt.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.bjsxt.model.User;//Dependency Injection
//Inverse of Control
public class UserServiceTest { @Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");


UserService service = (UserService)ctx.getBean("userService");
service.add(new User());

ctx.destroy();

}}请问大神,ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService)ctx.getBean("userService");
找到id="userService"的bean,接着是调用UserService的setUserDAO();最后它是怎么调用UserDAOImpl的save()的呢?

解决方案 »

  1.   

    你上面在UserService不是已经通过注解的方式注入了id名称为userDAO的对象吗,而你id名称为userDAO对应的类不就是UserDAOImpl吗,当你调用userDao.save()方法时就会调用具体实现类UserDAOImpl中的save方法这就是多态了。如果你是想问他是怎么注入的,你这边用的是@Resoure的注解,它首先是通过属性名称去bean.xml文件中找对应的id和她相同的bean让后注入进去,(当然这里不是指UserDAO userDAO)中的userDAO,而是指set方法对应的名称例如setABC()它就会去找id为aBC对应的bean,底层它就是通过反射注入进去的,如果通过set方法名称去找找不到的话,它还会去根据UserDAO的类型去找,所以你可以不用将@Resoure放到方法上注释,
    直接在属性上注释就可以了,少了写set方法的麻烦@Resoure UserDAO userDAO;不知道我说的够不够详细
      

  2.   

    如果@Resource注解在setU();那么它就会去找id=“u”的bean对吗?那么找到对应的bean后,它后面的Class有什么用处!
      

  3.   

    是这样的spring容器默认是在spring配置文件加载上来后就会对里面的bean进行实例化的,让后放到一个Map对象中的map的key值就是id的名称,map的value对应的就是class描述类的实例,ctx.getBean()你可以理解是去map对象中找实例化好的对象。他会将对应的bean注入到你注释的那个属性里面撒,如果类型不能转换也就是你得到的bean不是UserDAO类型或者是继承了该类的话就会报错咯,