BeanFactory和FactoryBean的区别简介
BeanFactory
BeanFactory是一个接口也是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,比如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等具体的容器都是对BeanFactory接口的实现,再在其基础之上附加其它的功能。
FactoryBean
FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String beanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&beanNme),在BeanName之前加上&。
隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利.
和设计模式中的工厂模式和修饰器模式相似.
getBean(beanName)方法获取的是getObject()返回的对象。
getBean(&beanName)方法获取的才是实现FactoryBean的对象。
getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。
FactoryBean的案例
1.创建FactoryBean的实现类
getBean(beanName)方法获取的是getObject()返回的对象。
getBean(&beanName)方法获取的才是实现FactoryBean的对象。
getObject()方法确实可以实现隐藏实现的细节的功能。
getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。
package factorybean;
import org.springframework.beans.factory.FactoryBean;
public class FactoryBeanPojo implements FactoryBean {
private String type;
/**
* getBean获取的是getObject()方法返回的对象
* @return
* @throws Exception
*/
@Override
public Object getObject() throws Exception {
if("student".equals(type)){
Student student = new Student();
student.setName("学生");
return student;
}else{
Teacher teacher = new Teacher();
teacher.setName("老司机");
return teacher;
}
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public Class getObjectType() {
return Teacher.class;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}郑州人流价格 http://www.zzzykdfk.com/
2.创建两个普通的Bean
package factorybean;
public class Student {
private String name;
public Student(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package factorybean;
public class Teacher {
private String name;
public Teacher(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.测试代码
package factorybean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class FactoryBeanTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Object student = applicationContext.getBean("factoryBeanPojo");
System.out.println("student:"+student);
Object factoryBeanPojo = applicationContext.getBean("&factoryBeanPojo");
System.out.println("factoryBeanPojo:"+factoryBeanPojo);
}
}
4.spring配置文件
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">
5.代码执行结果
1.getBean(beanName)由于spring配置的是student所以getObject()返回的是Student对象。
2.getBean(&beanName)返回的是实现FactoryBean接口对象本身在这里也验证了。
BeanFactory
BeanFactory是一个接口也是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,比如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等具体的容器都是对BeanFactory接口的实现,再在其基础之上附加其它的功能。
FactoryBean
FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String beanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&beanNme),在BeanName之前加上&。
隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利.
和设计模式中的工厂模式和修饰器模式相似.
getBean(beanName)方法获取的是getObject()返回的对象。
getBean(&beanName)方法获取的才是实现FactoryBean的对象。
getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。
FactoryBean的案例
1.创建FactoryBean的实现类
getBean(beanName)方法获取的是getObject()返回的对象。
getBean(&beanName)方法获取的才是实现FactoryBean的对象。
getObject()方法确实可以实现隐藏实现的细节的功能。
getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。
package factorybean;
import org.springframework.beans.factory.FactoryBean;
public class FactoryBeanPojo implements FactoryBean {
private String type;
/**
* getBean获取的是getObject()方法返回的对象
* @return
* @throws Exception
*/
@Override
public Object getObject() throws Exception {
if("student".equals(type)){
Student student = new Student();
student.setName("学生");
return student;
}else{
Teacher teacher = new Teacher();
teacher.setName("老司机");
return teacher;
}
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public Class getObjectType() {
return Teacher.class;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
2.创建两个普通的Bean
package factorybean;
public class Student {
private String name;
public Student(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package factorybean;
public class Teacher {
private String name;
public Teacher(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.测试代码
package factorybean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class FactoryBeanTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Object student = applicationContext.getBean("factoryBeanPojo");
System.out.println("student:"+student);
Object factoryBeanPojo = applicationContext.getBean("&factoryBeanPojo");
System.out.println("factoryBeanPojo:"+factoryBeanPojo);
}
}
4.spring配置文件
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">
5.代码执行结果
1.getBean(beanName)由于spring配置的是student所以getObject()返回的是Student对象。
2.getBean(&beanName)返回的是实现FactoryBean接口对象本身在这里也验证了。