UserController:
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) app.getBean("userService");
userService.save();
}
UserServiceImpl:
public void save() {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
}
UserDaoImpl:
public UserDaoImpl() {
System.out.println("UserDaoImpl创建");
}
由于applicationContext.xml中配置scope=“singleton” 当controller中加载配置文件时 实例将被创建 ,dao层中无参构造执行 ,而UserServiceImpl的save方法中由于要调用dao层方法,配置文件再次被加载,dao层中无参构造再次执行。这样,配置文件多次被加载,从service到dao层,无参构造冗余执行。
解决方法:使用xml依赖注入-set方法
UserServiceImpl中:
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
xml中:将userdao设置到userservice内部
<bean id="userDao" class="g.m.dao.impl.UserDaoImpl" ></bean>
<bean id="userService" class="g.m.service.impl.UserServiceImpl" >
<property name="userDao" ref="userDao"></property>
</bean>