其实我有一个春季主要课程如下。
ClassLoader loader = null;
try {
loader = URLClassLoader.newInstance(new URL[]{new
File(plugins + "/" + pluginName + "/" + pluginName +
".jar").toURI().toURL()}, getClass().getClassLoader());
} catch (MalformedURLException e) {
e.printStackTrace();
}
Class<?> clazz = null;
try {
clazz = Class.forName("com.sample.Specific", true, loader);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method method = null;
try {
method = clazz.getMethod("run",new Class[]{});
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
method.invoke(clazz.newinstance,new Object[]{});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
具体课程如下:
package com.sample
@Service
public class Specific {
@Autowired
private FD fd;
public void run(){
fd.init();
}
}
@Autowired
FD
变为空。任何人都可以给我一些解决方案,因为我也知道新的运算符不适用于@autowired
。当我使用新实例加载类时,只有它变为null。任何人都可以指导我这件事
答案 0 :(得分:0)
在主类中添加特定服务bean。只要服务在您的组件扫描包中,您就可以了。不要使用新的运算符。
@Autowired
private Specific specific;
答案 1 :(得分:0)
Spring有自己的方式为您提供新对象。只要您使用@Autowired
和@Component/@Service/@Repository/@Controller
保持一致就没有问题
因为所有&#34; business&#34;对象实例化由Spring处理,你永远不应该使用new
。如果您没有其他方式获取实例(我真的怀疑它),您可以使用ApplicationContext.getBean()
但正如我所说,在大多数情况下这不是必需的(这也是一种不好的做法)
如果您需要多个类的实例而不是注入它们(使用@Autowired
),您可以注入Provider<T>
<强>更新强>
由于该类在运行时已知,因此需要注入ApplicationContext
并使用它来获取bean:
public class TheClassWhereYouAreCreatingTheObject {
@Autowired
private ApplicationContext context; // You definitely need this
public void theMethodWhereYouAreCreatingTheObject() {
Class<?> clazz = ... // getting the object class
Object instance = context.getBean(clazz); // getting and instance trough Spring
// If you know that kind of object you will get cast it at call its methods
((Specific) instance).run();
// If you know anything about the class you will have to use reflection
Method method = clazz.getMethod("run", new Class[]{});
method.invoke(instance, new Object[]{});
}
}
答案 2 :(得分:0)
如果你想利用自动装配,那么我认为我们必须从春季来看。
您可以使用 Beanutils 创建新实例,并使用支持弹簧功能的反射进行播放。 请通过以下方法:
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/BeanUtils.html