1.使用spring框架的优势是什么?
是基本的Spring模块,提供spring框架的基本功能。BeanFactory是任何以spring为基础的应用的核心。Spring框架建立在此模块之上,它使Spring成为一个容器
Bean工厂是工厂模式的一个实现,提供控制反转功能。用来把应用的配置和依赖从真正的代码中分离出来,最常见的beanFactory实现是XmlBeaFactory类
IOC是一种设计思想。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map,Map中存放的是各种对象。
将对象之间的相互依赖关系交由IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像一个工厂一样。当我们需要创建一个对象的时候,只需要配置好配置文件、注解即可,完全不用考虑对象是如何创建出来的。如果要使用IOC的话,只需要配置好,然后在需要的地方引用就可以了,大大增加了项目的可维护性,降低了开发难度
Spring时代我们一般通过XML文件来配置Bean,Spring Boot利用注解配置
Aop能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理,日志处理,权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可维护性和可扩展性。
Spring Aop是基于动态代理的,如果代理的对象实现了某个接口,那么Spring Aop就会使用JDK动态处理去创建对象;而对于没有实现接口的对象,就无法使用JDK动态代理了,而是用CGlib动态代理生成一个被代理对象的子类来作为代理。
1.singleton:单例模式,spring中的bean默认都是单例的
2.prototype:每次请求都会创建一个新的bean实例
3.request:每一次http请求都会 产生一个新的bean,该bean仅在当前http request中有效
4.session:每次http请求都会产生一个新的bean,该bean仅在当前http session中有效
5.global-session:全局session作用域,
单例bean存在线程问题,主要是因为多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
解决方法有两种
ApplicationContext提供了一种解决文档信息的方法,一种加载文件资源的方式,他可以向监听他们的bean发送消息,另外,容器或者容器中的beans操作,这些必须以bean工厂的编程方式处理的操作可以在应用上下文中以声明的方式处理,应用上下文实现了messageSource,该接口用于获取本地消息,实际的实现是可选的
相同点:两者都是通过xml配置文件加载bean,appllicationcontext相比beanFactory而言,提供了更多的扩展功能。
不同点:beanFactory是延迟加载,如果bean的某一个属性没有注入,beanFactory加载后,直到第一次使用调用getBean方法才会抛出异常,而applicationcontext则在初始化自身的时候检查,这样有助于检查所依赖的属性是否注入,所以通常情况下我们选择使用applicationContext.
Spring Bean是构成Spring应用核心的java对象,这些对象由spring ioc容器实例化,组装,管理。这些对象通过容器中配置的元数据创建,例如,使用xml文件中定义的创建
在spring中创建的beans都是单例的beans,在bean标签中有一个属性为singleton,如果设置为true,该bean是单例的,如果设为false,该bean是原型bean,默认为true
Spring框架对单例的支持是采用单例注册表的方式进行实现的,而这个注册表的缓存是hashmap对象,如果配置文件中的配置信息不要求使用单例,spring会采用新建实例的方式放回对象实例。
自动装备提供五种不同的模式供spring容器用来自动装备beans之间的依赖注入:
no:默认的方式是不进行自动装配,通过手动设置ref属性来进行装配bean。
byName:通过参数名自动装配,spring容器查找beans的属性,这些beans在xml配置文件中被设置为byName,之后容器试图匹配。装配和该bean的属性具有相同名字的bean。
byType:通过参数的数据类型自动装配,spring容器查找beans的属性,这些beans在xml配置文件中被设置为ByType,之后容器试图匹配和装配和该bean的属性类型一样的bean如果有多个bean符合条件,则抛出异常
constructor:这个同byType类似,不过是应用于构造函数的参数,如果在beanFactory中不是恰好有一个bean与构造函数相同参数,则抛出一个异常的错误。
autodetect:如果有默认的构造方法,通过construct方法自动装配,否则使用byType的方法自动装配
依赖注入作为控制反转的一个层面,可以有多重解释方式,在这概念中,你不用创建对象而只需要描述如何创建他们,你不必通过代码直接的将组件和服务连接在一起,而是通过配置文件说明那些组件需要什么服务,之后IOC容器负责衔接
构造器依赖注入
Setter方法依赖注入
最好选择有使用构造器实现强制依赖注入
就是将一个bean注入到其他的ean的property中,默认情况下,容器不会自动装配,需要我们手动设置,spring可以通过Bean Factory中注入的方式来搞定bean之间的依赖关系,达到自动装配的目的
自动装配建议少用,如果要使用,,建议使用byName