java - 如何在Spring MVC中实现DI?

标签 java spring spring-mvc

我对 Spring MVC 中的依赖注入(inject)感到困惑。

第一个代码:-

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private Userdao udo;



    @Override
    @Transactional
    public List<Positions> plist() {
        return udo.plist();
    }
}

工作正常。 我想在这个类中实现依赖注入(inject)。我这样做是对还是错?

第二个代码:-

`@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();
    }
}

它不工作。 ERROR: org.springframework.web.context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.xxx.Services.UserService com.xxx.java.HomeController.uservice; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl' defined in file [D:\xxxWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\abcd\WEB-INF\classes\com\xxx\ServiceImp\UserServiceImpl.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.xxx.ServiceImp.UserServiceImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.xxx.ServiceImp.UserServiceImpl.<init>()

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

最佳答案

您可以通过两种方式执行此操作。

  1. 您可以使用基于字段的 Autowiring 。但在这种情况下,您将需要一个默认构造函数。

    @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();
        }
    }
    
  2. 您可以使用基于构造函数的依赖注入(inject)。为此,只需将 @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();
        }
    
    }
    

关于java - 如何在Spring MVC中实现DI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43393729/

相关文章:

springboot + spring mvc + cas = 404?

spring - 过滤器 null 中的 LocaleResolver 仍显示它已 Autowiring ! Spring MVC 3.1.1/Spring 安全 3.1.0

Java Web 应用程序查询不起作用

java - Hashtable over ConcurrentHashMap 的具体用法

java - "Could not find or load main class"使用命令行

java - Spring MVC - 名为 "path"的 URI 中缺少变量

java - 我可以为 Spring FileSystemResource 使用基于环境变量的位置吗?

java - Java 中 spring-security 的替代方案(spring)

spring - Controller 无法正常工作

java - 如何从 Java 中的十进制整数中获取十六进制值?