您的当前位置:首页正文

spring中的工厂(一)BeanFactory

2022-11-01 来源:独旅网
spring中的⼯⼚(⼀)BeanFactory

spring中的⼯⼚,可以分为创建bean⽅法⼯⼚和容器中的⼯⼚。两者的区别在于,前者(BeanFactory)为标准的⼯⼚模式,spring需要调⽤⼯⼚⽅法去创建bean的实例。⽽后者(FactoryBean)是spring的特殊bean。

⾸先介绍,BeanFactory使⽤⼯⼚⽅法创建bean,可以分为静态⼯⼚⽅法和实例⼯⼚⽅法。

在静态⼯⼚⽅法中,配置bean时,要包含class和factory-method两个元素。class元素不再指向位bean的实现类,⽽是指向为静态⼯⼚⽅法类,factory-method指定静态⼯⼚⽅法产⽣bean实例。如果需要向静态⼯⼚⽅法中传⼊参数则使⽤onstructor-arg元素传⼊。下⾯举个例⼦:

//⼩⽶⼿机类

public class MIPhone implements Phone { public MIPhone(){

System.out.println(\"MIPhone 构造函数被调⽤\"); }

private String msg; public String getMsg() { return msg; }

public void setMsg(String msg) { this.msg = msg; }

public void call(){

System.out.println(\"使⽤\"+msg+\"打电话\"); }}

//apple⼿机类

public class iPhone implements Phone{

public iPhone(){

System.out.println(\"iPhone 构造函数被调⽤\"); }

private String msg; public String getMsg() { return msg; }

public void setMsg(String msg) { this.msg = msg; }

public void call(){

System.out.println(\"使⽤\"+msg+\"打电话\"); }}

//静态⼯⼚⽅法

public class StaticPhoneFactory { public StaticPhoneFactory(){

System.out.println(\"静态⼯⼚⽅法被调⽤\"); }

public static Phone getPhone(String name){ if(name.equals(\"xiaomi\")){ return new MIPhone(); }else{

return new iPhone(); } }}

xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\">

//主函数

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class main {

public static void main(String[] args) {

ApplicationContext ctx=new ClassPathXmlApplicationContext(\"beans-factory.xml\"); Phone p1=(MIPhone)ctx.getBean(\"xiaomi\"); Phone p2=(iPhone)ctx.getBean(\"apple\"); p1.call(); p2.call(); }}

运⾏结果为:

⼯⼚类并没有被调⽤,代码块中的代码可以转化为

//name 为constructor-arg传⼊的值

phone=com.spring.test.beanfactory.StaticPhoneFactory.getPhone(name);

也就是说,直接调⽤了类名的静态⽅法创建对象(上⾯的构造⽅法就是在静态⽅法中调⽤的),通过静态⽅法返回bean实例。获得bean实例后与普通⽅法创建bean实例⼀样。

实例⼯⼚⽅法⽆需class属相指向⼯⼚⽅法,⽽是⽤factory-bean指定⼯⼚实例,Spring容器调⽤⼯⼚bean创建bean实例。

//实例⼯⼚⽅法

public class phoneFactory { public phoneFactory(){

System.out.println(\"实例⼯⼚构造函数被调⽤\"); }

public Phone getPhone(String name){

if(name.equals(\"xiaomi\")){ return new MIPhone(); }else{

return new iPhone(); } }}

xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\">

运⾏结果为:

区别于静态⼯⼚⽅法,这⾥⼯⼚类的构造函数被调⽤,代码块可以分为两部分

//phoneFactory phonefactory=new com.spring.test.beanfactory.phoneFactory ();//container.put( String,Object);

container.put( phonefactory, phonefactory);

phoneFactory pf=container.get(\"phonefactory\");xiaomi=pf.getPhone(\"⼩⽶\");

⾸先创建⼯⼚实例放在spring容器中,然后调⽤该⼯⼚⽅法创建bean实例。

因篇幅问题不能全部显示,请点此查看更多更全内容