核心容器、Bean、DI

一、Spring Framework系统架构

        
(1)Core Container:核心容器(最核心部分)
【tips】系统架构图是上层依赖下层的关系。
(2)AOP:面向切面编程
         Aspects:对AOP思想进行了实现
(3)Data Access/Integration:数据访问/集成
(4)Web:Web开发
(5)Test:单元测试与集成测试

二、Core Container(IoC容器)

        为解决代码耦合度太高的问题(解耦)——IoC管理Bean+DI。

1.IoC

(1)IoC(Inversion of Control,控制反转)思想:

        使用对象时,再主动new一个对象,而是由外部提供对象。即对象的创建控制权由程序转移到外部,该思想称为IoC(控制反转)。
【tips】Spring提供了这样一个外部容器(IoC容器,即核心容器),用来充当IoC思想里的“外部”,提供程序所需的对象。

(2)IoC容器的作用:

        负责对象的创建和初始化工作,被创建或管理的对象在IoC容器中统称为Bean

2.DI

(1)DI(Dependency Injection,依赖注入)思想:

        在IoC容器中建立Bean与Bean之间依赖关系的这个过程,称为依赖注入。
【tips】将“有依赖的关系的”Bean进行关系绑定,如Service与Dao

(2)作用:

        使用对象时不仅可以直接从IoC容器中获取,并且获取到的Bean都已绑定了所有的依赖关系。

3.IoC和DI的使用

(1)导入Spring坐标

        

(2)定义Spring管理的类(接口)

        不new对象,利用DI思想,通过set方法获得对象。
        

(3)创建Spring Config配置文件,配置对应类作为Bean,配置绑定依赖关系

        放在resources下,起名applicationContext.xml

        1)在<bean>里配置Bean

        

        2)配置绑定依赖关系

        “property”:属性标签
        “name”:要获得的不new的那个对象
        “ref”:要参照的那个xml中的Bean的id
        
【tips】谁要用这个对象,就在谁的<Bean>里配置绑定关系。

(4)创建IoC容器,通过该容器获取Bean

        1)创建IoC容器,加载配置文件

        2)获取Bean

        

(5)调用方法

4.Bean详解

(1)Bean的详细配置

        

(2)Bean的实例化 

        Bean的本质就是对象,那么如何创建Bean呢?

        1)方法一:构造方法实例化Bean(常用)

                通过无参构造方法创建Bean对象。
【tips】若没有无参构造方法,则报错:BeanCreationException。
        2)方法二:静态工厂实例化Bean(了解)
                静态工厂:
                
                配置:
                
        3)方法三:实例工厂实例化Bean(了解)
                实例工厂:
                
                配置:先配置工厂Bean,再配置Dao的Bean:
                

        4)方法四:FactoryBean实例化Bean(★)

                ①创建XxxFactoryBean,实现FactoryBean<T>接口
                
               ②配置
                

(3)Bean的生命周期

        1)初始化容器

                ①创建对象,分配内存
                ②执行构造方法
                ③执行属性注入(set操作)
                ④执行Bean初始化方法

        2)使用Bean

                执行业务操作

        3)关闭/销毁容器

                执行Bean销毁方法
【tips】①容器关闭前,触发Bean的销毁方法
             ②关闭容器的两种方式子:
                    a.手动关闭:
                            ClassPathXmlApplicationContext接口的close()方法
                    b.注册关闭钩子,在虚拟机退出前先关闭容器再退出:
                            ClassPathXmlApplicationContext接口registerShutdownHook()方法

(4)Bean的生命周期控制

        “控制”:指的是在生命周期内想做什么事情。

        1)方法一:使用配置方式进行生命周期控制

                ①创建后控制
                        比如想在Bean创建后输出一句话“init...”:
                        a.创建初始化控制方法
                        
                        b.配置该Bean的init-method
                        
               ②销毁前控制
                        比如想在Bean销毁前输出一句话“destory...”:
                        a.创建销毁控制方法
                        
                        b.配置该Bean的destory-method
                        

        2)使用接口方式进行生命周期控制

                让Bean对象实现InitializingBeanDisposableBean接口,重写afterPropertiesSetdestroy两个方法。

三、依赖注入(DI)

1.依赖注入的方式——两种类型两种方法

(1)引用类型

        1)setter注入

                a.在bean对象中定义引用类型属性,并提供可访问的set方法
                
               b.在<bean></bean>中用<property>标签的name(bean中定义的引用类型名)和ref属性注入需要的引用类型对象
                

        2)构造器(constructor)注入

                a.在bean对象中定义引用类型属性,并提供可访问的构造方法
                
                b.在<bean></bean>中用<constructor-arg>标签的name(构造方法的参数名)和ref属性注入需要的引用类型对象
                

(2)简单类型(基本数据类型和String)

        1)setter注入

                a.在bean中定义简单类型属性,并提供可访问的set方法
                
                b.在<bean></bean>中用<property>标签的name(bean中定义的简单类型名)和value(简单类型的值)注入需要的简单类型数据
                

        2)构造器注入

                a.在bean中定义简单类型属性,并提供可访问的构造方法
                
                b.在<bean></bean>中用<constructor-arg>标签的name(构造方法的参数名)和value(简单类型的值)注入需要的简单类型数据
                

2.依赖注入方式的选择

(1)强制依赖使用构造器注入(使用setter注入有可能不进行注入而导致null对象出现),可选依赖使用setter注入,灵活性强;
(2)实际开发时还要根据实际情况分析,如果受控对象没有提供setter方法,就必须使用构造器注入;
(3)自己开发的模块推荐使用setter注入

3.依赖自动装配

        IoC容器根据Bean所依赖的资源在容器中自动查找并注入到Bean中的过程称为自动装配。

(1)自动装配的使用

        配置中用bean标签的autowire属性进行自动装配。

(2)自动装配的方式

        1)★按类型(byType)

                要求类型唯一;

        2)按名称(byName)

                要求配置的受控Bean的id与定义的受控对象名相同,高耦合,不推荐使用。
【注意】①要有可访问的set方法②要配置受控的Bean

(3)注意事项

        1)自动装配仅适用于依赖注入引用类型,不能对简单类型进行操作;
        2)自动装配的优先级低于setter注入和构造器注入,同时出现时自动装配将失效。

4.集合注入

        集合采用setter注入,需先定义集合对象并提供set方法,再配置:
        

(1)Array

        
【tips】集合注入的配置格式相似,用<property>的name属性表示定义的集合名,在<property></property>中用对应集合的标签和格式设置集合的值。

(2)List

        

(3)Set

        

(4)Map

        

(5)Properties

        

四、容器

1.两种创建容器的方式

(1)★通过加载类路径(项目下的src)下的配置文件创建容器

        

(2)从文件系统下加载配置文件创建容器、

        需要的是配置文件的绝对路径(absolute path):
        
        

2.三种获取Bean的方式

(1)通过Bean的id获取Bean,需类型强转

        

(2)通过Bean的id和数据类型字节码文件获取Bean,无需强转

        

(3)通过Bean的类型字节码文件获取Bean,需要配置文件中类型唯一

        

3.容器类层次结构图

          

(1)通过BeanFactory初始化Bean(了解)

        

(2)BeanFactory与ClassPathXmlApplicationContext的不同

        BeanFactory创建完毕后,所有的Bean均为延迟加载;后者创建完毕后为立即加载。后者若想延迟加载,需在配置时将lazy-init属性设置为true


全部评论

相关推荐

面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务