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
}
}
}