3 回答
TA贡献1777条经验 获得超10个赞
您可以使用下面的类来静态获取应用程序上下文和 Bean
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;
@Service
public class BeanUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return context.getBean(beanClass);
}
}
TA贡献1852条经验 获得超7个赞
您应该声明一个工厂来映射依赖项,而不是将服务声明为 bean,它会在将服务的具体实例返回给注入器之前检查请求。看看这里:
https://grokonez.com/spring-framework/spring-core/use-spring-factory-method-create-spring-bean
TA贡献1839条经验 获得超15个赞
大家好,他们很快就回复了我。首先,我必须为最近回复您所有的评论而道歉。最后一个冲刺是一个很大的负荷,新的也好不到哪里去^^
我需要在 Spring 上下文完成后创建对象以创建和加载应用程序的所有部分。作为策略模式的一部分,我必须在运行时实例化一个类,具体取决于在我必须处理的请求文件中找到的一些值。此类需要使用@Autowired注释声明的许多服务,但所有自动装配的对象仍为“ null”,因为在加载上下文后调用。
这是我首先想使用的代码。没有 Spring 也可以。
Function<Document, IStrategy> func = doc -> {
String strategyToApply = "";
IStrategy strategy = null;
switch(doc.getPlace()) {
case "Paris":
strategyToApply = "strategies_classes.ProcessParis";
break;
case "New York":
strategyToApply = "strategies_classes.ProcessNewYork";
break;
}
case "Roma":
...
try {
**Class<?> classToUse = Class.forName(strategyToApply);
strategy = (IStrategy) classToUse.newInstance();**
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return strategy;
};
Consumer<Document> consumerStrategy = doc -> {
IStrategy strategy = func.apply(doc);
strategy.bookRequest(doc);
};
documents.stream()
.forEach(consumerStrategy);
我终于找到了神奇的物体。当 Spring 对象的生命周期不符合我们自己的概念时,这是一个很好的解决方法。
要使用它,您只需使用 @Autowired 声明它:
@Autowired
private AutowireCapableBeanFactory autowireBeanFactory;
请注意, AutowireCapableBeanFactory 是一个 Spring 对象,您无需在其他任何地方声明!
然后,要使用它,很简单(我设计了一个与您在上面看到的非常不同的全新服务,但它的作用相同):
public <T> T getStrategyToUse(Entity bookingCtr, Funder funder, StrategyEnum strategy) throws FunctionalException {
String strategyToApply = null;
strategyToApply = strategyDao.getClassToApply(bookingCtr, funder, strategy);
Class<?> classToUse;
try {
classToUse = Class.forName(strategyToApply);
T strat = (T) **autowireBeanFactory.getBean**(classToUse);
return (T) strat;
} catch (ClassNotFoundException e) {
LOGGER.error("The indicated Strategy class was not found", e);
}
return null;
}
在运行时加载时,所选类将毫无问题地实例化,并且其所有自动装配的对象不再为空。
我希望这将有所帮助。
添加回答
举报