做网站好看的背景图片,优质手机网站建设哪家好,官方网站如何做,wordpress制作上传图片宏观上看Spring创建对象的过程
对于对象而言#xff0c;可以分为简单对象和复杂对象#xff1b; 简单对象 简单对象指可以直接new的对象#xff1b;
Spring在创建这些对象时#xff0c;是基于反射来完成的。复杂对象 复杂对象指不能直接new的对象。
比如#xff1a;要得到…宏观上看Spring创建对象的过程
对于对象而言可以分为简单对象和复杂对象 简单对象 简单对象指可以直接new的对象
Spring在创建这些对象时是基于反射来完成的。复杂对象 复杂对象指不能直接new的对象。
比如要得到接口类型的对象是不能直接new的需要使用其实现类来创建。但是有的其实现类也是不能直接new的比如Connection对象。
对于这种对象可以使用实现FactoryBean接口的方式来创建需要实现三个方法getObject() ------ 书写位置 ----- Spring工厂 回调 getObject()获得对象getObjectType()isSingleton()
也可以使用静态工厂或者实例工厂来创建
静态工厂MyFactory{public static Object getObject(){xxxxxxxxx}}bean id classxxx.MyFactory factory-methodgetObject/ 实例工厂MyFactory{public Object getObject(){}}bean idmyFactory classxxx.MyFactory/bean idproduct factory-beanmyFactory factory-methodgetObject/ 这仅仅完成了对象的创建。我们还要考虑为对象属性进行赋值也称为属性的注入。
Spring为创建的对象注入属性
注入的方式 set注入 bean idu classproperty ----------set注入
/bean会有两种注入的形式 程序员自己完成的注入 可以注入8种基本类型、自建类型通过ref的bean Spring容器自己的注入aware 实现BeanNameAware接口实现void setBeanName(String name)方法Spring容器自动调用它【谁调用谁就会传参】可以获取当前对象在工厂中的id(beanName)定义一个变量把它存起来就可以了
实现BeanFactoryAware接口实现void setBeanFactory(BeanFactory beanFactory)方法Spring容器自动调用它可以获取创建当前对象的工厂对象定义一个变量把它存起来就可以了。BeanFactoryAware接口的应用场景可以解决scopeprototype在注入过程中失效的问题。比如类A是单例的类B是多例的类A中有类B的成员变量b如果用set注入每一次获取都是一样的地址因为类A对象已经被创建出来并存储到容器里了再获取成员变量b时没有为其重新赋值。我们可以获取到工厂每次在a中使用b时都从容器中获取一次。
scopeprototype在注入过程中失效的解决方式还有一个lookup-method 但是用的少这两种方式先后顺序是怎样的呢——用户自己设置的set注入在前容器的注入在后。 构造注入 bean idu classconstructor-arg ——————构造注入
/beanautowire自动注入 如果在beans配置beans管理的所有bean都会自动注入 如果在bean配置此bean的属性会自动注入
工厂创建对象的完整流程 Spring工厂创建对象对属性进行set注入用户的set注入在前实现Aware接口容器的set注入在后set注入完成后得到的对象交给BeanPostProcessor中的postProcessBeforeInitialization(Object bean, String beanName)方法为对象进行加工参数bean就是待加工的bean返回值为加工好的bean为postProcessBeforeInitialization方法加工后的对象进行初始化有两种方式 第一种方式实现InitializingBean接口在前、第二种方式 指定init-method方法在后初始化后的对象交给BeanPostProcessor中的postProcessAfterInitialization(Object bean, String beanName)方法为对象进行加工参数bean就是待加工的bean返回值为加工好的bean最后得到加工好的对象用户可以进行使用工厂调用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为keyBeanDefinition对象为value存储到map中第二行代码的作用
1.基于BeanDefinition创建对象
2.创建对象的过程包括前文生命周期中除销毁的步骤
3.创建对象的过程中需要按照scope进行讨论scopesingleton——单例对象Spring中使用map结构key为bean的idvalue为bean来保证永远只创建一次scopeprototype——每次都走一遍创建对象的流程。