任何类在实现此接口后都会重写三个方法,如下所示
public class FactoryStudent1 implements FactoryBean<Student1> {
@Override
public Student1 getObject() throws Exception {
Student1 student1 = new Student1();
student1.setName("张三");
return student1;
}
@Override
public Class<Student1> getObjectType() {
return Student1.class;
}
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
在getObject()方法中,我们可以自定义返回的对象,这种方法的优点有两个:
一是实现这个接口后,getObject()方法获取对象的方式交给IOC容器来管理,虽然spring底层调用的还是getObject()方法,但是此方法已经交给IOC容器来管理了,第二点就是在getObject()方法中我们可以方便的set对象的属性,而不必在xml<bean>标签中设置对象的属性,方便开发。
其实在使用@Component注解并实现FactoryBean<T>接口(这时不实现此接口应该也可以,只需要在属性后面加上属性值就ok)也可以实现此功能,只不过前者是spring的方法,后者是springboot的方法。
spring底层在调用getObject()方法时,利用了deRefrence()“解引用”这个概念。
解引用的意思是获取引用的内容,而不是获取引用的地址值。以上面代码来讲解就是获取的不是factoryBean对象的地址值,而是获取地址中的内容即Student1的对象。