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(); } }}
//主函数
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(); } }} 运⾏结果为: 区别于静态⼯⼚⽅法,这⾥⼯⼚类的构造函数被调⽤, // container.put( phonefactory, phonefactory); phoneFactory pf=container.get(\"phonefactory\");xiaomi=pf.getPhone(\"⼩⽶\"); ⾸先创建⼯⼚实例放在spring容器中,然后调⽤该⼯⼚⽅法创建bean实例。 因篇幅问题不能全部显示,请点此查看更多更全内容