Spring Framework的核心:Spring IoC

Spring Framework的核心:Spring IoC View Code

Spring Framework的核心:Spring IoC View Code

运行以上程序,在控制台上将打印出以下信息:

Car [brand=红旗, color=黑色, maxSpeed=400]
Car [brand=黑旗, color=红色, maxSpeed=200]

2.2  Java反射机制

        Class反射对象描述类语义结构,可以从Class对象中获取构造函数,成员变量,方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义,下面是最主要的三个反射类:

        Constructor:类的构造函数反射类。通过Class#getConstructors()方法可以获得类的所有构造函数反射对象数组。Constructor的一个主要方法是newInstance(Object[] initargs),通过该方法可以创建一个对象类的实例,相当于new关键字。

        Method:类方法的反射类。通过Class#getMethod()方法可以获得类的所有方法反射类对象数组。

        Field:类的成员变量的反射类,通过Class#getDeclaredFields()方法可以获得类的成员变量反射对象数组。

3  IoC基础

3.1  思维理解

        控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。在没有IoC的程序中,我们使用面向对象编程对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。

Spring Framework的核心:Spring IoC

3.2  具体实现

        IoC是Spring框架的核心内容,使用多种方式完美地实现了IoC,在实际开发中,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IoC容器中取出需要的对象。

Spring Framework的核心:Spring IoC

4  使用XML配置的方式实现IOC

        假设项目中需要完成对图书的数据访问服务,我们定义好IBookDAO接口和BookDAO实现类。

        创建maven项目:

Spring Framework的核心:Spring IoC

        IBookDAO接口如下:

Spring Framework的核心:Spring IoC IBookDAO

        BookDAO实现类如下:

Spring Framework的核心:Spring IoC BookDAO

        Maven项目的pom.xml如下:

Spring Framework的核心:Spring IoC pom.xml

        业务类BookService如下:

Spring Framework的核心:Spring IoC BookService

        容器的配置文件IoCBeans01.xml如下:

Spring Framework的核心:Spring IoC IoCBeans01.xml

        测试类如下:

Spring Framework的核心:Spring IoC IoCTest

        运行结果:

        Book 《Spring MVC权威指南 第一版》 is stored.
        Book 《Spring MVC权威指南 第一版》adds successfully!

4.1  通过属性赋值

        Address地址类:

Spring Framework的核心:Spring IoC Address

        配置文件IoCBeans02.xml如下:

Spring Framework的核心:Spring IoC IoCBeans02.xml

       测试代码:

Spring Framework的核心:Spring IoC AddressTest

        运行结果:

        Address{country='中国', city='珠海'}

4.2  回调方法

4.2.1  初始化函数

        Student学生类:

Spring Framework的核心:Spring IoC Student

        配置文件IoCBeans03.xml如下:

Spring Framework的核心:Spring IoC IoCBeans03.xml

       测试代码:

Spring Framework的核心:Spring IoC StudentTest

        运行结果:

        init......
        Student{name='张柏芝', height=195}

5  使用Spring注解配置IoC

5.1  修改BookDAO

Spring Framework的核心:Spring IoC BookDao

        在类上增加了一个注解Component,在类的开头使用了@Component注解,它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。

        除了@Component外,Spring还提供了3个功能和@Compont等效的注解:

        @Repository  用于对DAO实现类进行注解

        @Service  用于对业务层进行注解

        @Repository  用于对控制层进行注解

5.2  修改BookService

Spring Framework的核心:Spring IoC BookService

        将构造方法中的代码直接写在storeBook方法中,避免循环加载的问题。

5.3  修改IoC配置文件IoCBeans01.xml

Spring Framework的核心:Spring IoC IoCBeans01.xml

5.4  测试类

Spring Framework的核心:Spring IoC IoCTest

5.5  运行结果:

        Book 《Spring MVC权威指南 第一版》 is stored.
        Book 《Spring MVC权威指南 第一版》adds successfully!

6  自动装配

6.1  修改BookDAO

Spring Framework的核心:Spring IoC BookDAO

6.2  修改BookService

Spring Framework的核心:Spring IoC BookService

6.3  运行结果:

        Book 《Spring MVC权威指南 第一版》 is stored.
        Book 《Spring MVC权威指南 第一版》adds successfully!

6.4  装配注解

        主要有:@Autowired、@Qualifier、@Resource,它们的特点是:

        1、@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

        2、@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

        3、@Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;如果Maven项目是1.5的JRE则需换成更高版本的。

        4、@Resource和@Autowired都可以书写注解在字段或者该字段的setter方法之上

        5、@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的注解对象是成员变量、方法入参、构造函数入参。

        6、@Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

        7、@Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个,通过属性required可以设置非必要。

        8、@Resource装配顺序
          8.1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
          8.2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
          8.3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
          8.4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

7  总结

7.1

        @Compent 要求Spring容器管理,被Spring扫描,应用于不确定的功能(宽泛)
        @Repository 应用于数据访问层 DAO
        @Service 应用于业务层
        @Controller 应用于控制层
        注解要被Spring容器管理的类 -> 配置文件指定要扫描的包 ->初始化容器,获得bean

7.2

        @Autowired 自动装配,字段(成员变量)、方法、属性、构造, 不支持指定名称,配合@Qualifier
        @Resource 自动装配,指定名称,指定类型,不属于Spring javax
        @Qualifier 在自动装配时指定对象的名称,避免多个不唯一的实例