Java 如何在SpringMVC中实现DI。?

Java 如何在SpringMVC中实现DI。?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我对SpringMVC中的依赖注入感到困惑 第一个代码:- @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private Userdao udo; @Override @Transactional public List<Positions> plist() { return udo.pli

我对SpringMVC中的依赖注入感到困惑

第一个代码:-

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private Userdao udo;



    @Override
    @Transactional
    public List<Positions> plist() {
        return udo.plist();
    }
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
@自动连线
私有用户到udo;
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
它工作得很好。 我想在这个类中实现依赖注入。我做得对还是错

第二个代码:-

`@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private Userdao udo;

    public UserServiceImpl(Userdao udo) {
        this.udo = udo;
    }

    @Override
    @Transactional
    public List<Positions> plist() {
        return udo.plist();
    }
}
`@服务
@交易的
公共类UserServiceImpl实现UserService{
@自动连线
私有用户到udo;
公共UserServiceImpl(Userdao udo){
this.udo=udo;
}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
它不工作。
错误:org.springframework.web.context.ContextLoader-上下文初始化失败
org.springframework.beans.factory.BeanCreationException:创建名为“homeController”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连线字段:com.xxx.Services.UserService com.xxx.java.HomeController.uservice;嵌套异常为org.springframework.beans.factory.beancreatitionException:创建名为“userServiceImpl”的bean时出错,该名称在文件[D:\xxxWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\abcd\WEB-INF\classes\com\xxx\ServiceImp\userServiceImpl.class]中定义:bean实例化失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化bean类[com.xxx.ServiceImp.UserServiceImpl]:未找到默认构造函数;嵌套异常是java.lang.NoSuchMethodException:com.xxx.ServiceImp.UserServiceImpl。()


我是一个初学者。请帮我解决这个问题。如何在Spring MVC中实现DI。

您可以用两种方法来实现

  • 可以使用基于字段的自动布线。但在这种情况下,您将需要一个默认构造函数

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        @Autowired // field based DI
        private Userdao udo;
    
        // default constructor
        public UserServiceImpl() {}
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    }
    
    @服务
    @交易的
    公共类UserServiceImpl实现UserService{
    @自动连线//基于字段的DI
    私有用户到udo;
    //默认构造函数
    公共UserServiceImpl(){}
    @凌驾
    @交易的
    公共列表plist(){
    返回udo.plist();
    }
    }
    
  • 您可以使用基于构造函数的依赖项注入。为此,只需将@Autowire注释移动到构造函数中即可。并将其从现场移除

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        private Userdao udo;
    
        @Autowired // constructor based DI
        public UserServiceImpl(Userdao udo) {
            this.udo = udo;
        }
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    
    }
    
    @服务
    @交易的
    公共类UserServiceImpl实现UserService{
    私有用户到udo;
    @自动连线//基于构造函数的DI
    公共UserServiceImpl(Userdao udo){
    this.udo=udo;
    }
    @凌驾
    @交易的
    公共列表plist(){
    返回udo.plist();
    }
    }
    

  • 你可以用两种方法来做

  • 可以使用基于字段的自动布线。但在这种情况下,您将需要一个默认构造函数

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        @Autowired // field based DI
        private Userdao udo;
    
        // default constructor
        public UserServiceImpl() {}
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    }
    
    @服务
    @交易的
    公共类UserServiceImpl实现UserService{
    @自动连线//基于字段的DI
    私有用户到udo;
    //默认构造函数
    公共UserServiceImpl(){}
    @凌驾
    @交易的
    公共列表plist(){
    返回udo.plist();
    }
    }
    
  • 您可以使用基于构造函数的依赖项注入。为此,只需将@Autowire注释移动到构造函数中即可。并将其从现场移除

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        private Userdao udo;
    
        @Autowired // constructor based DI
        public UserServiceImpl(Userdao udo) {
            this.udo = udo;
        }
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    
    }
    
    @服务
    @交易的
    公共类UserServiceImpl实现UserService{
    私有用户到udo;
    @自动连线//基于构造函数的DI
    公共UserServiceImpl(Userdao udo){
    this.udo=udo;
    }
    @凌驾
    @交易的
    公共列表plist(){
    返回udo.plist();
    }
    }
    

  • 第一次安装是好的,应该可以工作

    在第二个设置中,您会遇到以下异常

    class [com.xxx.ServiceImp.UserServiceImpl]: No default constructor found;
    
    也就是说,因为您已经定义了一个构造函数
    public userserviceinpl(Userdao udo)
    Spring找不到无参数构造函数

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        @Autowired // field based DI
        private Userdao udo;
    
        // default constructor
        public UserServiceImpl() {}
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    }
    
    您可以删除此构造函数并使用第一个构造函数,也可以自己定义无参数构造函数

    实际上,您不需要在bean中定义构造函数,因为您自己不打算创建bean对象。只有在自动连接构造函数参数时才需要它

    如果您正在尝试自动连接构造函数,那么您可以像下面这样做

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        private Userdao udo;
    
        @Autowired //autowired constructor, instead of the field
        public UserServiceImpl(Userdao udo) {
            this.udo = udo;
        }
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    }
    
    @服务
    @交易的
    公共类UserServiceImpl实现UserService{
    私有用户到udo;
    @Autowired//Autowired构造函数,而不是字段
    公共UserServiceImpl(Userdao udo){
    this.udo=udo;
    }
    @凌驾
    @交易的
    公共列表plist(){
    返回udo.plist();
    }
    }
    
    第一次安装没问题,应该可以正常工作

    在第二个设置中,您会遇到以下异常

    class [com.xxx.ServiceImp.UserServiceImpl]: No default constructor found;
    
    也就是说,因为您已经定义了一个构造函数
    public userserviceinpl(Userdao udo)
    Spring找不到无参数构造函数

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        @Autowired // field based DI
        private Userdao udo;
    
        // default constructor
        public UserServiceImpl() {}
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    }
    
    您可以删除此构造函数并使用第一个构造函数,也可以自己定义无参数构造函数

    实际上,您不需要在bean中定义构造函数,因为您自己不打算创建bean对象。只有在自动连接构造函数参数时才需要它

    如果您正在尝试自动连接构造函数,那么您可以像下面这样做

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        private Userdao udo;
    
        @Autowired //autowired constructor, instead of the field
        public UserServiceImpl(Userdao udo) {
            this.udo = udo;
        }
    
        @Override
        @Transactional
        public List<Positions> plist() {
            return udo.plist();
        }
    }
    
    @服务
    @交易的
    公共类UserServiceImpl实现UserService{
    私有用户到udo;
    @Autowired//Autowired构造函数,而不是字段
    公共UserServiceImpl(Userdao udo){
    this.udo=udo;
    }
    @凌驾
    @交易的
    公共列表plist(){
    返回udo.plist();
    }
    }
    
    简单地说:如果定义构造函数(重载),则必须在构造函数上使用
    @Autowired
    注释;如果未定义构造函数,则必须使用
    @Autowired
    注释