静态工厂方法和实例工厂方法及普通的bean
容纳你的bean
bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean。
应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。
bean工厂介绍
工厂设计模式,创建分发各种bean。配置好它们之间的协作关系,参与bean的生命周期。
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
bean工厂只把bean的定义信息加载进来,用到的时候才实例化。
factory.getBean("mybean");就可得到一个bean
静态工厂方法实例
- package com.test.srping.bean.factory;
- import java.util.HashMap;
- import java.util.Map;
- //静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例
- public class StaticCarFactory {
- private static Map<String,Car> cars = new HashMap<String,Car>();
- static{
- cars.put("baoma", new Car("BaoMa",));
- cars.put("benci", new Car("BenCi",));
- }
- public StaticCarFactory(){
- System.out.println("静态工厂方法构造函数被调用-StaticCarFactory");
- }
- //静态工厂方法,不需要创建staticCarFactory对象情况下,通过该方法就可以得到对应的实例
- public static Car getCar(String brand){
- return cars.get(brand);
- }
- }
实例工厂方法实例
- package com.test.srping.bean.factory;
- import java.util.HashMap;
- import java.util.Map;
- //实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 返回bean的实例
- public class InstanceCarFactory {
- private Map<String,Car> cars = null;
- public InstanceCarFactory(){
- cars = new HashMap<String,Car>();
- cars.put("audi", new Car("Audi",));
- cars.put("ford", new Car("Ford",));
- System.out.println("实例工厂方法构造函数被调用-InstanceCarFactory");
- }
- public Car getCar(String brand){
- return cars.get(brand);
- }
- }
- package com.test.srping.bean.factory;
- public class Car {
- private String brand;
- private double price;
- public String getBrand() {
- return brand;
- }
- public void setBrand(String brand) {
- this.brand = brand;
- }
- public double getPrice() {
- return price;
- }
- public void setPrice(double price) {
- this.price = price;
- }
- @Override
- public String toString() {
- return "Car [brand=" + brand + ", price=" + price + "]";
- }
- public Car(String brand, double price) {
- super();
- this.brand = brand;
- this.price = price;
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!--
- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,
- 且注意对应类是包含静态工厂方法的类
- class属性:指向静态工厂方法的全类名
- factory-method:指向静态工厂方法中的名字
- constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数
- -->
- <bean id="car1"
- class="com.test.srping.bean.factory.StaticCarFactory"
- factory-method="getCar">
- <constructor-arg value="baoma"></constructor-arg>
- </bean>
- <!-- .配置工厂的实例 -->
- <bean id="carFactory"
- class="com.test.srping.bean.factory.InstanceCarFactory"></bean>
- <!--
- .通过实例工厂来配置bean
- class属性:指向实例工厂方法的全类名
- factory-method:指向实例工厂方法的名字
- constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
- -->
- <bean id="car2" factory-bean="carFactory"
- factory-method="getCar">
- <constructor-arg value="ford"></constructor-arg>
- </bean>
- </beans>
- package com.test.srping.bean.factory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /*
- * 1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)
- 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
- 而不关心创建对象的细节。
- 要声明通过静态方法创建bean:
- 1.需要在bean的class属性里指定拥有该方法的类,
- 2.同时在factory-method属性里指定工厂方法的名称,
- 3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
- */
- //spring通过工厂方法配置Bean
- public class Mainfactory {
- public static void main(String[] args) {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");
- //静态工厂方法测试:
- Car car1 = (Car) ctx.getBean("car1");
- System.out.println(car1);
- //实例工厂方法测试:
- Car car2 = (Car) ctx.getBean("car2");
- System.out.println(car2);
- }
- }
运行结果
实例工厂方法构造函数被调用-InstanceCarFactory
Car [brand=BaoMa, price=3000000.0]
Car [brand=Ford, price=400000.0]
实例工厂方法在加载过程中对象被创建,静态工厂方法没有被创建直接被调用
--------------------------------------------------------------------------------------------
通过实现FactoryBean接口来配置bean
- package com.test.spring.bean.factorybean;
- import org.springframework.beans.factory.FactoryBean;
- //自定义的Factory需要实现FactoryBean接口
- public class CarFactoryBean implements FactoryBean<Car>{
- private String brand;
- public void setBrand(String brand) {
- this.brand = brand;
- }
- //返回bean的对象
- public Car getObject() throws Exception {
- return new Car(brand,);
- }
- //返回的bean的类型
- public Class<?> getObjectType() {
- return Car.class;
- }
- //是否是单例的
- public boolean isSingleton() {
- return true;
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!--
- 通过FactoryBean来配置Bean的实例
- class:指向FactoryBean的全类名
- property:配置FactoryBean的属性
- 注意:实际返回的实例是FactoryBean的getObject()方法返回的实例
- -->
- <bean id="car1"
- class="com.test.spring.bean.factorybean.CarFactoryBean">
- <property name="brand" value="BMW"></property>
- </bean>
- </beans>
- package com.test.spring.bean.factorybean;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * 2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)
- 实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
- 1.先声明实例工厂类的bean
- 声明通过实例工厂方法创建的bean:
- 2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
- 3.在factory-method属性里指定该工厂方法的名称。
- 4.使用constructor-arg元素为工厂方法传递方法参数。
- *
- */
- //通过FactoryBean来配置Bean
- public class MainFactoryBean {
- public static void main(String[] args) {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");
- Car car = (Car) ctx.getBean("car1");
- System.out.println(car);
- }
- }
静态工厂方法和实例工厂方法及普通的bean的更多相关文章
- Java——静态变量/方法与实例变量/方法的区别
静态只能调用静态 非静态: 对象名.方法名 package ti; //通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. class StaticDemo { ...
- Spring学习--静态工厂方法、实例工厂方法创建 Bean
通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...
- [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring实例化Bean三种方法:构造器、静态工厂、实例工厂
Spring中Bean相当于java中的类,可以通过xml文件对bean进行配置和管理. 一.Bean的实例化: 构造器实例化.静态工厂实例化.实例工厂方式实例化. 目录: 构造器实例化: xml配置 ...
- 【Spring】Spring中的Bean - 2、Baen的实例化 (构造器、静态工厂、实例工厂)
Bean的实例化 文章目录 Bean的实例化 构造器实例化 静态工厂方式实例化 实例工厂方式实例化 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-S ...
- 4.spring对象的创建(静态工厂 实例工厂 泛型,嵌套类型)
1.原料类 namespace CreateObjects{ public class GenericClass<T> { }} PersonDao 类 包含嵌套类型 name ...
- vue教程2-04 vue实例简单方法
vue教程2-04 vue实例简单方法 vue实例简单方法: vm.$el -> 就是元素 vm.$data -> 就是data <!DOCTYPE html> <htm ...
- Python面向对象高级编程:__slot__(给实例添加方法、属性)
纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ...
- Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)
通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...
随机推荐
- Hbuilder Webview调试+逍遥安卓模拟器
软件版本: HBuilder : 9.0.2.201803061935 逍遥安卓:5.2.2 webview相当于一个浏览器的tab,通过在webview中修改,模拟器端会实时刷新效果.从而达到调试手 ...
- POJ2104(可持久化线段树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 58759 Accepted: 20392 Ca ...
- Codeforces500C(SummerTrainingDay01-G)
C. New Year Book Reading time limit per test:2 seconds memory limit per test:256 megabytes input:sta ...
- 分页插件 jquery.pagination.js
引用 <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <lin ...
- 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)
题意 题目链接 Sol 显然如果题目什么都不说的话需要\(\frac{n * (n - 1)}{2}\)个相对关系 然后求一下传递闭包减掉就行了 #include<bits/stdc++.h&g ...
- RecyclerView-- 侧滑删除和拖动排序
实现这么个功能我们不需要再去继承RecyclerView,只需要去了解ItemTouchHelper这个类即可,接下来我们就去看看都有些什么 ItemTouchHelper.Callback 默认需要 ...
- MySQL缓存机制详解(一)
本文章拿来学习用||参考资料:http://www.2cto.com/database/201308/236361.html 对MySql查询缓存及SQL Server过程缓存的理解及总结 一.M ...
- 解决 ModuleNotFoundError: No module named 'pip'
安装其它python包时,提示说 pip 10.0.1可用,就更新了一下,但是 更新过程中出现了错误,如图所示 因为这个错误导致 pip找不到, 可以首先执行 python -m ensurepip ...
- 分享今天在客户那里遇到的SQLSERVER连接超时以及我的解决办法
分享今天在客户那里遇到的SQLSERVER连接超时以及我的解决办法 客户的环境:SQLSERVER2005,WINDOWS2003 SP2 32位 这次发生连接超时的时间是2013-8-5 21: ...
- 【C语言】 使用Beep() 函数 演奏歌曲
#include <windows.h> int main(){ ){ Beep(, ); Beep(, ); Beep(, ); Beep(, ); Beep(, ); Beep(, ) ...