如何在其他类中自动装配以@service注释的bean

时间:2018-11-01 20:49:38

标签: java spring spring-boot spring-bean

SPRING BOOT application中,我有如下课程

@Service
public class XYZ{
}

我想在其他班级ABC中使用

public class ABC{
@Autowired
private XYZ xyx;
}

抛出错误,找不到XYZ。我在编写main方法的类中已经有@SpringBootApplication了。因此,这将自动在包上启用@ComponentScan。我的理解是,由于XYZ已使用@service进行注释,因此spring扫描并创建并注册该bean。在不使用xml配置的情况下,如何在其他类中访问该bean?

5 个答案:

答案 0 :(得分:0)

ABC类还需要具有@Service或@Component批注。否则,您将收到以下消息警告。

  

自动连线的成员必须在有效的Spring bean(@Component | @Service | ...)中定义。

@Service
public class ABC {

    @Autowired
    private XYZ xyx;
}

答案 1 :(得分:0)

您的ABC类不在spring boot上下文中,这就是您无法获得bean的原因。您可以通过以下方式获得它:

创建ApplicationContextProvider

@Component
public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext context;

    public static ApplicationContext getApplicationContext() {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        context = applicationContext;
    }
}

需要通过以下方式调用后:

public class ABC {
   public void method() {
      XYZ xyz = ApplicationContextProvider.getApplicationContext().getBean(XYZ.class);
   }
}

答案 2 :(得分:0)

如果您不想配置@ComponentScan。您需要将XYZ类和ABC类与Spring Boot应用程序运行器类放在同一级别目录中

答案 3 :(得分:-1)

您的ABC类也应该是春季管理的

您可以通过使其成为组件

@Component
public class ABC{
  @Autowired
  private XYZ xyx;
}

或将其作为Bean提供

 @Configuration
 public SomeConfig{

    @Bean
    public ABC abc(){
        return new ABC();
    }
 }

答案 4 :(得分:-1)

在您的Spring Boot应用程序运行程序类中使用@ComponentScan("<your root package>"),以便它检查所有组件并创建可以自动装配的bean。同样,调用类应该是带有@Componenent注释的组件。如果您将ABC的对象创建为新的ABC(),那么

ABC abc = new ABC();  
ContextProvider.getApplicationContext().getAutowireCapableBeanFactory().autowireBean(abc); //Autowiring dependencies

//Then use the abc object which will have instance of XYZ populated.

ContextProvider的实现

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author dpoddar
 *
 */
@Component("ContextProvider")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ContextProvider implements ApplicationContextAware {

    @Autowired
    private static ApplicationContext CONTEXT;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        CONTEXT = applicationContext;
    }
    /**
     * @return the cONTEXT
     */
    public static ApplicationContext getApplicationContext() {
        return CONTEXT;
    }


    /**
     * Get a Spring bean by type.
     **/
    public static <T> T getBean(Class<T> beanClass) {
        return CONTEXT.getBean(beanClass);
    }

    /**
     * Get a Spring bean by type.
     **/
    public static <T> T getBean(String beanName,Class<T> beanClass) {
        return CONTEXT.getBean(beanName, beanClass);
    }

    /**
     * Get a Spring bean by name.
     **/
    public static Object getBean(String beanName) {
        return CONTEXT.getBean(beanName);
    }

}