当前位置: 首页 > 面试题库 >

Spring @Autowired在新线程上不起作用

曹育
2023-03-14
问题内容

当我运行TaskJob时,我得到了空指针异常,因为Spring不会自动装配serviceJob服务。是新线程导致此问题,因为Spring自动连接mysqlService没有任何问题?

public class TaskJob implements Runnable {
    @Autowired
    private ServiceJob serviceJob;

    String name;
    String source;

    public TaskJob(String name, String source) {
        this.name = name;
        this.source = source;
    }

    public void run() {
        serviceJob.run();
    }
}

@Service
public class ServiceJob extends BaseJob{

    @Autowired
    private MysqlService mysqlService;

    public void run(){
    ....
    }
}

@Service
public class MysqlService {
...
}

我的applicationContext.xml;

<context:component-scan base-package="cm.*" />

我的课是;

cm.tasks.jobs.TaskJob
cm.jobs.ServiceJob
cm.services.MysqlService;

编辑: TaskJob实例化;

TaskJob taskJob = new TaskJob(name, source);
Thread taskThread = new Thread(taskJob);
taskThread.start();

问题答案:

Spring仅自动装配其创建的组件。您正在调用新的TaskJob(),Spring不知道该对象,因此不会进行自动装配。

解决方法是,可以直接调用应用程序上下文。首先获取应用程序上下文的句柄。这可以通过为应用程序上下文本身添加@Autowire来完成。

@Autowired
private ApplicationContext applicationContext;

创建TaskJob时,要求应用程序上下文进行自动装配。

TaskJob taskJob = new TaskJob(name, source);
applicationContext.getAutowireCapableBeanFactory().autowireBean(taskJob);

另外,如果您有任何带@PostConstruct注释的方法需要触发,则可以调用initializeBean()

applicationContext.getAutowireCapableBeanFactory().initializeBean(taskJob, null);


 类似资料:
  • 问题内容: 我对Spring不太熟悉,并且遇到以下情况: 存储库类: 使用存储库类的类: 我知道,如果我用注释并与一起使用,则 可以解决。问题是我处于一种需要创建带有反射的新实例的情况下。因此永远不会解决,并且始终为null。 在这种情况下有没有办法使用? 更好地解释我的情况:我有一些实现。在我的应用程序的设置阶段,我将创建以下实现。基本上: 然后,我有了一个泛型,可以 使用 ,上面的内容和反射内

  • 我实现了spring Security3.2.5,但不幸的是@preauthorize不能用于类和方法。正如我从文档中读到的,@preauthorize应该允许方法和类工作,如果用户在注释中有指定的角色,但我能够运行所有方法或类,而没有任何角色差异。您可以看到security-config.xml和security.context.xml以及我在下面声明@preauthorize注释的类。如果你能

  • 更新: 因为有些答案提供了解决方案,我问的是解释而不是解决方案。以下内容甚至不需要对“测试”进行组件扫描就可以工作: 现在的问题是,当@repository不工作时,为什么我甚至需要在它上使用componentscan?为什么在文档中@repository是由componentscan扫描的,而@enablejparepostiories是enoguh?

  • 我有一个问题,在laravel的新路线不工作,网址显示正确的路线,但几乎好像它没有得到我的路线Web文件只是返回页面没有找到每次。 我尝试过:使用命名路由,移动功能到不同的控制器,清除路由缓存,清除应用缓存,自卸自动加载,确保AllowOveride设置为所有, 网状物php: 控制器: 查看文件名:coursestatistics。刀身php文件结构视图/课程统计 链接至第页: 有人能告诉我是什

  • 我有一个可运行的任务,我试图自动连接字段,但当我这样做时,任务不会运行。当我自动连接runnable外部的字段时,它工作正常。为什么会发生这种情况?还有没有其他更简单的方法可以在runnable中获取自动安装字段的新实例,而不是在内部自动安装它? 这是我的可运行方法”

  • 我在GWT+Spring Boot中创建了一个应用程序,当我尝试使用-时,我得到。显然不起作用,没有将bean插入正确的位置。我怎样才能解决这种情况? 分派传入RPC调用时发生异常 ExpectiontedException:服务方法“public abstract java.util.list com.mygwt.springbootapp.client.userservice.list()”引