A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© Jack.李 中级黑马   /  2018-4-10 10:19  /  727 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Jack.李 于 2018-4-10 10:22 编辑

1.谈谈你对spring IOC和DI的理解,它们有什么区别?
IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架
DIDependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件
见下图
面试题: IoC DI的区别?
IoC 控制反转,指将对象的创建权,反转到Spring容器 , DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
2.BeanFactory 接口和 ApplicationContext 接口有什么区别
    ①ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
    ②ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现
开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
IHelloService helloService = (IHelloService) beanFactory.getBean("helloService");
helloService.sayHello();
3.spring配置bean实例化有哪些方式?
    1)使用类构造器实例化(默认无参数)
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
    2)使用静态工厂方法实例化(简单工厂模式)
//下面这段配置的含义:调用Bean2Factory的getBean2方法得到bean2
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>
    3)使用实例工厂方法实例化(工厂方法模式)
//先创建工厂实例bean3Facory,再通过工厂实例创建目标bean实例
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
4.简单的说一下spring的生命周期?
    1)在配置 <bean> 元素,通过 init-method 指定Bean的初始化方法,通过 destroy-method 指定Bean销毁方法
<bean id="lifeCycleBean" class="cn.itcast.spring.d_lifecycle.LifeCycleBean" init-method="setup" destroy-method="teardown"></bean>
需要注意的问题:
    *  destroy-method 只对 scope="singleton" 有效  
    *  销毁方法,必须关闭ApplicationContext对象(手动调用),才会被调用
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.close();
    2)Bean的完整生命周期 (十一步骤)【了解内容,但是对于spring内部操作理解有一定帮助
①instantiate bean对象实例化
②populate properties 封装属性
如果Bean实现BeanNameAware 执行 setBeanName
如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
如果存在类实现 BeanPostProcessor(后处理Bean ,执行postProcessBeforeInitialization,BeanPostProcessor接口提供钩子函数,用来动态扩展修改Bean。(程序自动调用后处理Bean)
public class MyBeanPostProcessor implements BeanPostProcessor {
        public Object postProcessAfterInitialization(Object bean, String beanName)
                        throws BeansException {
                System.out.println("第八步:后处理Bean,after初始化。");
                //后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
                return bean;//返回bean,表示没有修改,如果使用动态代理,返回代理对象,那么就修改了。
        }
        public Object postProcessBeforeInitialization(Object bean, String beanName)
                        throws BeansException {
                System.out.println("第五步:后处理Bean的:before初始化!!");
                //后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
                return bean;//返回bean本身,表示没有修改。
        }
}
注意:这个前处理Bean和后处理Bean会对所有的Bean进行拦截。
如果Bean实现InitializingBean 执行 afterPropertiesSet
调用<bean init-method="init"> 指定初始化方法 init
如果存在类实现 BeanPostProcessor(处理Bean ,执行postProcessAfterInitialization
执行业务处理
如果Bean实现 DisposableBean 执行 destroy
调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

图片1.png (53.05 KB, 下载次数: 15)

图片1.png

1 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马