本帖最后由 Jack.李 于 2018-4-10 10:22 编辑
1.谈谈你对spring IOC和DI的理解,它们有什么区别?IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架 DI:Dependency 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 |