ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何在Spring中为在运行时动态创建的对象注入依赖项?

2019-08-28 15:02:14  阅读:423  来源: 互联网

标签:java spring spring-boot dependency-injection factory-pattern


public class PlatformEventFactory {

    public PlatformEvent createEvent(String eventType) {
        if (eventType.equals("deployment_activity")) {
            return new UdeployEvent();
        }


        return null;
    }
}

我有一个工厂类,它根据eventType创建PlatformEvent类型对象.

UdeployEvent类依赖于私有RedisTemplate< String,Object>在创建UdeployEvent对象后我想要注入的模板.

@Component
public class UdeployEvent implements PlatformEvent {

    private RedisTemplate<String, Object> template;
    private UDeployMessage uDeployMessage;

    private static final Logger logger = LoggerFactory.getLogger(UdeployEvent.class);

    public UdeployEvent() {
        uDeployMessage = new UDeployMessage();
    }


    /*public void sendNotification() {

    }*/

    public RedisTemplate<String, Object> getTemplate() {
        return template;
    }

    @Autowired
    public void setTemplate(RedisTemplate<String, Object> template) {
        this.template = template;
        System.out.println("Injection done");
    }
}

当为UdeployEvent返回新对象时,我得到模板的空指针异常.我相信原因是因为它不是指弹簧启动时创建的同一个bean.如何在运行时为新创建的对象注入依赖项.

解决方法:

您不应手动创建组件.让Spring来做这件事.使用ApplicationContext获取组件的实例.所有字段都将自动注入:

@Component
public class PlatformEventFactory {

    @Autowired
    private ApplicationContext context;

    public PlatformEvent createEvent(String eventType) {
        if (eventType.equals("deployment_activity")) {                
            return context.getBean(UdeployEvent.class);
        }

        return null;
    }
}

要使Spring在每次请求时创建UdeployEvent组件的新实例,请将组件范围指定为SCOPE_PROTOTYPE:

@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class UdeployEvent implements PlatformEvent {

    private RedisTemplate<String, Object> template;

    public RedisTemplate<String, Object> getTemplate() {
        return template;
    }

    @Autowired
    public void setTemplate(RedisTemplate<String, Object> template) {
        this.template = template;
        System.out.println("Injection done");
    }

    ...
}

现在每次调用context.getBean(UdeployEvent.class)时,Spring都会创建具有完全初始化依赖关系的组件的新实例.

标签:java,spring,spring-boot,dependency-injection,factory-pattern
来源: https://codeday.me/bug/20190828/1753048.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有