温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring中有哪些bean

发布时间:2021-12-16 09:41:18 来源:亿速云 阅读:327 作者:iii 栏目:编程语言

这篇文章主要讲解了“Spring中有哪些bean”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中有哪些bean”吧!

  Spring中有两种bean, 用的最多的是 annotationBean,但是对于一些客制化的需求,可以使用 factoryBean, 它提供了三个接口

  @Nullable

  T getObject() throws Exception;

  @Nullable

  Class getObjectType();

  default boolean isSingleton() {

  return true;

  }

  定义

  @Component

  class AutoMoneyHouseExtApiProxyCreator : BeanFactoryPostProcessor {

  private val logger: Logger = LogManager.getLogger()

  override fun postProcessBeanFactory(beanFactory: ConfigurableListableBeanFactory) {

  ServiceProvider::class.java.declaredFields.filter {

  it.isEnumConstant && it.isAnnotationPresent(Rail::class.java)

  }.forEach {

  val railId = it.getAnnotation(Rail::class.java).id

  val provider = it.get(null) as ServiceProvider

  createApiProxy(railId, provider, beanFactory as BeanDefinitionRegistry)

  }

  }

  private fun createApiProxy(railId: String, provider: ServiceProvider,

  registry: BeanDefinitionRegistry) {

  logger.info("auto-generate api proxy for: {}", provider)

  val mhId = provider.providerName

  // Payment API

  if (provider.services.contains(Service.PAYMENT)) {

  val railsDisbBeanDef = BeanDefinitionBuilder.rootBeanDefinition(DisbursementRpcServiceProxyFactoryBean::class.java)

  .addConstructorArgValue(railId)

  .addConstructorArgValue(mhId)

  .beanDefinition

  val railsDisbBeanName = "rails-disb-${provider.name}"

  registry.registerBeanDefinition(railsDisbBeanName, railsDisbBeanDef)

  val paymentBeanDef = BeanDefinitionBuilder.rootBeanDefinition(DisbursementCPAPIImpl::class.java)

  .addConstructorArgValue(mhId)

  .addConstructorArgReference(railsDisbBeanName)

  .addConstructorArgValue(provider)

  .beanDefinition

  registry.registerBeanDefinition(Service.PAYMENT.name + "-" + provider.name, paymentBeanDef)

  }

  // Balance API

  val railsBalBeanDef = BeanDefinitionBuilder.rootBeanDefinition(AccountBalanceRpcServiceProxyFactoryBean::class.java)

  .addConstructorArgValue(railId)

  .addConstructorArgValue(mhId)

  .beanDefinition

  val railsBalBeanName = "rails-bal-${provider.name}"

  registry.registerBeanDefinition(railsBalBeanName, railsBalBeanDef)

  val balanceBeanDef = BeanDefinitionBuilder.rootBeanDefinition(BalanceAPIServiceAdapter::class.java)

  .addConstructorArgValue(mhId)

  .addConstructorArgReference(railsBalBeanName)

  .beanDefinition

  registry.registerBeanDefinition("BALANCE-" + provider.name, balanceBeanDef)

  }

  }

  class DisbursementRpcServiceProxyFactoryBean(private val railId: String, private val mhId: MoneyHouseID)

  : FactoryBean {

  @Autowired

  lateinit var restTemplate: RestTemplate

  @Value("\${application.railsGateway.url}")

  var railsGatewayUrl: String = ""

  override fun getObject(): DisbursementRpcService {

  val client = JsonRpcRestClient(URL(URL(railsGatewayUrl), railId + DisbursementRpcService.SERVICE_PATH),

  Codecs.NO_NULL_FIELD_ORDERED_MAPPER, restTemplate,

  mapOf("mhId" to mhId))

  return ProxyUtil.createClientProxy(javaClass.classLoader, DisbursementRpcService::class.java, client)

  }

  override fun getObjectType() = DisbursementRpcService::class.java

  }

  class AccountBalanceRpcServiceProxyFactoryBean(private val railId: String, private val mhId: MoneyHouseID)

  : FactoryBean {

  @Autowired无锡人流医院哪家好 http://www.ytsg029.com/

  lateinit var restTemplate: RestTemplate

  @Value("\${application.railsGateway.url}")

  var railsGatewayUrl: String = ""

  override fun getObject(): AccountBalanceRpcService {

  val client = JsonRpcRestClient(URL(URL(railsGatewayUrl), railId + AccountBalanceRpcService.SERVICE_PATH),

  Codecs.NO_NULL_FIELD_ORDERED_MAPPER, restTemplate,

  mapOf("mhId" to mhId))

  return ProxyUtil.createClientProxy(javaClass.classLoader, AccountBalanceRpcService::class.java, client)

  }

  override fun getObjectType() = AccountBalanceRpcService::class.java

  }

  使用

  @Target(AnnotationTarget.FIELD)

  annotation class Rail(val id: String)

  enum class ServiceProvider constructor(val providerName: String, vararg list: Service) {

  @Rail("ttt") TTTT(MHHIDs.TTTT, Service.CONVERSION, Service.PAYMENT)

  val services: Array = arrayOf(*list)

  }

  精髓

  生成beanDef:

  BeanDefinitionBuilder.rootBeanDefinition(DisbursementRpcServiceProxyFactoryBean::class.java)

  .addConstructorArgValue(railId)

  .addConstructorArgValue(mhId)

  .beanDefinition

  注册bean

  registry.registerBeanDefinition(railsDisbBeanName, railsDisbBeanDef)

  其中 registry:

  void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

  registry = beanFactory

感谢各位的阅读,以上就是“Spring中有哪些bean”的内容了,经过本文的学习后,相信大家对Spring中有哪些bean这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI