spring boot 接口代理

interface BaseService {

    fun fun1()
}
class BaseServiceHandleBeanProxy : InvocationHandler{

    companion object{
        fun <T> newProxyInstance(clazz: Class<T>): Any {
            return Proxy.newProxyInstance(
                clazz.classLoader,
                arrayOf(clazz),
                BaseServiceHandleBeanProxy()
            )
        }
    }

    override fun invoke(proxy: Any?, method: Method?, vararg args: Any?): Any? {
        println("proxy method begin")

        println("proxy method ${method!!.name} todo...")

        println("proxy method end")

        return null
    }
}
class BaseServiceHandleFactory<T>(

    var interfaceClazz: Class<T>

) : FactoryBean<T>{

    override fun getObject(): T? {

        return BaseServiceHandleBeanProxy.newProxyInstance(interfaceClazz) as T
    }

    override fun getObjectType(): Class<T>? {
        return interfaceClazz
    }

    override fun isSingleton(): Boolean  = true
}
class BaseServiceBeanDefinitionRegistry(
    /**扫描包路径*/
    private var pkg: String?
) : BeanDefinitionRegistryPostProcessor, ApplicationContextAware {

    private var applicationContext: ApplicationContext? = null

    @Throws(BeansException::class)
    override fun postProcessBeanDefinitionRegistry(registry: BeanDefinitionRegistry) {
        pkg?.let {
            BaseServiceScanner(registry).let { scanner ->
                scanner.scan(pkg)
            }
        }
    }

    @Throws(BeansException::class)
    override fun postProcessBeanFactory(beanFactory: ConfigurableListableBeanFactory) {

    }

    @Throws(BeansException::class)
    override fun setApplicationContext(applicationContext: ApplicationContext) {
        this.applicationContext = applicationContext
    }
}
@Configuration
open class BaseServiceConfig {

    @Bean
    open fun baseServiceBeanDefinitionRegistry():
            BaseServiceBeanDefinitionRegistry{
        return BaseServiceBeanDefinitionRegistry("com.zxc.yuna.bs.auth")
    }
}
/**
 * false表示不使用ClassPathBeanDefinitionScanner默认的TypeFilter
 */
class BaseServiceScanner(registry: BeanDefinitionRegistry) :
    ClassPathBeanDefinitionScanner(registry, false) {

    override fun doScan(vararg basePackages: String?): MutableSet<BeanDefinitionHolder> {
        this.addFilter()
        val beanDefinitionHolders = super.doScan(*basePackages)
//        if (beanDefinitionHolders.isEmpty()) {
//            throw NullPointerException("No interfaces")
//        }
        this.createBeanDefinition(beanDefinitionHolders)
        return beanDefinitionHolders
    }

    /**
     * 只扫描顶级接口
     * @param beanDefinition bean定义
     * @return boolean
     */
    override fun isCandidateComponent(beanDefinition: AnnotatedBeanDefinition): Boolean {
        val metadata = beanDefinition.metadata
        val interfaceNames = metadata.interfaceNames
        return metadata.isInterface && metadata.isIndependent && interfaceNames.contains(BaseService::class.java.name)
    }

    /**
     * 扫描所有类
     */
    private fun addFilter() {
        addIncludeFilter { _, _ -> true }
    }

    /**
     * 为扫描到的接口创建代理对象
     *
     * @param beanDefinitionHolders beanDefinitionHolders
     */
    private fun createBeanDefinition(beanDefinitionHolders: Set<BeanDefinitionHolder>) {
        for (beanDefinitionHolder in beanDefinitionHolders) {
            val beanDefinition = beanDefinitionHolder.beanDefinition as GenericBeanDefinition
            //将bean的真实类型改变为FactoryBean
            beanDefinition.constructorArgumentValues.addGenericArgumentValue(beanDefinition.beanClassName)
            beanDefinition.beanClass = BaseServiceHandleFactory::class.java
            beanDefinition.autowireMode = GenericBeanDefinition.AUTOWIRE_BY_TYPE
        }
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值