用spring容器注入userManager和userDao,在其他类中需要调用UserManagerImpl中的方法时,直接
new UserManagerImpl().totalUsers()时抛出空指针异常,但是在UserRegisterAction类中可通过userManager正常访问。各位大虾帮帮我吧!!!部分代码如下:@Component("userManager")
public class UserManagerImpl implements UserManager {

private UserDao userDao;

public UserDao getUserDao() {
return userDao;
}

@Resource
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} public boolean exists(User u) throws Exception {
return userDao.checkUserIsExistedByName(u.getUser_name());

}

public boolean correct(User u) throws Exception{
return userDao.checkUserIsCorrectByNameAndPassword(u.getUser_name(), u.getPassword());
}

public void add(User u) throws Exception {
userDao.save(u);
} public List<User> getAllUsers() throws Exception {
return userDao.getAllUsers();
} public User loadById(int id) throws Exception {
return userDao.loadById(id);
} public int totalUsers() throws Exception {
return userDao.totalUsers();
}
}
@Component(value = "userDao")
public class UserDaoImpl implements UserDao { private HibernateTemplate hibernateTemplate; public void save(User u) {
hibernateTemplate.save(u);
}

public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
} @Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
} public boolean checkUserIsExistedByName(String username) {
List<User> users = hibernateTemplate
.find("from User u where u.user_name ='" + username + "'");
if (users != null && users.size() > 0)
return true;
return false;
} public boolean checkUserIsCorrectByNameAndPassword(String username, String password) {
List<User> users = hibernateTemplate
.find("from User u where u.user_name ='" + username
+ "' and u.password = '" + password + "'");
if (users != null && users.size() > 0)
return true;
return false;
} public List<User> getAllUsers(){
List<User> users = (List<User>)hibernateTemplate.find("from User");
return users;
} public int totalUsers() {
return hibernateTemplate.loadAll(User.class).size();
} public User loadById(int id) {
User users = (User)hibernateTemplate.load(User.class, id);
return users;
}
}
public class UserRegisterAction extends ActionSupport implements ModelDriven { UserRegister_VO userInfo = new UserRegister_VO();
private UserManager userManager;
         public Object getModel() {
return userInfo;
} public UserRegister_VO getUserInfo() {
return userInfo;
} public void setUserInfo(UserRegister_VO userInfo) {
this.userInfo = userInfo;
} public UserManager getUserManager() {
return userManager;
} public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}

解决方案 »

  1.   

    看你的使用的是注解注入吧?根本不需要实例化impl就可以得到了
      

  2.   

    是啊 请问在其他类中怎么得到呢  比如得到UserManagerImpl类中的totalUsers()方法
      

  3.   

    Spring IOC,也就是控制反转,也就是说将对象以及依赖对象的实例化过程交给Spring IOC容器管理。不需要程序自身获取(也就是new一个对象)。也就是说,你UserManagerImpl中的UserDao是交给SpringIOC容器进行管理的。并不需要你手动new其中的依赖对象。因为这个过程完全由Spring IOC容器在你第一次getBean的时候自动注入了。所以userManager这个时候已经创建好了。直接用当然没有问题。但是你现在直接new UserManagerImpl()是你自己手动创建的UserManagerImpl,并不是从Spring IOC容器中获取的。里面的依赖关系(userDao)Spring当然不会帮你注入了。当然就会报NullPoint了。
    ---------
    解决方案:从Spring IOC容器中取得userManagerImpl对象
    ApplicationContext context = new ClassPathXmlApplicationContext("Class路径下Spring配置文件名名称");
    UserManager userManager = (UserManager)context.getBean("userManagerImpl");//执行此操作时Spring IOC容器才真正帮你完成依赖注入  也就是将UserDao 注入到你的UserManagerImpl
    userManager.totalUsers(); 全手打的。希望能帮助你。
      

  4.   

    好好学下spring吧,太基础了,理解下什么叫依赖注入