当前位置: 首页 > news >正文

个人网站 免备案北京建筑设计公司前十名

个人网站 免备案,北京建筑设计公司前十名,建设企业银行网站,网站设计公司合肥ImportSelector接口是至spring中导入内部类或者外部类的核心接口#xff0c;只需要其定义的方法内返回需要创建bean的class字符串就好了#xff0c;比如#xff1a;当我们引入一个外部share包#xff0c;我们拿到里面的Class返回出去#xff0c;就能得到这个bean,是多么神…ImportSelector接口是至spring中导入内部类或者外部类的核心接口只需要其定义的方法内返回需要创建bean的class字符串就好了比如当我们引入一个外部share包我们拿到里面的Class返回出去就能得到这个bean,是多么神奇的事情前提是这个类不是接口哦。 ImportSelector往往结合Import注解一起使用可以参考我的这篇文章Import注解介绍 public interface ImportSelector {//返回类的字符串数组也就是要创建的bean的className比如userService.class.getName()//被创建的bean是在其他bean(Component、Service等注解修饰的Bean)创建之前创建的String[] selectImports(AnnotationMetadata importingClassMetadata); }二、使用案例 通过返回Class的字符串来创建bean //定义一个业务类 public class UserServiceTest {public String getUserName(){return 测试;} }//实现ImportSelector接口 public class MyImportSelect implements ImportSelector {Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//返回要注册到Spring容器的Class集合return new String[]{UserServiceTest.class.getName()};} }//配置类 Configuration Import(MyImportSelect.class) //导入我们实现ImportSelector的类。 public class AppConfigClassTest { }测试 public class MainTest {public static void main(String[] args) {AnnotationConfigApplicationContext AnnotationConfigApplicationContext new AnnotationConfigApplicationContext(AppConfigClassTest.class);//这里我们不能通过“userServiceTest”来获取bean,因为这个bean的name不是userServiceTest而是userServiceTest.getClass().getName()//因为bean的别名成功器只是针对像注解Service等注解会生成一个首字母小写的BeanNameUserServiceTest userServiceTest AnnotationConfigApplicationContext.getBean(UserServiceTest.class);System.out.println(((UserServiceTest)userServiceTest).getUserName());} }下面说下源码是怎么实现的可以跳转到Import注解介绍 //这里就直接跳到ConfigurationClassPostProcessor处理Import注解的逻辑上 private void processImports(ConfigurationClass configClass, SourceClass currentSourceClass, CollectionSourceClass importCandidates, PredicateString exclusionFilter, boolean checkForCircularImports) {//如果importCandidates为空直接return,为什么会有这个因为下面代码可能会递归调用processImports就比如Import一个类这个类也带了Import注解那就会在调用一次processImports方法if (importCandidates.isEmpty()) {return;}for (SourceClass candidate : importCandidates) {if (candidate.isAssignable(ImportSelector.class)) {//1、import的类实现了ImportSelector接口Class? candidateClass candidate.loadClass();//利用反射Class实例化对象这个对象不是代理对象不要搞混了。ImportSelector selector ParserStrategyUtils.instantiateClass(candidateClass, ImportSelector.class,this.environment, this.resourceLoader, this.registry);PredicateString selectorFilter selector.getExclusionFilter();if (selectorFilter ! null) {exclusionFilter exclusionFilter.or(selectorFilter);}if (selector instanceof DeferredImportSelector) {this.deferredImportSelectorHandler.handle(configClass, (DeferredImportSelector) selector);} else {//调用ImportSelector接口里面的selectImports方法拿到返回值Class集合。在通过递归的方式嗲用processImports挨个解析每一个ClassString[] importClassNames selector.selectImports(currentSourceClass.getMetadata());//转成SourceClass集合CollectionSourceClass importSourceClasses asSourceClasses(importClassNames, exclusionFilter);//再次调用processImports方法processImports(configClass, currentSourceClass, importSourceClasses, exclusionFilter, false);}} else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) {。。。。。。} else {//3、ImportSelector和ImportBeanDefinitionRegistrar都没有实现this.importStack.registerImport(currentSourceClass.getMetadata(), candidate.getMetadata().getClassName());//进一步解析其他注解比如Component Import等最后会把configClass注册到Spring容器中。processConfigurationClass(candidate.asConfigClass(configClass), exclusionFilter);}} } 看下instantiateClass方法做了什么 //创建实例对象 static T T instantiateClass(Class? clazz, ClassT assignableTo, Environment environment, ResourceLoader resourceLoader, BeanDefinitionRegistry registry) {ClassLoader classLoader (registry instanceof ConfigurableBeanFactory ? ((ConfigurableBeanFactory) registry).getBeanClassLoader() : resourceLoader.getClassLoader());T instance (T) createInstance(clazz, environment, resourceLoader, registry, classLoader);ParserStrategyUtils.invokeAwareMethods(instance, environment, resourceLoader, registry, classLoader);return instance; }//调用createInstance方法创建实例对象 private static Object createInstance(Class? clazz, Environment environment, ResourceLoader resourceLoader, BeanDefinitionRegistry registry, Nullable ClassLoader classLoader) {Constructor?[] constructors clazz.getDeclaredConstructors();。。。。。。。return BeanUtils.instantiateClass(clazz);//通过Bean的工具类生成实例对象 }
http://www.w-s-a.com/news/509021/

相关文章:

  • 在百度做网站赚钱吗跨境电商网站开发
  • 酒店网站建设策划方案南昌网站建设南昌
  • 临沂罗庄做网站房产cms
  • 五合一网站做优化好用吗网站设计的专业流程
  • 毕业设计论文网站开发需要多少网站seo建设方案
  • h5页面用什么做杭州优化外包哪里好
  • 许昌网站建设百姓国货app下载
  • 什么是建站装修公司做宣传在哪个网站
  • 阿里云虚拟主机多个网站吗大庆油田建设集团网站
  • 坂田公司做网站公司有网站域名后如何建网站
  • 自媒体网站程序淘宝网站维护
  • 凡科网站建设网站wordpress 七牛oss
  • 搬瓦工的主机可以用来做网站吗分类信息网站开发需求方案
  • 上海高端网站开发站霸网络国际网站建设的目的
  • 程序员招聘求职的网站做网站加入广告联盟
  • 网站建设的技术方案模板易做文学网站的logo
  • 建设国家标准官方网站响应式网站切图
  • 网站链接数怎么做wordpress安装网址
  • 沈阳建网站 哪家好如何做旅游网站推销
  • 继续网站建设南通网站建设方法
  • 淮南公司网站建设如果做京东优惠卷的网站
  • 二手房网站平台怎么做项目工程监理公司网站建设方案
  • 秦皇岛做网站公司小说推广平台有哪些
  • php网站做分享到朋友圈天元建设集团有限公司信用代码
  • 邱县做网站在线免费图片编辑器
  • 网站备份网站做网站如何把支付宝微信吧
  • 做网站的怎么获取客户信息晋城建设局网站
  • 新开传奇网站发布网单职业wordpress建站网页无法运作
  • 海南省住房和城乡建设厅官方网站网站开发有哪些语言
  • 网站开发排期表免费网站建设策划