1

我有以下的配置類:如何在Spring Boot應用程序的主要方法中正確初始化Bean?

@Configuration 
public class StartupConfig { 

    private final Logger log = LoggerFactory.getLogger(this.getClass().getSimpleName()); 

    @PostConstruct 
    public void init() { 
     log.debug("Start up config initialized."); 
    } 

    @Bean 
    public SchedulerService schedulerService() { 

     return new SchedulerService(); 
    } 
} 

我希望能夠從應用main方法加載schedulerService豆。事情是這樣的:

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.cache.annotation.EnableCaching; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 

import com.crm.config.StartupConfig; 
import com.crm.service.SchedulerService; 

@SpringBootApplication 
@EnableCaching 
public class Server { 

    public static void main(String[] args) throws Exception { 

     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); 
     context.register(StartupConfig.class); 
     context.refresh(); 

     SpringApplication.run(Server.class, args); 

     SchedulerService schedulerService = (SchedulerService) context.getBean("schedulerService"); 
     schedulerService.start(); 
    } 
} 

的schedulerService類有一個Autowired依賴性:

@Service 
    @Transactional 
    public class SchedulerService { 

     @Autowired 
     private SchedulerTriggerJpaDao schedulerTriggerJpaDao; 
     ... 

這裏是SchedulerTriggerJpaDao定義:

package com.crm.dao; 

import java.util.Collection; 

import javax.transaction.Transactional; 

import org.springframework.data.jpa.repository.JpaRepository; 

import com.crm.entity.SchedulerTrigger; 

@Transactional 
public interface SchedulerTriggerJpaDao extends JpaRepository<SchedulerTrigger, Integer> { 

    public Collection<SchedulerTrigger> findByEnabledTrueAndDeletedFalse(); 

} 

當我跑起來的應用程序,我得到以下錯誤:

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'schedulerService': Unsatisfied dependency expressed through field 'schedulerTriggerJpaDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.crm.dao.SchedulerTriggerJpaDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)

我需要更改什麼才能正確初始化schedulerService bean,以便它還可以初始化schedulerTriggerJpaDao依賴項?

+0

你是怎麼定義'schedulerTriggerJpaDao'? – NiVeR

回答

2

如果您SchedulerTriggerJpaDao類具有以下注釋

@Repository 

那麼它應該被視爲一個bean。

+0

我已將'@ Repository'註釋添加到'SchedulerTriggerJpaDao'接口。但我仍然在啓動時遇到同樣的錯誤。 – crm

+0

你可以嘗試使用'@ ComponentScan'註釋明確地添加你的'com.crm.dao'包。 – VoShoo

1

您的SchedulerTriggerJpaDao只是一個界面。您需要

  1. 要麼提供一個DAO實現自己與@Component
    將其標註爲(FYI @Repository@Service自動標記類作爲組件)

  2. ,或者使用一些框架,會爲你生成一個DAO實現基於你的界面。例如。春季數據JPA(http://projects.spring.io/spring-data-jpa/

0

的問題是,你正在返回的SchedulerService,這不是彈簧管理的new實例。您將課程標註爲@Service,但彈簧僅管理由@Inject和/或@Autowire注入的課程。

相關問題