获得Bean得几种种方法 BeanFactory

配置文件

<bean id="user" class="com.work.pojo.User"/>

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springMvc.xml");
User user1 = context.getBean("user", User.class);//bean

声明类

@ComponentScan
public class Config {

//    @Bean
//    public User user(){
//        return new User();
//    }
}

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
User user1 = context.getBean("user", User.class);

使用BeanDefinitionBuilder

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
context.registerBeanDefinition("user",beanDefinition);

context.refresh();

User user1 = context.getBean("user", User.class);

使用FactoryBean

返回两个对象 一个是工厂对象,一个是user对象

package com.work.pojo;

import org.springframework.beans.factory.FactoryBean;

public class MyselfFactoryBean implements FactoryBean {

    public Object getObject() throws Exception {
        return new User();
    }

    public Class<?> getObjectType() {
        return User.class;
    }
}



public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        //返回的是两个Bean对象   &user:MyselfFactoryBean的对象  user:是user的对象
        beanDefinition.setBeanClass(MyselfFactoryBean.class);
        context.registerBeanDefinition("user",beanDefinition);
        context.refresh();

        Object bean = context.getBean("&user");
        System.out.println(bean);

        User user1 = context.getBean("user", User.class);
        System.out.println(user1);

    }

Supplier创建

匿名内部类的方式

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.registerBean(User.class, new Supplier<User>() {
    @Override
    public User get() {
        User user1 = new User();
        user1.setId(1);
        return user1;
    }
});

context.refresh();
User user1 = context.getBean("user", User.class);
System.out.println(user1);

Spring容器

存放bean

单例池:ConcurrentHashMap 变量名为 singletonObject key:beanName val:Object

因为是存放在ConCurrentHashMap中的,所以他的beanName不能重复,所以说他是单例的

非懒加载的单例Bean 在Spring加载的时候就吧对象创建好。

Spring启动的时候就会把懒加载好的单例bean对象放入单例池这个Map中,当我们取得时候通过 getBean方法就取出了对应得bean对象

双亲委派机制:双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载

BeanFactory:就是一个容器 存放了beanDefinition对象和bean对象

单例池就是就是BeanFactory的一个属性

    DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();


    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
    beanDefinition.setBeanClass(User.class);
    defaultListableBeanFactory.registerBeanDefinition("user",beanDefinition);

User user = defaultListableBeanFactory.getBean("user", User.class);
System.out.println(user);

ApplicationContext:

刷新就是销毁所有的bean对象,重新生成bean对象 两个对象是不同的.

可以分为可刷新,不可刷新两个类

继承了很多接口,继承了BeanFactory

AnnotationConfigApplicationContext:使用注解实现 不可刷新

ClassPathXmlApplicationContext: 使用xml文件实现 可以刷新

就是从ClassPath路径上去找xml文件

继承了ApplicationContext

当我们通过xml文件进行创建bean对象时,如果可以刷新,则启动之后,再去配置文件中修改bean名称,仍然可以得到bean对象,因为会先销毁所有的bean对象,重新创建,如果不能刷新,则创建的一直是同一个对象。

fileSystenXmlApplicationContext:

使用xml文件实现 是从相对路径或者绝对路径上去找

#Java学习##学习路径#
全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务