在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?
答案 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);
}
}