[spring]实例化对象(静动态工厂)

发布于:2024-12-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

    在前面文章的例子当中,我们都创建了Bean对象。spring里常用的获取类的实例化对象有几种方式:构造函数获取Bean对象、静态和动态工厂获取Bean对象、实现FactoryBean规范。

    因为一些步骤没有什么别的不同,所以我不会重复去讲,届时会简单略过,如果有什么疑问可以先去看我之前的文章:使用spring

构造函数获取Bean对象

    使用构造函数又分有参构造函数和无参构造函数。当然不是让你自己直接以new的方式获取实例对象。下面讲解详细步骤。

    同样的,我们要有一个实体类,这里我创建一个User类,为了方便,我还添加了有参构造函数和两个属性跟对应的setter方法。该标题下的内容后续都使用给该User类来进行讲解。

使用无参构造函数

    使用无参构造方法非常简单。我们直接在Bean的xml配置文件里面给该类配上<bean>即可,而且只需要配置class属性就可以了,不过为了方便,还是添加一个标识名user:

     然后就可以直接编写测试类来获取了。

 使用有参构造函数

    与使用无参构造方法类似,但多几步

    我们要在<bean>标签下使用二级标签<constructor-arg>来进行配置。

    

    该标签用于指定创建Bean对象的参数,然后调用对应的有参构造方法。它主要有这几个属性:

name:用来指定参数名字,该参数名与构造函数里面的参数名一致

value/ref:用来输入值的数据,两者区别与property中的 value/ref 一致

type:当使用value时,可以使用该属性声明你所输入的值的类型。该属性是否使用主要看版本

    不管我们输入的是什么也好,value值我们给的值原本都是是String类型,然后会自动转换我们所需要的数据类型。但在高版本的spring中,撤掉了自动类型转换,需要我们使用type声明我们输入的数据属于什么类型。

index:设置该参数位于传递的参数列表中的第几个。该属性和name只需要使用其中之一即可,都是用来设置传递的参数所构成的参数列表的。

    当有多个参数的时候,便在<bean>下面创建多个<constructor-arg>传递多个参数值即可。注意,你所传递的参数所构成的参数列表必须与某个构造函数的参数列表一致

工厂方式实例化对象

    工厂方式实例化对象又分两个,分别是静态工厂和实例工厂。这里需要讲一下工厂的概念。

    在早期的MVC三层架构开发时,经常会出现在业务逻辑的代码中能看到很多的手动new对象的代码的情况(这种情况在校学习期间我们自己编写的小项目就经常出现这种情况)。这样会造成高度耦合,不利于日后的代码维护等一系列工作。光说有点抽象,我们放图片示例:

    层与层之间涉及到方法的调用的时候,我们总是要手动的去创建对象,才能去调用其他层的方法。

    这个时候我们就可以使用设计模式中的工厂模式来解决问题。 这里了解即可,不展开详细讲。

静态工厂

    在spring里面,静态工厂的实现方式是实现一个静态工厂类。通过<bean>的属性factory-method,来指定一个静态方法,在该静态方法中达到创建对象的目标并返回交给spring容器管理。

    这里我们编写一个静态工厂类,让其可以生成User类的实例对象:

    然后我们在Bean的配置文件里面给工厂类配置Bean属性: 

    测试结果:

    如果一个工厂类里有多个生产方法,创建多个<bean>标签一一配置即可。只需要彼此之间配置不同标识名即可。 

实例工厂 

     静态工厂需要我们先编写一个实例工厂类,然后在Bean的xml配置文件中给其配置<bean>,这个<bean>后面需要作为factory-bean来使用。

    然后我们配置Bean的xml配置文件,先给我们编写的实例工厂类配置一个bean,然后再编写一个bean,class正常选择我们的User类,但是需要设置factory-bean,表示从该工厂里面获得User类的实例,然后factory-method选择我们工厂里的生产方法: 

    测试结果:

实现FactoryBean规范

    除了直接使用spring的容器的方式来实现工厂之外,我们还可以自己编写工厂类,使其实现FactoryBean接口的方式来实现工厂类,注意不是BeanFactory。

    我们编写代码:

    配置Bean的XML文件:

     编写测试类:

    测试结果: