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

电商网站建设懂你所需北京通智能小程序

电商网站建设懂你所需,北京通智能小程序,达内教育学费价目表,深圳规划建设局网站宏观上看Spring创建对象的过程 对于对象而言,可以分为简单对象和复杂对象; 简单对象 简单对象指可以直接new的对象; Spring在创建这些对象时,是基于反射来完成的。复杂对象 复杂对象指不能直接new的对象。 比如:要得到…

宏观上看Spring创建对象的过程

对于对象而言,可以分为简单对象复杂对象

  • 简单对象

    简单对象指可以直接new的对象;
    Spring在创建这些对象时,是基于反射来完成的。
    
  • 复杂对象

    复杂对象指不能直接new的对象。
    比如:要得到接口类型的对象,是不能直接new的,需要使用其实现类来创建。但是有的其实现类也是不能直接new的,比如Connection对象。
    对于这种对象,可以使用实现FactoryBean接口的方式来创建;需要实现三个方法:getObject()   ------>  书写位置 ----->  Spring工厂 回调 getObject()获得对象getObjectType()isSingleton()
    也可以使用静态工厂或者实例工厂来创建;
    静态工厂:MyFactory{public static Object getObject(){xxxxxxxxx}}<bean id="" class="xxx.MyFactory"  factory-method="getObject"/>  实例工厂:MyFactory{public Object getObject(){}}<bean id="myFactory" class="xxx.MyFactory"/><bean id="product"  factory-bean="myFactory" factory-method="getObject"/>

    这仅仅完成了对象的创建。我们还要考虑为对象属性进行赋值(也称为属性的注入)。

Spring为创建的对象注入属性

注入的方式:

  • set注入

    <bean id="u" class=""><property > ----------set注入
    </bean>
    

    会有两种注入的形式

    • 程序员自己完成的注入

      可以注入8种基本类型、自建类型(通过ref=)的bean;

    • Spring容器自己的注入(aware)

      实现BeanNameAware接口,实现void setBeanName(String name)方法,Spring容器自动调用它【谁调用谁就会传参】,可以获取当前对象在工厂中的id(beanName),定义一个变量把它存起来就可以了;
      实现BeanFactoryAware接口,实现void setBeanFactory(BeanFactory beanFactory)方法,Spring容器自动调用它,可以获取创建当前对象的工厂对象,定义一个变量把它存起来就可以了。BeanFactoryAware接口的应用场景:可以解决scope=prototype在注入过程中失效的问题。比如类A是单例的,类B是多例的,类A中有类B的成员变量b,如果用set注入,每一次获取都是一样的地址,因为类A对象已经被创建出来,并存储到容器里了,再获取成员变量b时,没有为其重新赋值。我们可以获取到工厂,每次在a中使用b时,都从容器中获取一次。
      scope=prototype在注入过程中失效的解决方式还有一个,lookup-method = ,但是用的少
      

      这两种方式先后顺序是怎样的呢?——用户自己设置的set注入在前,容器的注入在后。

  • 构造注入

    <bean id="u" class=""><constructor-arg >——————构造注入
    </bean>
    
  • autowire自动注入

    如果在beans配置,beans管理的所有bean都会自动注入

    beans自动注入

    如果在bean配置,此bean的属性会自动注入;

    自动注入

工厂创建对象的完整流程

宏观上看Spring创建对象的过程

  1. Spring工厂创建对象;
  2. 对属性进行set注入(用户的set注入在前,实现Aware接口容器的set注入在后);
  3. set注入完成后得到的对象交给BeanPostProcessor中的postProcessBeforeInitialization(Object bean, String beanName)方法为对象进行加工(参数bean就是待加工的bean,返回值为加工好的bean);
  4. 为postProcessBeforeInitialization方法加工后的对象进行初始化,有两种方式: 第一种方式实现InitializingBean接口(在前)、第二种方式 指定init-method方法(在后);
  5. 初始化后的对象,交给BeanPostProcessor中的postProcessAfterInitialization(Object bean, String beanName)方法为对象进行加工(参数bean就是待加工的bean,返回值为加工好的bean);
  6. 最后得到加工好的对象,用户可以进行使用;
  7. 工厂调用destroySingletons()方法,工厂关闭,销毁对象。

问题:为什么还需要实现BeanPostProcessor接口为其增加功能,不能在创建对象时,直接写好呢?

答案:BeanPostProcessor接口中的方法,可以为多个对象增加功能,代码可以复用,减少代码的冗余;

加功能是可有可无的功能,如果需要可以加上,如果不需要就取消掉,可以解决代码的耦合。

问题:一般在BeanPostProcessor接口的哪个方法为对象增加功能呢?

答案:postProcessAfterInitialization方法,因为前面已经初始化完成了,后续没有在对bean的操作了;如果在postProcessBeforeInitialization中为对象进行加工,后续可能还会改。

注意:BeanPostProcessor的功能,只有在高级的工厂(比如ApplicationContext)才有。

注意:第5步的初始化操作,和BeanPostProcessor的方法,在开发中我们一般不用。

Spring BeanFactory源码中是如何创建对象的

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(""));
beanFactory.getBean("id");

第一行代码的作用:

读取xml文件,解析bean标签,封装成BeanDefinition对象,并以id为key,BeanDefinition对象为value存储到map中;

第二行代码的作用:

1.基于BeanDefinition创建对象;
2.创建对象的过程,包括前文生命周期中除销毁的步骤;
3.创建对象的过程中,需要按照scope进行讨论:scope=singleton——单例对象,Spring中使用map结构(key为bean的id,value为bean)来保证永远只创建一次;scope=prototype——每次都走一遍创建对象的流程。
http://www.yayakq.cn/news/729265/

相关文章:

  • 网站建设与维护的软件南昌简单做网站
  • 淘宝网站是用什么开发的给客户做网站图片侵权
  • 天河做网站要多少钱常熟做网站公司
  • 简述网站建设的五类成员网站外链建设可以提升网站
  • 做网站开发学什么中小企业网站建设应该注意什么事项
  • 宣传片制作公司前景搜索引擎优化名词解释
  • 企业网站的建设怎么收费打开网站弹出qq对话框
  • asp技术做网站html网页制作菜鸟教程
  • 重庆设计网站网站建设项目申请书
  • 网站开发的需求网站开发价位评估
  • 晋城商城网站开发设计没有网站做淘宝客
  • 桃城网站建设江苏网站建设
  • 在哪个网站可以做车年检甘肃省建设厅执业资格注册中心网站通知
  • 制作网站的步骤怎么破解wordpress模板
  • 网络游戏网站网址大全百度渠道开户
  • 广州企业网站制作哪家好seo代码优化
  • 自建站需要多少钱网站推荐入口
  • 建平县网站建设wordpress调用tag标签
  • 网站做的漂亮的企业查询网站mx记录
  • tp框架网站开发参考文献有没有免费推广的app
  • 广州网站设计建站网站改版 程序变了 原来的文章内容链接地址 打不开怎么办
  • 成都网站优化方案网站前后台代码
  • 怎么下载别人网站模板亿网行网站建设
  • 建设工程项目管理网站福建省建设厅招标网站
  • 网上注册网站要钱吗做网站保定
  • 青岛网站建设搜q.479185700海南百度首页广告
  • 网站后台管理系统ie8用不了手机网站开发+图库类
  • 免费个人网站自助建设北京建设官网证书查询
  • 广州市平安建设 网站wordpress 游客
  • 在广州开发一个营销网站多少钱周口集团网站建设