美文网首页Spring框架
Spring相关问题与源码解析

Spring相关问题与源码解析

作者: SHAN某人 | 来源:发表于2018-07-30 16:58 被阅读8次

    1. BeanFactory和FactoryBean有什么区别?

    1.1 BeanFactory和FactoryBean是什么?
    • BeanFactory是一个接口,提供了OC容器最基本的形式,给具体的IOC容器的实现提供了规范.
    package org.springframework.beans.factory;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.NoSuchBeanDefinitionException;
    import org.springframework.core.ResolvableType;
    import org.springframework.lang.Nullable;
    
    public interface BeanFactory {
        String FACTORY_BEAN_PREFIX = "&";
    
        Object getBean(String var1) throws BeansException;
    
        <T> T getBean(String var1, @Nullable Class<T> var2) throws BeansException;
    
        Object getBean(String var1, Object... var2) throws BeansException;
    
        <T> T getBean(Class<T> var1) throws BeansException;
    
        <T> T getBean(Class<T> var1, Object... var2) throws BeansException;
    
        boolean containsBean(String var1);
    
        boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
    
        boolean isTypeMatch(String var1, @Nullable Class<?> var2) throws NoSuchBeanDefinitionException;
    
        @Nullable
        Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
    
        String[] getAliases(String var1);
    }
    
    
    • FactoryBean也是一个接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和修饰者模式 ,我们可以在getObject()方法中灵活配置。其实在Spring源码中有很多FactoryBean的实现类.
    package org.springframework.beans.factory;
    
    import org.springframework.lang.Nullable;
    
    public interface FactoryBean<T> {
        @Nullable
        T getObject() throws Exception;
    
        @Nullable
        Class<?> getObjectType();
    
        default boolean isSingleton() {
            return true;
        }
    }
    
    1.2 BeanFactory和FactoryBean的区别

    BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似.

    1.3 BeanFactory实例

    在 Spring 中,BeanFactory是 IoC 容器的核心接口。从Factory后缀得知它是一个工厂,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

    BeanFactory 提供的高级配置机制,使得管理任何性质的对象成为可能。
    ApplicationContext 是 BeanFactory 的扩展,功能得到了进一步增强,比如更易与 Spring AOP 集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的 context 实现(如针对 web 应用的WebApplicationContext)。

    用的比较多的 BeanFactory 的子类是 ClassPathXmlApplicationContext,这是 ApplicationContext接口的一个子类,ClassPathXmlApplicationContext从 xml 的配置文件中获取 bean 并且管理他们,例如:

    public static void main(String[] args) throws Exception {
        BeanFactory bf = new ClassPathXmlApplicationContext("student.xml");
        Student studentBean = (Student) bf.getBean("studentBean");
    
        studentBean.print();
    }
    

    XML配置如下:

    <bean id="studentBean" class="advanced.Student">
        <property name="name" value="Tom"/>
        <property name="age" value="18"/>
    </bean>
    
    1.4 FactoryBean实例
    public class StudentFactoryBean implements FactoryBean<Student> {
        private String name;
        private int age;
    /**  通常情况下,bean 无须自己实现工厂模式,
           Spring 容器担任工厂 角色;
          但少数情况下,容器中的 bean 本身就是工厂,
          作用是产生其他 bean 实例
    **/
        @Override
        public Student getObject() throws Exception {
            return new Student(name, age);
        }
    
        @Override
        public Class<?> getObjectType() {
            return Student.class;
        }
    
        /**
         * 工厂所管理的对象是否为单例的
         * 即如果该方法返回true,那么通过getObject()方法返回的对象都是同一个对象
         */
        @Override
        public boolean isSingleton() {
            return true;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    XML配置如下:

    <bean id="studentFactoryBean" class="spring.StudentFactoryBean">
        <property name="name" value="Tom"/>
        <property name="age" value="28"/>
    </bean>
    

    使用:

    public static void main(String[] args) throws Exception {
        BeanFactory bf = new ClassPathXmlApplicationContext("student.xml");
        Student studentBean = (Student) bf.getBean("studentFactoryBean");
    
        studentBean.print();
    }
    

    参考链接:
    https://www.cnblogs.com/aspirant/p/9082858.html
    https://www.jianshu.com/p/05c909c9beb0
    https://www.jianshu.com/p/a8036f3cc1e6

    2. Spring IoC容器初始化过程学习

    Spring IoC容器初始化过程学习

    相关文章

      网友评论

        本文标题:Spring相关问题与源码解析

        本文链接:https://www.haomeiwen.com/subject/gnvfvftx.html