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

专业足球网站开发沈阳市工伤网站做实

专业足球网站开发,沈阳市工伤网站做实,wordpress 登录没反应,怎样登陆wordpressBeanFactory 功能介绍 BeanFactory 是核心容器#xff0c;负责管理 Bean 对象 BeanFactory 接口的功能只有一个 getBean() 方法BeanFactory 的实现类#xff08;DefaultListableBeanFactory#xff09;包含#xff1a;控制反转、基本的依赖注入、Bean 生命周期的各种功能… BeanFactory 功能介绍 BeanFactory 是核心容器负责管理 Bean 对象 BeanFactory 接口的功能只有一个 getBean() 方法BeanFactory 的实现类DefaultListableBeanFactory包含控制反转、基本的依赖注入、Bean 生命周期的各种功能不能只考虑接口功能 SpringBootApplicationpublic class SpringApplicationMain {SneakyThrowspublic static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(SpringApplicationMain.class, args);ConfigurableListableBeanFactory beanFactory context.getBeanFactory();// 通过反射方式来获取私有成员变量Field singletonObjectsField DefaultSingletonBeanRegistry.class.getDeclaredField(singletonObjects);singletonObjectsField.setAccessible(true);MapString, Object singletonObjects (MapString, Object) singletonObjectsField.get(beanFactory);// 事先已经通过注解为Spring容器中注入两个以component_开头的组件, 这里过滤得到singletonObjects.entrySet().stream().filter(e - e.getKey().startsWith(component_)).forEach(e - System.out.println(e.getKey() e.getValue()));}}文章主线 DefaultListableBeanFactory默认实现类 手动向 BeanFactory 容器中注入 BeanDefinitionBean对象 方式一 public class BeanFactoryApplication {public static void main(String[] args) {DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();// 1. 注册BeanDefinitionBeanDefinitionRegistry registry beanFactory;RootBeanDefinition studentBeanDefinition new RootBeanDefinition(Student.class);RootBeanDefinition teacherBeanDefinition new RootBeanDefinition(Teacher.class);registry.registerBeanDefinition(studentBean, studentBeanDefinition);registry.registerBeanDefinition(teacherBean, teacherBeanDefinition);// 2. 依赖注入的两种方式(二选一即可)// 2.1 通过构造器方式进行依赖关系的注入ConstructorArgumentValues argumentValues new ConstructorArgumentValues();argumentValues.addIndexedArgumentValue(0, teacherBeanDefinition);argumentValues.addIndexedArgumentValue(1, student);studentBeanDefinition.setConstructorArgumentValues(argumentValues);// 2.2 通过setter方法进行依赖关系的注入// MutablePropertyValues propertyValues new MutablePropertyValues();// propertyValues.addPropertyValue(new PropertyValue(teacher, teacherBeanDefinition));// propertyValues.addPropertyValue(new PropertyValue(name, student));// studentBeanDefinition.setPropertyValues(propertyValues);Student student beanFactory.getBean(Student.class);System.out.println(student);} }方式二 public class SpringApplicationMain {//TODO: 此时的 BeanFactory 缺乏解析 Bean 和 Configuration 等注解的能力public static void main(String[] args) {// 1. 默认的 BeanFactory 容器DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();// 2. 创建 BeanDefinitionBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class).setScope(singleton).getBeanDefinition();// 3. 向容器中添加 BeanDefinition自定义组件名beanFactory.registerBeanDefinition(myComponentName, beanDefinition);// 4. 输出容器中的 Beanfor (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}} }使用 BeanFactoryPostProcessor 解析 Bean 注解 此时 BeanFactory 并没有具备解析 Configuration 和 Bean 的能力还需要额外做两件事情 添加专门处理 Configuration 的 BeanFactoryPostProcessor后置处理器这里也就是 ConfigurationClassPostProcessor让这些 BeanFactoryPostProcessor 作用到 BeanFactory 中的对象 public class BeanPostProcessorDemo {public static void main(String[] args) {DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();RootBeanDefinition myConfig new RootBeanDefinition(MyConfig.class);beanFactory.registerBeanDefinition(MyConfig.class.getName(), myConfig);// AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);// 1. 模拟上面方法的行为注册固定的几个BeanDefinition封装到BeanDefinitionHolder中SetBeanDefinitionHolder beanDefinitionHolders new LinkedHashSet(8);RootBeanDefinition configurationClassPostProcessorBeanDefinition new RootBeanDefinition(ConfigurationClassPostProcessor.class);String configurationBeanName ConfigurationClassPostProcessor.class.getName();beanFactory.registerBeanDefinition(configurationBeanName, configurationClassPostProcessorBeanDefinition);BeanDefinitionHolder beanDefinitionHolder new BeanDefinitionHolder(configurationClassPostProcessorBeanDefinition, configurationBeanName);beanDefinitionHolders.add(beanDefinitionHolder);// Configuration对应BeanFactoryPostProcessor注解和处理器之间并不是一对一的关系而是多对一// 2. 将BeanFactoryPostProcessor应用到BeanFactory工厂上MapString, BeanFactoryPostProcessor beanFactoryPostProcessorMap beanFactory.getBeansOfType(BeanFactoryPostProcessor.class);beanFactoryPostProcessorMap.values().forEach(beanFactoryPostProcessor - {beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);});for (String beanName : beanFactory.getBeanDefinitionNames()) {System.out.println(beanName beanName);}} }流程 在 Configuration 注解对应的 BeanFactoryPostProcessor 的处理过程中存在 this.environment new StandardEnvironment() 设置 Environment 对象的语句。关键代码 ConfigurationClassParser 中的 doProcessConfigurationClass() 方法其中先处理 Configuration 标注的配置类上的其它注解例如 Import、ImportSource 等。在方法的最后部分才去处理 Bean 注解称之为 BeanMethod。在解析 Bean 得到的 BeanDefinition 没有设置 BeanClassConfiguration 标注的配置类被作为 Bean 标注的 BeanMethod 产生的 BeanDefinition 的 FactoryBean也就是说 Configuration 作为 Bean 的工厂而这个方法BeanMethod本身作为 FactoryMethod。小结Bean 标注在方法上可以产生 BeanDefinition对于这个 BeanDefinition 而言方法所在的配置类就是 FactoryBean方法就是 FactoryMethod。processCommonDefinitionAnnotations 方法是在解析和 BeanDefinition 有关的其它属性值例如 lazyInitprimary 等。在 Configuration 注解处理完之后会使用 Enhancer 来对配置类进行增强动态代理。对于 Spring 框架没有将 Cglib 作为外部依赖引入而是在项目内重写从包路径可以看出这种方式称为内嵌 cglib。那内嵌 tomcat 也是如此。在 enhanceConfigurationClasses 方法的逻辑中会通过 beanDef.setBeanClass(enhancedClass); 用生成的代理类来替换掉 beanDef 中的目标类MyConfig.class来作为 beanDefinition的 beanClass。 疑问 BeanNameGenerator generator (BeanNameGenerator) sbr.getSingleton(AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR);这里的 getSingleton() 似乎也是从 BeanFactory 中获取的但是并没有注入啊并且在前面 debug 的过程中也发现此时的容器中只有两个 BeanDefinition。答所以这里返回的是 null。AnnotatedBeanDefinition 对应什么在多个地方看到判断目前已知的信息使用 Bean 创建出来的 BeanDefinition 属于 ConfigurationClassBeanDefinition这是一个私有内部类继承了 RootBeanDefinition并且实现了 AnnotatedBeanDefinition 接口。从 AnnotatedBeanDefinition 中的方法可以看出可以得到 Metadata 和 FactoryMethodMetadata分别对应所属于的类和方法。abd.resolveBeanClass(this.beanClassLoader);这行代码返回值并没有使用单纯为了检查是否合法吗 使用 BeanPostProcessor 解析 Autowired 注解 // TODO: 为什么多了一个ImportRegistry对象 // 总结BeanFactory不会做的事情 // 1. 不会主动调用 BeanFactoryPostProcessor // 2. 不会主动添加 BeanPostProcessor // 3. 不会解析BeanFactory // 4. 不会解析#{}和${} public class AutowiredAnnotationBeanPostProcessorDemoV3 {public static void main(String[] args) {DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();RootBeanDefinition configurationBeanDefinition new RootBeanDefinition(MyConfigV3.class);beanFactory.registerBeanDefinition(MyConfigV3.class.getSimpleName(), configurationBeanDefinition);// 同样需要先处理BeanRootBeanDefinition configurationAnnotationProcessorBeanDefinition new RootBeanDefinition(ConfigurationClassPostProcessor.class);beanFactory.registerBeanDefinition(ConfigurationClassPostProcessor.class.getSimpleName(), configurationAnnotationProcessorBeanDefinition);// 再处理AutowiredRootBeanDefinition autowiredAnnotationProcessorBeanDefinition new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);beanFactory.registerBeanDefinition(AutowiredAnnotationBeanPostProcessor.class.getSimpleName(), autowiredAnnotationProcessorBeanDefinition);MapString, BeanFactoryPostProcessor beanFactoryPostProcessorMap beanFactory.getBeansOfType(BeanFactoryPostProcessor.class);beanFactoryPostProcessorMap.values().forEach(beanFactoryPostProcessor - {beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);});// 注意这里不能调用getBean()因为还没有添加BeanPostProcessor此时创建的Bean没有被BeanPostProcessor增强就放入到Spring容器中// 后面再获取Bean也是直接从容器中获取不会再经历Bean的生命周期去创建一次// MapString, Object beansBeforePostProcessor beanFactory.getBeansOfType(Object.class);// beansBeforePostProcessor.forEach((beanName, bean) - {// System.out.println();// System.out.println(beanName beanName);// System.out.println(bean bean);// });// 之前registerBeanDefinition只是将这个类型作为BeanDefinition// 只有调用addBeanPostProcessor()才代表将其作为BeanPostProcessor// 这里和BeanFactoryPostProcessor是有区别的MapString, BeanPostProcessor beanPostProcessorMap beanFactory.getBeansOfType(BeanPostProcessor.class);beanPostProcessorMap.values().forEach(beanFactory::addBeanPostProcessor);// 在这里相当于提前调用了一遍getBean()beanFactory.preInstantiateSingletons();MapString, Object beansAfterPostProcessor beanFactory.getBeansOfType(Object.class);beansAfterPostProcessor.forEach((beanName, bean) - {System.out.println();System.out.println(beanName beanName);System.out.println(bean bean);});} }不同 BeanPostProcessor 之间的排序规则 源码解析 注册 BeanregisterBeanDefinition 方法 BeanDefinition 实例都保存在 BeanFactory 的 MapString, BeanDefinition 结构中因此只需要记录 beanName就可以从 BeanFactory 中获取到 BeanDefinition 实例。 字段描述scope默认提供 singleton 和 prototype 两种其它类型属于 web 的扩展parentName父 Bean 对象的 beanNamebeanClassNameBean 对象的全类名lazyInitBean 对象是否懒加载dependsOn依赖的所有 Bean 的 beanNameprimaryBean 是否是同类型优先级最高的factoryBeanNameFactoryBean 的 beanNamefactoryMethodName工厂方法名constructorArgumentValues构造器参数mutablePropertyValues 如果alreadyCreated集合中存在BeanDefinition那么会加锁因为Map是无序的因此使用beanDefinitionNames来保存添加BeanDefinition的顺序 public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {if (beanDefinition instanceof AbstractBeanDefinition) {((AbstractBeanDefinition) beanDefinition).validate();}BeanDefinition existingDefinition this.beanDefinitionMap.get(beanName);// beanName重复的情况更新beanDefinitionMapif (existingDefinition ! null) {// 如果不允许Bean覆盖即不允许出现两个重名的Bean那么抛出异常。这是默认配置的情况if (!isAllowBeanDefinitionOverriding()) {throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);}this.beanDefinitionMap.put(beanName, beanDefinition);}else {// alreadyCreated中存在BeanDefinition的情况会为beanDefinitionMap加锁// TODO: 这里是一段重点代码多次出现类似加锁的情况为什么要加锁为什么要这么处理// 判断是否有其它的Bean开始初始化if (hasBeanCreationStarted()) {synchronized (this.beanDefinitionMap) {this.beanDefinitionMap.put(beanName, beanDefinition);ListString updatedDefinitions new ArrayList(this.beanDefinitionNames.size() 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames updatedDefinitions;removeManualSingletonName(beanName);}}else {// 一般情况下进入到该分支this.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);removeManualSingletonName(beanName);}this.frozenBeanDefinitionNames null;}if (existingDefinition ! null || containsSingleton(beanName)) {resetBeanDefinition(beanName);}else if (isConfigurationFrozen()) {clearByTypeCache();} }使用 BeanFactoryPostProcessor 解析 Configuration 配置类 附录 BeanFactoryPostProcessor 层次体系 图BeanFactoryPostProcessor 的层次体系结构 BeanPostProcessor 体系 图BeanPostProcessor 的层次体系结构 BeanPostProcessor描述AutowiredAnnotationBeanPostProcessor解析 Autowired 注解CommonAnnotationBeanPostProcessor解析 Resource 等 JDK 注解
http://www.pierceye.com/news/344312/

相关文章:

  • 建设旅行网站策划书浙江省职业能力建设处网站
  • 网站项目建设的组织机构wordpress做登录
  • 定制杯子岳阳优化营商环境
  • 中学院新校区建设专题网站如何搭建网络教学平台
  • 网站开发课程设计体会房地产查询官网
  • 网站建设 响应式 北京出口外贸网站建设
  • 做网站图片格式做旅游网站的yi
  • 公司网站做二维码网址人防门电气图纸符号大全久久建筑网
  • 电商网站特点中国制造网怎么注册
  • 酒店网站建设便宜酒店设计
  • 东莞网站建设规范新版wordpress编辑
  • 自己的简历网站怎么做工业网页设计欣赏
  • 建设银行苏州官网招聘网站未明潮网站建设保密协议
  • 河南省住房和城乡建设厅查询网站叫外包公司做网站不肯给源代码的
  • 手机站模板权威发布是指什么
  • 青岛开发区做网站做网站的公司上海
  • 哈尔滨自助建站平台如何让网站火起来
  • 高州手机网站建设公司静态网页有哪些网站
  • 格兰仕网站开发方案表情包生成器在线制作
  • 便捷网站建设公司网站网页建设实训心得
  • 怎样做国外能看到的网站计算机大专生的出路
  • jsp网站开发四库全书怀化市住房与城乡建设厅网站
  • 组装电脑报价网站源码设计教育教学活动的注意事项
  • 杭州做网站外包公司哪家好wordpress标题字数
  • 设计素材网站源码深圳品牌设计公深圳品牌设计公司
  • 百度地图 企业网站给wordpress公告
  • wap网站编辑器目录在标题后 wordpress
  • 网站正在建设中亚洲wamp 设置多个网站
  • 网上注册公司流程及材料sem seo是什么意思呢
  • 网站开发后所有权广州市官网网站建设