说一下spring中Bean的做用域前端
singleton:程序员
Spring IoC容器中只会存在一个共享的Bean实例,不管有多少个Bean引用它,始终指向同一对象。Singleton做用域是Spring中的缺省做用域。spring
prototype:设计模式
每次经过Spring容器获取prototype定义的bean时,容器都将建立一个新的Bean实例,每一个Bean实例都有本身的属性和状态,而singleton全局只有一个对象。缓存
request:session
在一次Http请求中,容器会返回该Bean的同一实例。而对不一样的Http请求则会产生新的Bean,并且该bean仅在当前Http Request内有效。框架
session:post
在一次Http Session中,容器会返回该Bean的同一实例。而对不一样的Session请求则会建立新的实例,该bean实例仅在当前Session内有效。spa
global Session:prototype
在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。
说一下spring中Bean的生命周期
实例化一个Bean,也就是咱们一般说的new。
按照Spring上下文对实例化的Bean进行配置,也就是IOC注入。
若是这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID。
若是这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂自己(能够用这个方法获取到其余Bean)。
若是这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文。
若是这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor常常被用做是Bean内容的更改,而且因为这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术。
若是这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
若是这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法。
当Bean再也不须要时,会通过清理阶段,若是Bean实现了DisposableBean接口,会调用其实现的destroy方法。
最后,若是这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
对Spring中依赖注入两种方式的认识
两种注入方式为:构造方法注入和设值注入
设值注入与传统的JavaBean的写法更类似,程序员更容易理解、接受,经过setter方式设定依赖关系显得更加直观、明显;
对于复杂的依赖关系,若是采用构造注入,会致使构造器过于臃肿,难以阅读。Spring在建立Bean实例时,须要同时实例化其依赖的所有实例,于是会产生浪费。而使用设值注入,则避免这下问题;
在某些属性可选的状况下,多参数的构造器更加笨拙,官方更鼓励使用设值注入。
构造注入能够在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。
对于依赖关系无须变化的Bean,构造注入更有用处,由于没有setter方法,全部的依赖关系所有在构造器内设定,所以,不用担忧后续代码对依赖关系的破坏。
构造注入使依赖关系只能在构造器中设定,则只有组件的建立者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系彻底透明,更符合高内聚的原则。
设值注入不会重写构造方法的值。若是咱们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值。
建议采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽可能采用构造注入;而其余的依赖关系的注入,则考虑采用set注入。
Spring框架中都用到了哪些设计模式?
代理模式:在AOP和remoting中被用的比较多。
单例模式:在spring配置文件中定义的bean默认为单例模式。
模板方法模式:用来解决代码重复的问题。
前端控制器模式:Spring提供了DispatcherServlet来对请求进行分发。
依赖注入模式:贯穿于BeanFactory / ApplicationContext接口的核心理念。
工厂模式:BeanFactory用来建立对象的实例。
BeanFactory 和ApplicationContext的区别
BeanFactory和ApplicationContext都是接口,而且ApplicationContext是BeanFactory的子接口。
BeanFactory是Spring中最底层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能。而ApplicationContext是Spring的一个更高级的容器,提供了更多的有用的功能。
ApplicationContext提供的额外的功能:国际化的功能、消息发送、响应机制、统一加载资源的功能、强大的事件机制、对Web应用的支持等等。
加载方式的区别:BeanFactory采用的是延迟加载的形式来注入Bean;ApplicationContext则相反的,它是在Ioc启动时就一次性建立全部的Bean,好处是能够立刻发现Spring配置文件中的错误,坏处是形成浪费。