factorybean 声明_spring源码分析之FactoryBean

上文中描述spring加载bean的过程中,有一段关于FactoryBean的处理。所以今天讲一下FactoryBean。从名字上直译就是bean工厂,用来创建bean的。从Spring 3.0 开始, FactoryBean开始支持泛型,即接口声明改为FactoryBean 的形式:

package org.Springframework.beans.factory;

public interface FactoryBean {

/** * 返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实 例会放到Spring容器中单实例缓存池中。 */

T getObject() throws Exception;

/** *返回FactoryBean创建的bean类型。 */

Class> getObjectType();

/** *返回由FactoryBean创建的bean实例的作用域是singleton还是prototype。 */

boolean isSingleton();

}

下面就开始写今天要演示的2个例子

import org.apache.commons.lang.builder.ToStringBuilder;

import org.apache.commons.lang.builder.ToStringStyle;

public class Student {

private String name;

private String classname;

private String age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getClassname() {

return classname;

}

public void setClassname(String classname) {

this.classname = classname;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

@Override

public String toString(){

return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);

}

}

import org.apache.commons.lang.builder.ToStringBuilder;

import org.apache.commons.lang.builder.ToStringStyle;

import org.springframework.beans.factory.FactoryBean;

public class StudentFactoryBean implements FactoryBean {

private String studentInfo;

@Override

public Student getObject() throws Exception {

Student s=new Student();

String[] studentInfos=studentInfo.split(",");

s.setName(studentInfos[0]);

s.setClassname(studentInfos[1]);

s.setAge(studentInfos[2]);

return s;

}

@Override

public Class getObjectType() {

return Student.class;

}

@Override

public boolean isSingleton() {

return false;

}

public String getStudentInfo() {

return studentInfo;

}

public void setStudentInfo(String studentInfo) {

this.studentInfo = studentInfo;

}

@Override

public String toString(){

return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);

}

}

bean id="studentFactoryBean" class="com.eroadsf.springdemo.factorybean.StudentFactoryBean">

public class Test {

@SuppressWarnings("deprecation")

public static void main(String[] args) {

XmlBeanFactory f=new XmlBeanFactory(new ClassPathResource("spring-context.xml"));

Student s=(Student) f.getBean("studentFactoryBean");

System.out.println("获取student:\n"+s);

StudentFactoryBean sf=(StudentFactoryBean) f.getBean("&studentFactoryBean");//spring就是用&这个来判断获取的是bean还是FactoryBean

System.out.println("获取StudentFactoryBean:\n"+sf);

}

}

结果

获取student:

com.eroadsf.springdemo.factorybean.Student@9d63e96[

name=测试1

classname=JAVA班

age=18

]

获取StudentFactoryBean:

com.eroadsf.springdemo.factorybean.StudentFactoryBean@4d50a1ac[

studentInfo=测试1,JAVA班,18

]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值