【问题标题】:Bean creation failed while doing autowiring进行自动装配时 Bean 创建失败
【发布时间】:2017-09-12 06:55:36
【问题描述】:

我正在对 spring bean 中的自动装配进行简单的测试,但如果接口作为我的构造函数参数传递,则自动装配不会运行。这是bean的代码

package profile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class User 
{
    private CreateUser user;

    @Autowired
    public User(CreateUser user)
    {
        this.user = user;
    }

    public void addUser(String name, String contact)
    {
        System.out.println("Adding "+name+" and "+contact+".....");
    }

    public void showUser()
    {
        System.out.println("Added Successfully");
    }
}

我的自动配置类

package profile;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class UserConfig {


}

和我的主要课程

package profile;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class UserMain {

    public static void main(String ar[])
    {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(UserConfig.class);
        User users = context.getBean(User.class);
        users.addUser("test", "122466");
        users.showUser();
        context.close();
    }
}

我收到以下错误:

run:
Sep 12, 2017 12:20:28 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1ed6993a: startup date [Tue Sep 12 12:20:28 IST 2017]; root of context hierarchy
Sep 12, 2017 12:20:28 PM org.springframework.context.annotation.AnnotationConfigApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'user' defined in file [D:\JsonWithJava\build\classes\profile\User.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'profile.CreateUser' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'user' defined in file [D:\JsonWithJava\build\classes\profile\User.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'profile.CreateUser' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
    at profile.UserMain.main(UserMain.java:9)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'profile.CreateUser' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    ... 14 more
C:\Users\Admin\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 1 second)

但是如果我使用默认构造函数,程序可以像这样正常工作:

package profile;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class User 
{
    private CreateUser user;

    @Autowired
    public User()
    {

    }

    public void addUser(String name, String contact)
    {
        System.out.println("Adding "+name+" and "+contact+".....");
    }

    public void showUser()
    {
        System.out.println("Added Successfully");
    }
}

代码运行完美。这是输出:

run:
Sep 12, 2017 12:21:49 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1ed6993a: startup date [Tue Sep 12 12:21:49 IST 2017]; root of context hierarchy
Adding test and 122466.....
Added Successfully
Sep 12, 2017 12:21:49 PM org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
INFO: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@1ed6993a: startup date [Tue Sep 12 12:21:49 IST 2017]; root of context hierarchy
BUILD SUCCESSFUL (total time: 0 seconds)

请帮忙....

【问题讨论】:

  • 您的 CreateUser bean 创建在哪里。您必须在您的配置类中创建它。如果他们没有 bean 或 Sping IOC 控制器将在您的 User 类中自动装配 CreateUser bean。
  • 这些代码都没有任何意义。这就像某人只是随机复制代码,不了解他在做什么。
  • 在 Autowire 工作的默认构造函数情况下,因为 Autowire 没有任何内容。尝试在 CreateUser 属性上方使用 Autowire,以防默认构造函数在那里也会失败。
  • 我正在为 bean 创建进行自动装配...我不需要太多知识,因为我是春天的新手。
  • 那么是时候阅读文档了。

标签: java spring spring-bean


【解决方案1】:

在您的配置类中编写以下代码:

@Configuration
@ComponentScan
public class UserConfig {

  //If their is default constructor in CreateUser then
  @Bean
  public CreateUser createUserBeanCreate(){
    return new CreateUser();
  }
}

另一种选择是在 CreateUser 类上方使用 @Bean:

@Bean
public class CreateUser{

}

如果 CreatweUser 是一个接口(这是您的情况),那么您需要一个 CreateUser 的实现并在该类上方使用 @Bean 注释,以便 Spirng IOC 容器可以在您在 CreateUser 上方使用自动装配时自动装配 CreateUser 实现。 希望这会有所帮助。

【讨论】:

  • createUser 是一个接口而不是一个类,它是...包配置文件;公共接口 CreateUser { void addUser(String name, String contact);无效的显示用户(); }
  • 如果它是一个接口,那么它必须有一个实现。你有任何实现吗?如果是,则在该实现类上方使用@Bean 注解,它将起作用。
  • CreateUser 应该是什么?为什么User 需要CreateUser
  • 没有....但是如果我实现了代码运行完美...有人可以解释一下吗????
  • 是的,如果您有实现,它将完美运行。如果您自动装配作为接口的 CreateUser,并且如果没有实现它,那么 Spring IOC 控制器将如何自动装配。因为它需要具体的实现..
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多