1. Spring的BeanFactory和FactoryBean的区别

    1. Spring的BeanFactory是顶层接口,定义了Spring容器的基本功能,ApplicationContenxt是BeanFactory的子接口,增强了BeanFactory,减少了读取配置文件和国际化等性能

      BeanFactory    -> ApplicationContenxt 子级接口    -> ClassPathXmlApplicationContenxt 基于XML的配置    -> FileSystemXmlApplicationContenxt     -> AnnotationConfigApplicationContenxt 注解配置
    1. FactotyBean是一种结构简单Bean的形式的接口,能够自定义Bean的细节并退出Spring治理

2. Bean的生命周期

  1. 初始化Bean
  2. 注入属性值
  3. 如果实现BeanNameAware接口,调用BeanNameAwaresetBeanName传入以后Bean的ID
  4. 如果实现BeanFactoryAware接口,调用BeanFactoryAwaresetBeanFactory传入以后工厂实例的援用
  5. 如果实现ApplicationContextAware接口,调用ApplicationContextAwaresetApplicationContext传入以后ApplicationContext实例的援用
  6. 如果有Bean的前置初始化处理器,调用postProcessBeforeInitialization执行解决
  7. 如果实现InitializingBean接口,调用InitializingBeanafterPropertiesSet办法
  8. 调用init办法进行初始化
  9. 如果有Bean的后置初始化处理器,调用postProcessAfterInitialization执行解决
  10. 如果作用范畴是单例,则退出Ioc缓存池,否则完结
  11. 当ApplicationContext容器敞开时,调用设定的preDestorydestory执行销毁
/** * 注解将Bean退出IOC */@Configuration@ComponentScan({"com.pal.entity"})public class SpringConfig {    @Bean(value = "PoDemo",initMethod = "init",destroyMethod = "destroy")    public PoDemo getInstance(){        PoDemo poDemo = new PoDemo();        poDemo.setName("poDemo");        return poDemo;    }}
/** * 除process拦截器外的生命周期办法 */public class PoDemo implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {    private String name;    private Integer age;    @Override    public void setBeanName(String name) {        System.out.println("3.注册我成为Bean时定义的ID:"+name);    }    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        System.out.println("4.治理此Bean的BeanFactory为:"+beanFactory);    }    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        System.out.println("5.治理此Bean的ApplicationContext为:"+applicationContext);    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("7.属性设置之后执行 afterPropertiesSet()");    }    public void init() {        System.out.println("8.Bean的Init办法被执行");    }        @PreDestroy    public void preDestroy() {        System.out.println("10.销毁Bean之前执行preDestroy");    }    public void destroy() {        System.out.println("11.调用destroy办法销毁Bean");    }        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }}
/** * 拦挡实例化、属性注入之后的对象 */@Componentpublic class BeanPostProcessorDemo implements BeanPostProcessor {    /**     * Init办法执行前的操作     */    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        if ("PoDemo".equalsIgnoreCase(beanName))        {            System.out.println("6.Init办法前的解决!");        }        return null;    }    /**     * Init办法执行后的操作     */    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        if ("PoDemo".equalsIgnoreCase(beanName))        {            System.out.println("9.Init办法后的解决!");        }        return null;    }}
/** * 启动办法 */@Testvoid BeanLifeTest() {    // 在config类中将Bean退出治理用    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);    PoDemo poDemo = (PoDemo) applicationContext.getBean("PoDemo");    System.out.println("加载Bean -> "+poDemo.getName());    applicationContext.close();}

3. Bean加载形式

2.1 XML形式

// 通常引入xml形式ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");BeanClass bean = applicationContext.getBean("beanId");
<!-- Spring ioc 实例化Bean的三种形式 --><!-- 一:应用无参结构器(举荐) --><bean id = "beanId" class = "com.lagou.xxx."></bean><!-- 另外两种是为了将new的对象退出spring治理 --><!-- 二:静态方法 --><bean id = "beanId" class = "com.lagou.xxx.xxxFactory" factory-method = "getInstance"></bean>public class Factory{    public static XXBean getinstance(){        return new XXBean();    }}<!-- 三:实例化办法 --><bean id = "factoryBeanId" class = "com.lagou.xxx.xxxFactory"></bean><bean id = "beanId" factory-bean = "factoryBeanId" factory-method = "getInstance"></bean>public class Factory{    public XXBean getinstance(){        return new XXBean();    }}

3. Bean的作用范畴与生命周期

3.1 作用范畴

  • Singleton -> 单例 bean对象生命周期与容器雷同。
  • Prototype -> 多例 bean对象,spring框架只负责创立,不负责销毁(JVM回收)。
  • Request,session
<bean id = "beanId" class = "com.lagou.xxx." scope = "xxx"></bean>