All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cmeza.spring.ioc.handler.factory.IocFactoryBean Maven / Gradle / Ivy

The newest version!
package com.cmeza.spring.ioc.handler.factory;

import com.cmeza.spring.ioc.handler.IocContext;
import com.cmeza.spring.ioc.handler.builders.Ioc;
import com.cmeza.spring.ioc.handler.contracts.IocContract;
import com.cmeza.spring.ioc.handler.contracts.IocContractDefault;
import com.cmeza.spring.ioc.handler.handlers.IocTarget;
import com.cmeza.spring.ioc.handler.processors.IocProcessorsManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

@Slf4j
public class IocFactoryBean implements FactoryBean, ApplicationContextAware {

    private Class type;
    private Class handler;
    private String name;
    private ApplicationContext applicationContext;

    @Override
    public T getObject() throws Exception {
        IocContext context = this.applicationContext.getBean(IocContext.class);
        Ioc.Factory.Builder factoryBuilder = this.getFactoryBuilder(context);
        configureIoc(context, factoryBuilder);
        return factoryBuilder.build().target(new IocTarget.Default<>(this.type, this.name));
    }

    @Override
    public Class getObjectType() {
        return this.type;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void setType(Class type) {
        this.type = type;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setHandler(Class handler) {
        this.handler = handler;
    }

    protected Ioc.Factory.Builder getFactoryBuilder(IocContext context) {
        Ioc.Factory.Builder instance = context.getInstance(this.name, Ioc.Factory.Builder.class);
        if (instance == null) {
            throw new IllegalStateException("No bean found of type " + Ioc.Factory.Builder.class + " for " + this.name);
        }
        return instance;
    }

    protected void configureIoc(IocContext context, Ioc.Factory.Builder factoryBuilder) {
        IocContract contract;
        if (context.getContracts().containsKey(handler)) {
            contract = context.getContracts().get(handler);
        } else {
            contract = new IocContractDefault();
            log.info("No contract found for '{}', default contract is applied", type);
        }

        factoryBuilder
                .invocationHandlerFactory(new IocInvocationHandlerFactory.Default())
                .contract(contract)
                .processors(new IocProcessorsManager()
                        .setAnnotatedClassProcessors(context.getClassProcessors())
                        .setAnnotatedMethodProcessors(context.getMethodProcessors())
                        .setAnnotatedParameterProcessors(context.getParameterProcessors()))
                .methodInterceptors(context.getMethodInterceptors());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy