美文网首页
BeanFactory & FactoryBean

BeanFactory & FactoryBean

作者: 一岁一枯荣啊 | 来源:发表于2019-11-01 14:36 被阅读0次

    1.BeanFactory & FactoryBean区别

    spring中的bean分两种,一种是普通的bean一种是FactoryBean,FactoryBean使用bean结尾说明他也是一个bean,不同的FactoryBean是一个工厂类接口,我们可以使用FactoryBean<T>自定义实例化Bean。获取factorybean返回的就是FactoryBean的getObject方法返回的对象,是不是单例的也是由FactoryBean
    .isSingleton方法决定。

    获取FactoryBean对象本身,需要在id前面加一个&符号来获取

    如果一些bean的构造方式比较复杂,我们可以使用FactoryBean自定义它的实例化逻辑

    2.FactoryBean使用示例

    业务说明:使用FactoryBean自定义ioc当中User这个对象的示例化过程

    
    /**
     * 实体类
     */
    public class User {
        private String id;
        private String name;
    
        public User(String id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    
    /**
     * 定义user这个bean生成的自定义逻辑,UserFactoryBean
     */
    public class UserFactoryBean implements FactoryBean<User> {
        @Override
        public User getObject() throws Exception {
            return new User("1", "admin");
        }
    
        @Override
        public Class<?> getObjectType() {
            return User.class;
        }
    
    //是否是单例的
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    
    
    
    /**
     * 创建一个获取springApplicationContext的工具
     */
    @Component
    public class SpringContextAware implements ApplicationContextAware {
        private static ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    
        public static Object getBean(String name) {
            return getApplicationContext().getBean(name);
        }
    
        public static <T> T getBean(Class<T> clazz) {
            return getApplicationContext().getBean(clazz);
        }
    
        public static <T> T getBean(String name, Class<T> clazz) {
            return getApplicationContext().getBean(name, clazz);
        }
    }
    
    /**
     * 配置这个用户bean
     */
     @Bean(name = "user")
     public UserFactoryBean getUserFactoryBean() {
        return new UserFactoryBean();
     }
    
    
    测试代码
    
    //获取bean name 为user 的类
    Object obj1 = SpringContextAware.getBean("user");
    System.out.println(obj1);
    //获取factory bean 本身加&
    Object obj2 = SpringContextAware.getBean("&user");
    System.out.println(obj2);
    
    控制台结果
    com.example.depy.democontrol.entity.User@1113517a
    com.example.depy.democontrol.config.UserFactoryBean@4e0f5d0d
    

    相关文章

      网友评论

          本文标题:BeanFactory & FactoryBean

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