在Apache Mina IoSession Scope之后创建具有范围的bean

时间:2015-01-02 07:24:44

标签: java spring dependency-injection apache-mina

我的apache应用程序位于Spring上下文中。

<bean id="ghChatServer" class="io.gamehammer.service.ghchat.server.GhChatServer"
        init-method="init" destroy-method="destroy">
        <property name="port" value="5222" />
    </bean>

处理程序也在容器内。

<bean id="eventHandler" class="io.gamehammer.service.ghchat.handler.EventHandler"></bean>

在sessionCreate中,它将创建一个新的worker并将其放在HashMap中。断开连接时将其取下。

@Override
    public void sessionCreated(IoSession session) throws Exception {
        sessionWorker = new SessionWorker();
        sessionHandler.init(session);
        cpntext.put(session, sessionHandler);
        log.info("Current connected session : " + handlers.size());
    }

我可以将bean注入我的处理程序。但我也想为我的工人注入服务。当我的处理程序中的sessionCreated被调用时,如何动态创建bean?

默认情况下是否可以实现我自己的范围,如HttpSession范围?

1 个答案:

答案 0 :(得分:0)

我之前想念这个。需要一些代码才能做到这一点。

String beanName = "sessionHandler-" + session.toString();
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory;
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(SessionHandler.class);
registry.registerBeanDefinition(beanName, beanDefinition);
factory.autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);
SessionHandler sessionHandler = (SessionHandler) applicationContext.getBean(beanName);
sessionHandler.init(session);

在此之后,我可以在Worker内部自动提供服务。