当类对象是新的时,无法使用@spring注释

时间:2017-07-14 05:55:30

标签: java spring spring-mvc

其实我有一个春季主要课程如下。

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。任何人都可以指导我这件事

3 个答案:

答案 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