做网站制作外包,专业俄语网站设计,大连在哪里哪个省,手机app下载官方免费下载安装1.工厂方法注入 工厂方法是在应用中被经常使用的设计模式#xff0c;它也是控制反转和单例设计思想的主要实现方法。由于Spring IoC容器以框架的方式提供工厂方法的功能#xff0c;并以透明的方式开放给开发者#xff0c;所以很少需要手工编写基于工厂方法的类。正是因为工厂…1.工厂方法注入 工厂方法是在应用中被经常使用的设计模式它也是控制反转和单例设计思想的主要实现方法。由于Spring IoC容器以框架的方式提供工厂方法的功能并以透明的方式开放给开发者所以很少需要手工编写基于工厂方法的类。正是因为工厂方法已经成为底层设施的一部分因此工厂方法对于实际编码的重要性就降低了。不过在一些遗留系统或第三方类库中我们还是会遇到工厂方法这时可以使用Spring工厂方法注入的方式进行配置。
1.1非静态工厂方法 有些工厂方法是非静态的即必须实例化工厂类后才能调用工厂方法。下面为Car提供一个非静态的工厂类创建一个CarFactory.java类该类的代码如下
package com.example.servlet001.bean;public class CarFactory {/*** 创建Car的工厂方法* return*/public Car createHongQiCar(){Car carnew Car();car.setBrand(红旗CA2000);return car;}} 工厂类负责创建一个或多个目标类实例工厂类方法一般以接口或抽象类变量的形式返回目标类实例。工厂类对外屏蔽了目标类的实例化步骤调用者甚至无须知道具体的目标类是什么。上述的CarFactory工厂类仅负责创建Car类型的对象下面的配置片段使用CarFactory为Car提供工厂方法的注入代码如下所示
?xml version1.0 encodingUTF-8?beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxsi:schemaLocationhttp://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd!--工厂类Bean--bean idcarFactory classcom.example.servlet001.bean.CarFactory/beanbean idcar factory-beancarFactory factory-methodcreateHongQiCar/bean/beans 由于CarFactory工厂类的工厂方法不是静态的所以首先需要定义一个工厂类的Bean然后通过factory-bean引用工厂类实例最后通过factory-method指定对应的工厂类方法。
修改测试类代码对配置进行测试测试类的代码如下所示
package com.example.servlet001;import com.example.servlet001.bean.Car;import org.springframework.beans.factory.support.DefaultListableBeanFactory;import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;import org.springframework.core.io.Resource;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.core.io.support.ResourcePatternResolver;public class Demo1 {public static void main(String[] args) {//通过xml配置文件的方式装在BeanResourcePatternResolver resolver new PathMatchingResourcePatternResolver();Resource res resolver.getResource(test.xml);DefaultListableBeanFactory factory new DefaultListableBeanFactory();XmlBeanDefinitionReader reader new XmlBeanDefinitionReader(factory);reader.loadBeanDefinitions(res);Car carfactory.getBean(car, Car.class);System.out.println(brand:car.getBrand());System.out.println(price:car.getPrice());System.out.println(maxSpeed:car.getMaxSpeed());}} 运行该程序后的结果显示如下 1.2静态工厂方法 很多工厂类方法都是静态的这意味着用户无须创建工厂类实例的情况下就可以调用工厂类方法因此静态工厂方法比非静态工厂方法更易使用。下面对CarFactory进行改造将其createHongQiCar()方法调整为静态的代码清单如下
package com.example.servlet001.bean;public class CarFactory {/*** 创建Car的工厂方法* return*/public static Car createHongQiCar(){Car carnew Car();car.setBrand(红旗CA2000);return car;}} 当使用静态工厂类型的方法后用户就无须在配置文件中定义工厂类的Bean,只需按以下方式进行配置即可
?xml version1.0 encodingUTF-8?beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxsi:schemaLocationhttp://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsdbean idcar classcom.example.servlet001.bean.CarFactory factory-methodcreateHongQiCar/bean/beans 直接在bean中通过class属性指定工厂类然后通过factory-method指定对应的工厂方法。
然后重新运行该程序后的结果如下图所示 可以看到运行后得到的结构是跟上述非静态工厂方法是一样的只是实现的方式不同。
2.选择注入方式的考量 Spring提供了3中可供选择的注入方式在实际应用中选择哪种注入方式并没有统一的标准。下面是支持使用构造函数注入的理由
①构造函数可以保证一些重要的属性在Bean实例化时就设置好避免因为一些重要属性没有提供而导致一个无用的Bean实例的情况。
②不需要为每个属性提供Setter方法减少了类的方法个数。
③可以更好地封装类变量不需要为每个属性指定Setter方法避免外部错误的调用。 更多的开发者可能倾向于使用属性注入的方式他们反对构造函数注入的理由如下
①如果一个类的属性众多那么构造函数的签名将变成一个庞然大物可读性很差。
②灵活性不强在有些属性是可选的情况下如果是通过构造函数注入也需要为可选的参数提供一个null值。
③如果有多个构造函数则需要考虑配置文件和具体构造函数匹配歧义的问题匹配上相对复杂。
④构造函数不利于类的继承和拓展因为子类需要引用父类复杂的构造函数。
⑤构造函数注入有时会造成循环依赖的问题。 其实构造函数注入和属性注入各有自己的应用场景Spring并没有强制用户使用哪一种方式用户完全可以根据个人偏好做出选择在某些情况下使用构造函数注入而在另一些情况下使用属性注入。对于一个全新开发的应用来说我们不推荐使用工厂方法的注入方式因为工厂方法需要额外的类和代码这些功能和业务是没有关系的既然Spring容器已经以一种更优雅的方式实现了传统工厂模式的所有功能那么我们大可不必再去做这项重复性的工作。