2017-09-12 79 views
-3

我正在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.spring[email protected]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) 

但如果我使用默認公司nstructor程序工作正常,像這樣:

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.spring[email protected]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.spring[email protected]1ed6993a: startup date [Tue Sep 12 12:21:49 IST 2017]; root of context hierarchy 
BUILD SUCCESSFUL (total time: 0 seconds) 

請幫忙....

+4

你的CreateUser bean創建在哪裏?你必須在你的Configuartion類中創建它。如果它們不是bean Sping IOC控制器將Autowire用戶類中的CreateUser bean。 – SachinSarawgi

+0

這些代碼都沒有任何意義。這就像有人隨機複製代碼,不理解他在做什麼。 – Kayaman

+0

在Autowire工作的默認構造函數情況下,因爲Autowire沒有任何內容。嘗試在缺省構造函數的情況下使用Autowire上方的CreateUser屬性,它也會在那裏失敗。 – SachinSarawgi

回答

1

在下面代碼的配置類寫:

@Configuration 
@ComponentScan 
public class UserConfig { 

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

另一種選擇是使用@Bean您CREATEUSER類以上:

@Bean 
public class CreateUser{ 

} 

如果CreatweUser是一個接口(這是你的情況),那麼你需要一個Crea的實現teUser並在該類之上使用@Bean註釋,以便每當您在CreateUser上方使用自動裝配時,Spirng IOC容器都可以自動裝載CreateUser實現。 希望這有助於。

+0

createUser是一個界面,不是類,它是... package profile; public interface CreateUser {0} {0} {0} {0} void addUser(String name,String contact); void showUser(); } –

+0

如果它的接口那麼必須有它的一個實現。你有沒有執行它?如果是,那麼在該實現類上方使用@Bean註釋,它將起作用。 – SachinSarawgi

+0

什麼是'CreateUser'應該是什麼?爲什麼'User'需要'CreateUser'? – Kayaman

相關問題