获得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学习##学习路径#