boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//得到bean实例的Class类型
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
1.2、BeanFactory 使用场景
1、从Ioc容器中获取Bean(byName or byType)
2、检索Ioc容器中是否包含指定的Bean 3、判断Bean是否为单例
2、FactoryBean
首先FactoryBean是一个Bean,但又不仅仅是一个Bean,这样听起来矛盾,但为啥又这样说呢?其实在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个FactoryBean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似
2.1、为什么会有FactoryBean?
一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean。至于为什么会有FactoryBean?原因有两个:
1、 在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。FactoryBean接口对于Spring框架来说占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。它们隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利。
2、 由于第三方库不能直接注册到spring容器,于是可以实现org.springframework.bean.factory.FactoryBean接口,然后给出自己对象的实例化代码即可。
2.2 、FactoryBean 源码
public interface FactoryBean {
//从工厂中获取bean【这个方法是FactoryBean的核心】
@Nullable
T getObject() throws Exception;
//获取Bean工厂创建的对象的类型【注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型】
@Nullable
Class<?> getObjectType();
//Bean工厂创建的对象是否是单例模式
default boolean isSingleton() {
return true;
}
}
方法介绍: 1、 getobject ()方法会返回该FactoryBean “生产” 的对象实例,我们需要实现该方法以给出自己的对象实例化逻辑; 2、 getobjectTYype ()方法仅返回getobject ()方法所返回的对象的类型,如果预先无法确定,则返回null; 特别注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型,也就是说ioc中有很多类型的bean,要找到这个bean就是通过getobjectTYype ()方法的返回值类型!好吧,我举个例子
public class XXX implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new YYY;
}
@Override
public Class<?> getObjectType() { //注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型
return AAA.class;
}
}
那么要想在ioc中找到XXX这个类的bean(实际上是YYY) ,在getbean的时候写法如下
public class Demo1 {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext =
new AnnotationConfigApplicationContext(Appconfig.class);
annotationConfigApplicationContext.getBean( AAA.class ); // 【注意这里是AAA.class】
}
}
3、 isSingleton ()方法返回结果用于表明,工厂方法(getobject ())所“生产”的对象是否要以singleton形式存在于容器中。如果以singleton形式存在,则返回true,否则返回false;
FactoryBean表现的是一个工厂的职责。 即一个Bean A如果实现了FactoryBean接口,那么A就变成了一个工厂,根据A的名称获取到的实际上是工厂调用getObject()返回的对象,而不是A本身,如果要获取工厂A自身的实例,那么需要在名称前面加上’&'符号。 通俗点表达就是
getObject(’ name ‘)返回工厂中的实例 getObject(’ &name ')返回工厂本身的实例
通常情况下,bean 无须自己实现工厂模式,Spring 容器担任了工厂的 角色;但少数情况下,容器中的 bean 本身就是工厂,作用是产生其他 bean 实例。由工厂 bean 产生的其他 bean 实例,不再由 Spring 容器产生,因此与普通 bean 的配置不同,不再需要提供 class 元素。
2.3 、FactoryBean代码示例
1、创建一个Appconfig类,扫描com.yichun下的所有子包
@Configuration
@ComponentScan(“com.yichun”)
public class Appconfig {
}
2、创建一个StudentBean类并实现FactoryBean,并重写其两个方法
@Component(“studentBean”)
public class StudentBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new TeacherBean();
}
@Override
public Class<?> getObjectType() { //注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型
return StudentBean.class;
}
//一个学生学习方法
public void study(){
System.out.println(“学生学习。。。”);
}
}
3、再创建一个TeacherBean类
public class TeacherBean {
public void teacher(){
System.out.println(“老师教书。。。。”);
}
}
4、测试StudentBean类型
public class Demo1 {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
StudentBean studentBean = (StudentBean)annotationConfigApplicationContext.getBean(“studentBean”);
studentBean.study();
}
}
加上“&”符号
public class Demo1 {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
//加上了“&”符号
StudentBean studentBean = (StudentBean)annotationConfigApplicationContext.getBean(“&studentBean”);
studentBean.study();
}
}
运行成功
5、测试一下teacherBean类型
public class Demo1 {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
TeacherBean teacherBean = (TeacherBean) annotationConfigApplicationContext.getBean(“studentBean”);
teacherBean.teacher();
}
}
运行成功
最后
在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
大家看完有什么不懂的可以在下方留言讨论也可以关注。
觉得文章对你有帮助的话记得关注我点个赞支持一下!
714760445066)]
[外链图片转存中…(img-CxzyM6v3-1714760445067)]
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
大家看完有什么不懂的可以在下方留言讨论也可以关注。
觉得文章对你有帮助的话记得关注我点个赞支持一下!