Spring

Spring

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

Spring IOC

IOC(Inversion of Controller)控制反转,将对象的管理控制权交给容器。
DI(Denpendency Injection)依赖注入,表现为给对象的属性赋值。在面向对象中,对象和对象之间是存在一种叫做“依赖”的关系。依赖关系就是在一个对象中需要用到另外一个对象,即对象中存在一个属性,该属性是另外一个类的对象。

注解

@Component
@Controller
@Service
@Repository
@Configuration
@Bean
@ComponentScan
@Scope
@Lazy
@Autowired
@Qualifier
@PostConstruct(JSR-250)
@PreDestroy(JSR-250)

Spring创建对象的方式

Spring框架创建对象有2种做法,第1种是通过组件扫描,第2种是通过配置类中的@Bean方法。
@ComponentScan配置需要扫描的包(默认从@ComponentScan所在类的package进行扫描),自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。
在Spring框架中,添加了@Component及其衍生注解的,都是组件!常见的组件注解有:
@Component通用组件注解
@Controller应该添加在控制器类上
@Service应该添加在处理业务逻辑的类上
@Repository应该添加在处理数据访问(直接与数据源交互)的类上
@Configuration应该添加在配置类上
以上5个组件注解,除了@Configuration以外,另外4个在功能、用法、执行效果方面,在Spring框架的作用范围内是完全相同的,只是语义不同!
@Bean在任何配置类中,添加在自定义返回对象的方法上,则Spring会自动调用此方法,并且,获取此方法返回的对象,将对象保存在Spring容器中。

Spring管理的对象的作用域

@Scope用于指定bean对象的作用域。
singleton:单例模式,Spring默认作用域为单例模式。
prototype:原型模式,每次获取Bean都会创建一个对象,根据经验,对有状态的bean采用prototype作用域,对于无状态的bean采用singleton作用域。
request:在web项目中可选,在一次http请求中,会使用同一bean实例,对不同的http请求会产生新的bean。Bean只在该http request中生效,当请求结束时,bean也会被销毁。
session:在web项目中可选,在同一http session中,会使用同一bean实例,在不同的session请求中会返回不同的实例。
global session:在web项目中可选,在一个全局http session中,容器会返回该 Bean 的同一个实例,仅在使用 portlet context 时有效。
@Lazy用于配置单例模式为懒加载的,单例模式默认是预加载的。

Spring管理的对象的生命周期

通过组件创建对象时:
@PostConstruct用于指定bean对象的初始化方法。
@PreDestroy用于指定bean对象的销毁方法。
通过@Bean方法创建对象时:
配置@Bean的属性initMethod来指定bean对象的初始化方法。
配置@Bean的属性destroyMethod来指定bean对象的销毁方法。

Spring自动装配机制

Spring的自动装配机制表现为:当Spring管理的类的属性需要被自动赋值,或Spring调用的方法的参数需要值时,Spring会自动从容器中找到合适的值,为属性 / 参数自动赋值!
@Autowired自动按照类型注入,自动注入一个符合类型要求的bean。属性参数:required默认为 true,如果装配失败就会报错,设置为 false 后,如果在容器中找不到就不进行装配,且不会报错。
如果容器中有一个匹配类型的对象,则直接装配,且装配成功。
如果容器中有多个匹配类型的对象,则自动切换为按照名称装配,如果名称也没有匹配,则报错。
@Qualifier来指定装配哪个Bean Name对应的Bean对象。

依赖注入的方式

属性注入(Field Injection)
构造器注入(Constructor Injection)
setter方法注入 (Setter Injection)

Spring AOP

AOP(Aspect Oriented Programming)面向切面编程,是面向对象对的一种补充,统一管理程序的横向关注点,统一处理横向关注点。通常是许多不同的数据处理流程中都需要解决的共同的问题,将那些影响了多个类的公共行为抽取到一个可重用模块里,减少系统的重复代码,降低模块间的耦合度,增强代码的可操作性和可维护性。
AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

Spring AOP实现

Spring AOP实现原理就是通过动态代理实现的。
实现方式一:有接口的情况下,使用JDK动态代理
实现方式二:没有接口情况下,使用 CGLIB 动态代理

注解

@Aspect
@Pointcut
@Around
@Before
@After
@AfterReturning
@AfterThrowing

AOP的基本概念

切面:把通知(增强)应用到切入点的过程
@Aspect在添加组件注解的类上添加,表示这是一个切面。
连接点:可以被增强的方法
切入点:实际被增强的方法
@Pointcut对连接点进行拦截的定义
切入点表达式:知道对哪个类里面的哪个方法进行增强
语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )
说明:* 号表示通配符,… 符号表示一个或多个参数
表达式中的星号:匹配任意内容,只能匹配1次
表达式中的2个连续的小数点:匹配任意内容,可以匹配0~n次,只能用于包名和参数列表部分
通知(增强):实际增强的逻辑部分叫做通知
@Around环绕通知(是前置通知和后置通知的综合,方法执行前和方法执行后都要执行,通常用作方法性能统计、接口耗时、统一加密、解密等)
@Before前置通知(执行方法前执行,通常用作参数日志输出、权限校验等)
@After后置通知(逻辑代码执行完,准备执行return的代码时通知,通常用作执行结果日志输出、结果加密等)
@AfterThrowing异常通知(相当于try{}catch ()中catch执行的部分,程序抛出异常时执行,通常用作告警处理、事务回滚等)
@AfterReturning最终通知(相当于try{}catch (Exception e){}finally { }中的finally执行的部分,通常用在关闭资源、清理缓存等业务逻辑中)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值