容纳你的bean
  bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean。
  应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。
bean工厂介绍
  工厂设计模式,创建分发各种bean。配置好它们之间的协作关系,参与bean的生命周期。
  BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
  bean工厂只把bean的定义信息加载进来,用到的时候才实例化。
  factory.getBean("mybean");就可得到一个bean

静态工厂方法实例

  1. package com.test.srping.bean.factory;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. //静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例
  7. public class StaticCarFactory {
  8. private static Map<String,Car> cars = new HashMap<String,Car>();
  9.  
  10. static{
  11. cars.put("baoma", new Car("BaoMa",));
  12. cars.put("benci", new Car("BenCi",));
  13. }
  14.  
  15. public StaticCarFactory(){
  16. System.out.println("静态工厂方法构造函数被调用-StaticCarFactory");
  17. }
  18. //静态工厂方法,不需要创建staticCarFactory对象情况下,通过该方法就可以得到对应的实例
  19. public static Car getCar(String brand){
  20. return cars.get(brand);
  21. }
  22. }

实例工厂方法实例

  1. package com.test.srping.bean.factory;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. //实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 返回bean的实例
  7. public class InstanceCarFactory {
  8. private Map<String,Car> cars = null;
  9.  
  10. public InstanceCarFactory(){
  11. cars = new HashMap<String,Car>();
  12. cars.put("audi", new Car("Audi",));
  13. cars.put("ford", new Car("Ford",));
  14. System.out.println("实例工厂方法构造函数被调用-InstanceCarFactory");
  15. }
  16.  
  17. public Car getCar(String brand){
  18. return cars.get(brand);
  19. }
  20. }
  1. package com.test.srping.bean.factory;
  2.  
  3. public class Car {
  4. private String brand;
  5. private double price;
  6.  
  7. public String getBrand() {
  8. return brand;
  9. }
  10.  
  11. public void setBrand(String brand) {
  12. this.brand = brand;
  13. }
  14.  
  15. public double getPrice() {
  16. return price;
  17. }
  18.  
  19. public void setPrice(double price) {
  20. this.price = price;
  21. }
  22.  
  23. @Override
  24. public String toString() {
  25. return "Car [brand=" + brand + ", price=" + price + "]";
  26. }
  27.  
  28. public Car(String brand, double price) {
  29. super();
  30. this.brand = brand;
  31. this.price = price;
  32. }
  33. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.  
  6. <!--
  7. 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,
  8. 且注意对应类是包含静态工厂方法的类
  9. class属性:指向静态工厂方法的全类名
  10. factory-method:指向静态工厂方法中的名字
  11. constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数
  12. -->
  13. <bean id="car1"
  14. class="com.test.srping.bean.factory.StaticCarFactory"
  15. factory-method="getCar">
  16. <constructor-arg value="baoma"></constructor-arg>
  17. </bean>
  18.  
  19. <!-- .配置工厂的实例 -->
  20. <bean id="carFactory"
  21. class="com.test.srping.bean.factory.InstanceCarFactory"></bean>
  22. <!--
  23. .通过实例工厂来配置bean
  24. class属性:指向实例工厂方法的全类名
  25. factory-method:指向实例工厂方法的名字
  26. constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
  27. -->
  28. <bean id="car2" factory-bean="carFactory"
  29. factory-method="getCar">
  30. <constructor-arg value="ford"></constructor-arg>
  31. </bean>
  32.  
  33. </beans>
  1. package com.test.srping.bean.factory;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. /*
  7. * 1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)
  8. 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
  9. 而不关心创建对象的细节。
  10. 要声明通过静态方法创建bean:
  11. 1.需要在bean的class属性里指定拥有该方法的类,
  12. 2.同时在factory-method属性里指定工厂方法的名称,
  13. 3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
  14. */
  15. //spring通过工厂方法配置Bean
  16. public class Mainfactory {
  17. public static void main(String[] args) {
  18. ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");
  19.  
  20. //静态工厂方法测试:
  21. Car car1 = (Car) ctx.getBean("car1");
  22. System.out.println(car1);
  23.  
  24. //实例工厂方法测试:
  25. Car car2 = (Car) ctx.getBean("car2");
  26. System.out.println(car2);
  27. }
  28. }

运行结果

实例工厂方法构造函数被调用-InstanceCarFactory
Car [brand=BaoMa, price=3000000.0]
Car [brand=Ford, price=400000.0]

实例工厂方法在加载过程中对象被创建,静态工厂方法没有被创建直接被调用

--------------------------------------------------------------------------------------------

通过实现FactoryBean接口来配置bean

  1. package com.test.spring.bean.factorybean;
  2.  
  3. import org.springframework.beans.factory.FactoryBean;
  4.  
  5. //自定义的Factory需要实现FactoryBean接口
  6. public class CarFactoryBean implements FactoryBean<Car>{
  7. private String brand;
  8.  
  9. public void setBrand(String brand) {
  10. this.brand = brand;
  11. }
  12. //返回bean的对象
  13. public Car getObject() throws Exception {
  14. return new Car(brand,);
  15. }
  16. //返回的bean的类型
  17. public Class<?> getObjectType() {
  18. return Car.class;
  19. }
  20. //是否是单例的
  21. public boolean isSingleton() {
  22. return true;
  23. }
  24. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!--
  6. 通过FactoryBean来配置Bean的实例
  7. class:指向FactoryBean的全类名
  8. property:配置FactoryBean的属性
  9.  
  10. 注意:实际返回的实例是FactoryBean的getObject()方法返回的实例
  11. -->
  12. <bean id="car1"
  13. class="com.test.spring.bean.factorybean.CarFactoryBean">
  14. <property name="brand" value="BMW"></property>
  15. </bean>
  16. </beans>
  1. package com.test.spring.bean.factorybean;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. /**
  7. * 2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)
  8. 实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
  9. 1.先声明实例工厂类的bean
  10. 声明通过实例工厂方法创建的bean:
  11. 2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
  12. 3.在factory-method属性里指定该工厂方法的名称。
  13. 4.使用constructor-arg元素为工厂方法传递方法参数。
  14. *
  15. */
  16. //通过FactoryBean来配置Bean
  17. public class MainFactoryBean {
  18. public static void main(String[] args) {
  19. ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");
  20.  
  21. Car car = (Car) ctx.getBean("car1");
  22. System.out.println(car);
  23. }
  24. }

静态工厂方法和实例工厂方法及普通的bean的更多相关文章

  1. Java——静态变量/方法与实例变量/方法的区别

    静态只能调用静态 非静态: 对象名.方法名 package ti; //通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. class StaticDemo { ...

  2. Spring学习--静态工厂方法、实例工厂方法创建 Bean

    通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...

  3. [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Spring实例化Bean三种方法:构造器、静态工厂、实例工厂

    Spring中Bean相当于java中的类,可以通过xml文件对bean进行配置和管理. 一.Bean的实例化: 构造器实例化.静态工厂实例化.实例工厂方式实例化. 目录: 构造器实例化: xml配置 ...

  5. 【Spring】Spring中的Bean - 2、Baen的实例化 (构造器、静态工厂、实例工厂)

    Bean的实例化 文章目录 Bean的实例化 构造器实例化 静态工厂方式实例化 实例工厂方式实例化 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-S ...

  6. 4.spring对象的创建(静态工厂 实例工厂 泛型,嵌套类型)

    1.原料类 namespace CreateObjects{    public class GenericClass<T>    { }} PersonDao 类 包含嵌套类型 name ...

  7. vue教程2-04 vue实例简单方法

    vue教程2-04 vue实例简单方法 vue实例简单方法: vm.$el -> 就是元素 vm.$data -> 就是data <!DOCTYPE html> <htm ...

  8. Python面向对象高级编程:__slot__(给实例添加方法、属性)

    纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ...

  9. Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)

    通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...

随机推荐

  1. Hbuilder Webview调试+逍遥安卓模拟器

    软件版本: HBuilder : 9.0.2.201803061935 逍遥安卓:5.2.2 webview相当于一个浏览器的tab,通过在webview中修改,模拟器端会实时刷新效果.从而达到调试手 ...

  2. POJ2104(可持久化线段树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 58759   Accepted: 20392 Ca ...

  3. Codeforces500C(SummerTrainingDay01-G)

    C. New Year Book Reading time limit per test:2 seconds memory limit per test:256 megabytes input:sta ...

  4. 分页插件 jquery.pagination.js

    引用 <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <lin ...

  5. 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)

    题意 题目链接 Sol 显然如果题目什么都不说的话需要\(\frac{n * (n - 1)}{2}\)个相对关系 然后求一下传递闭包减掉就行了 #include<bits/stdc++.h&g ...

  6. RecyclerView-- 侧滑删除和拖动排序

    实现这么个功能我们不需要再去继承RecyclerView,只需要去了解ItemTouchHelper这个类即可,接下来我们就去看看都有些什么 ItemTouchHelper.Callback 默认需要 ...

  7. MySQL缓存机制详解(一)

    本文章拿来学习用||参考资料:http://www.2cto.com/database/201308/236361.html 对MySql查询缓存及SQL Server过程缓存的理解及总结   一.M ...

  8. 解决 ModuleNotFoundError: No module named 'pip'

    安装其它python包时,提示说 pip 10.0.1可用,就更新了一下,但是 更新过程中出现了错误,如图所示 因为这个错误导致 pip找不到, 可以首先执行  python -m ensurepip ...

  9. 分享今天在客户那里遇到的SQLSERVER连接超时以及我的解决办法

    分享今天在客户那里遇到的SQLSERVER连接超时以及我的解决办法 客户的环境:SQLSERVER2005,WINDOWS2003 SP2  32位 这次发生连接超时的时间是2013-8-5  21: ...

  10. 【C语言】 使用Beep() 函数 演奏歌曲

    #include <windows.h> int main(){ ){ Beep(, ); Beep(, ); Beep(, ); Beep(, ); Beep(, ); Beep(, ) ...