一、Spring是什么
Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用于企业应用
是一个轻量级的控制反转和面向切面的容器框架
从大小和开销而言都是轻量级
提供了丰富的切面编程丰富支持,允许通过分离应用的业务逻辑与系统级服进行内聚性的开发
包含并管理应用对象的配置和生命周期,这种意义上是一种容器
将简单的组件配置,组合成为复杂的应用,这种意义上来说是一种框架
二、Spring的特点
1、IOC和DI
IOC: 控制反转
即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建(spring)
DI: Dependency Injection 依赖注入
spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件.
2.IOC 的实现
实现IOC思想需要DI做支持
配置Bean:通过全类名配置
id:一般用将类型的首字母改为小写
class:全类名,通过反射方式在IOC中创建Bean,要求Bean中必须有无参数的构造器
注入方式: 1.set方式注入 2.构造方法注入 3.字段注入
注入类型: 1.值类型注入 2.引用类型注入
———————————————
注解配置
1.对bean的标注基于注解方式有:
@Component:放在一个类前边,他可以被Spring识别,Spring容器会自动将POJO转换为容器管理的Bean.他和XML配置是等效的:
@Repository:对DAO类进行标注
@Service:对Service类进行标注
@Controller:对Controller类进行标注
2.获得基于注解的bean配置信息,需要配置context:component-scan进行扫描
3.使用@Autowired注解实现Bean的依赖注入,默认按照类型byType的方式匹配;
@Autowired 标注的变量中。如果在Spring启动时没有一个和标注变量类型匹配的 bean ,则会抛NoSuchBeanDefinitionException 异常,如果希望 Spring 即使找不到匹配的 bean 也不要抛出异常,可以使用@Autowired(required=false) 进行标注
3.AOP
AOP是Spring框架的面向切面的编程思想,是对面向对象思想的一种补充,通俗的说就是将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机切入到业务流程指定的位置。它的出现是为了解决代码冗余问题,假设在一个复杂的业务系统中,用户登录是基础功能,存在多个业务涉及用户登录:
传统设计思想:把登录功能实现代码写入每个业务流程中,造成许多的代码冗余,维护和更新非常麻烦。
使用动态代理思想:使用一个代理将对象包装起来,然后该代理对象取代原始对象,任何对原始对象的调用都要通过该代理,代理对象决定是否以及何时将方法调用转到原始对象上
AOP的思想类似动态代理的思想,将这个登录功能抽取出来形成独立的模块,当业务流程需要用到的时候,系统自动将登录模块切入到业务流程中。
基本概念:
切面(Aspect):一个横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象,一个关注点可能有多个对象,实现的方式是基于@Aspect注解
连接点(Jointpoint)在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候,一个连接点总是表示一个方法的执行
通知(Advice):在切面的某个特定连接点上执行的动作,是切面必须要完成的动作,有around,after,before等不同类型的通知
切入点(Pointcut):匹配连接点的断言,通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行
引入(Introduction):用来给一个类型声明额外的方法或属性,Spring允许引入新的接口到任何被代理的对象
目标对象(Target Object):被一个或多个切面通知的而对象
AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约,执行动作,向目标对象应用通知之后创建的对象
织入(WeaVing):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象
通知的类型
前置通知:在某连接点之前执行的通知,这个通知不能组织连接点之前的执行流程
后置通知:在某连接点正常完成后执行的通知
异常通知:在方法抛出异常退出时执行的通知
最终通知:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
环绕通知:保卫一个连接点的通知,如方法调用