Spring学习小结(IOCAOP)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习小结(IOCAOP)相关的知识,希望对你有一定的参考价值。

Spring

简介:前身interface21,Spring1.0在2004年3.24推出

作者:Rod Johnson,音乐博士

理念:简化复杂的开发

优点:

Spring是一个开源的、免费的框架

Spring是一个轻量级的、非入侵式的框架

控制反转IOC

面向切面编程AOP

支持事务的处理,对框架整合的支持

总结:Spring是一个轻量级的、控制反转和面向切面编程的框架。

Spring的组成

image

IOC理论推导

在我们之前的开发过程中,用户需求会影响我们之前的方法,我们需要根据需求去修改之前的代码,如果程序代码量巨大,修改一次的成本很昂贵。

1.set()方法注入

public void setUserDao(UserDao userDao){

	this.userDao=userDao;

}

之前,程序是主动创建对象,控制权在程序员的手中

使用了set方法注入后,程序员不再具有主动性,而是变成了被动的接收对象!

程序员不用再去管理对象的创建,系统的耦合性大大降低,可以专注于业务的实现,这从根本上解决了问题

这时IOC的原型,控制权发生了反转。

Spring IOC

对象是谁创建的 ? 【对象是由Spring创建的

对象的属性是怎么设置的 ? 对象的属性是由Spring容器设置的

这个过程就叫控制反转 :

控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的

反转 : 程序本身不创建对象 , 而变成被动的接收对象 .

依赖注入 : 就是利用set方法来进行注入的.

IOC是一种编程思想,由主动的编程变成被动的接收
对象由Spring 创建、管理、装配、销毁!!

BeanFactory和ApplicationContext

  1. BeanFactory是基础,BeanFactory和它的子接口定义的API满足了spring环境中对bean管理和配置的需求;
  2. ApplicationContext是扩展,以BeanFactory为主线,通过继承的方式综合了环境、国际化、资源、事件等多条支线,自己又规定了一些扩展服务(如返回context的id,应用名称等),而所有支线都以bean服务为基础;
    原文链接:https://blog.csdn.net/boling_cavalry/article/details/81603303

Spring IOC对象的创建:

在配置文件加载的时候。其中管理的对象都已经初始化了!

Spring配置

bean的配置

别名:,可以通过别名来获取bean

<bean id="hello" class="com.wang.pojo.Hello" name="hello3,hello4">

可以通过name来设置别名,且可以设置多个。

可以导入多个xml配置文件。

假如有多个配置文件,可以导入一个总的配置文件,获取容器的时候只需加载一个配置文件就可以。

Spring 依赖注入 DI

1.构造器注入

2.set方式注入 Spring依赖注入使用的是set()方法实现的

3.扩展方式

C命名和p命名空间的注入

Spring Bean的作用域

1.singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。
2.prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。
3.request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。
4.session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。
5.application 限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。

Spring Bean的生命周期

实例化 -> 属性赋值 ->初始化 ->销毁,总的就这四个,其他的都是拓展方法

1.通过构造器或者工厂方法创建Bean实例

2.为Bean的设置值和对其他Bean的引用。

3.将Bean实例传给Bean的后置处理器postProcessBeforeInitialization方法。

4.调用Bean的初始化方法。

5.将Bean实例传给Bean的后置处理器 postProcessAfterInitialization方法

6.Bean可以使用了

7.当关闭容器时,调用Bean的销毁方法。

可以在xml配置文件中配置bean的初始化回调方法(init-method)和销毁回调方法(destory-method)。

Spring bean的装配模式

1,byName。
通过byName方式自动装配属性时,是在定义Bean的时候,在property标签中设置autowire属性为byName,那么Spring会自动寻找一个与该属性名称相同或id相同(set方法的名称)的Bean,注入进来。

2,byType。
通过byType方式自动注入属性时,是在定义Bean的时候,在property标签中设置autowire属性为byType,那么Spring会自动寻找一个与该属性类型相同(Class)的Bean,注入进来。

3,constructor。
通过构造器自动注入。在定义Bean时,在bean标签中,设置autowire属性为constructor,那么,Spring会寻找与该Bean的构造函数各个参数类型相匹配的Bean,通过构造函数注入进来。

4,autodetect。
自动装配。如果想进行自动装配,但不知道使用哪种类型的自动装配,那么就可以使用autodetect,让容器自己决定。这是通过在定义Bean时,设置bean标签的autowire属性为autodetect来实现的。设置为autodetect时,Spring容器会首先尝试构造器注入,然后尝试按类型注入

Spring bean的装配:

1.xml配置,根据set方法;

2.注解,底层是根据反射

注解:

@Autowired:默认根据byType装配,如果允许为空,可以设置required=false来设置,如果我们想使用byName来装配可以使用@Qualifier(“beaName”)来结合使用。

@Resource:默认根据byName装配,如果装配失败,会通过反射机制自动根据byType来装配。

Spring三种配置方式: xml、注解和java Configuration

xml :更加万能,能够涵盖到所有的配置,维护更加方便

注解:维护相对复杂

一般在使用中,用xml管理bean,用注解完成bean的属性注入。

java:当实例化Bean的逻辑比较复杂时,则比较适合基于Java类配置的方式。

@Configuration

 从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

注意:@Configuration注解的配置类有如下要求:

  1. @Configuration不可以是final类型;
  2. @Configuration不可以是匿名类;
  3. 嵌套的configuration必须是静态类。

一、用@Configuration加载spring
1.1、@Configuration配置spring并启动spring容器
1.2、@Configuration启动容器+@Bean注册Bean
1.3、@Configuration启动容器+@Component注册Bean
1.4、**使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法
**1.5、配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)

二、组合多个配置类
2.1、在@configuration中引入spring的xml配置文件
2.2、在@configuration中引入其它注解配置
2.3、@configuration嵌套(嵌套的Configuration必须是静态类)
三、@EnableXXX注解
四、@Profile逻辑组配置
五、使用外部变量

Spring代理模式(静态代理,动态代理)

Spring AOP的底层就是代理模式实现的。

image

静态代理:

一个代理商只能代理一个房东。当接口的新增方法时,所有的代理实现类都得该。

角色分析:

抽象角色:一般会使用接口或者抽象类来解决。

真实角色:被代理的角色

代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作

客户:访问代理对象的人

代理模式的好处

使用代理模式具有以下几个优点:

1、代理模式能将代理对象与真实被调用的目标对象分离。

2、一定程度上降低了系统的耦合度,扩展性好。

3、可以起到保护目标对象的作用。

4、**可以对目标对象的功能增强。 ** 主要是这点

当然,代理模式也是有缺点的

1、代理模式会造成系统设计中类的数量增加。

2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。

3、增加了系统的复杂度

动态代理:

底层都是反射实现的

动态代理和静态代理角色一样

动态代理的代理类是在程序执行时,根据jdk的反射机制动态生成的,不是我们直接写好的

动态代理分为两大类:基于接口的动态代理,基于类的动态代理

基于接口:JDK动态代理

基于类:cglib(第三方提供的,在Mybatis,Spring等框架中使用多,性能更高)底层使用字节码继承要代理的类。

动态代理具体步骤:

  1. 通过实现 InvocationHandler 接口创建自己的调用处理器;
  2. 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
  3. 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
  4. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。

链接:https://www.jianshu.com/p/9bcac608c714

image

动态代理的好处:

包括了静态代理的所有优点。解决了静态代理的缺点

一个动态代理类代理的是一个接口,不用单独去写一个模板

Spring AOP

AOP面向切面编程,可以补充OOP面向对象编程的一些缺点,当我们需要处理一些分散对象的公共行为时,例如,日志管理、权限管理等,OOP会使用大量重复代码,导致各模块的功能很难重用,显得无能为力,而AOP却能很好的解决。AOP将业务核心代码与公共核心方法分离开。将公共核心方法封装成一个公共模块,就相当于一个切面。减少了重复代码,降低系统耦合。

AOP底层的实现技,主要分为两大类:

一是采用动态代理,利用消息截取的方式,对消息进行装饰,以取代原有对象行为的执行。

二是采用静态织入的方式,引入特定语法创建切面,从而使编译器在编译期间织入有关切面的代码。

AOP的主要使用场景:

日志记录、权限验证、异常处理、持久化等等。

AOP的常用注解
@Aspect
作用:把当前类声明为切面类。
@Before
作用:把当前方法看成是前置通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。 讲师:陈飞
@AfterReturning
作用:把当前方法看成是后置通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@AfterThrowing
作用:把当前方法看成是异常通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@After
作用:把当前方法看成是始终通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Around
作用:把当前方法看成是环绕通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Pointcut
作用:指定切入点表达式
属性:
value:指定表达式的内容

Spring 整合mybatis

Spring 声明式事务

事务的四个属性ACID

原子性:每一个事务都是原子操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么全部失败。

一致性:一旦所有的事务完成,事务就要被提交,数据和资源处于一种满足业务规则的一致状态

隔离性:可能多个事务同时处理相同的数据,因此每个事务与其他的事务隔离开,防止数据被破坏

持久性:事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化储存其中。

Spring声明式事务比编程式事务好。

声明式事务将管理事务的方法从业务代码中分离出来,以声明的方式来实现事务管理。

将事务管理作为横切点,通过AOP模块化。

基于注解 @Transactional

@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

@Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)

以上是关于Spring学习小结(IOCAOP)的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#Spring 源码阅读Spring IoCAOP 原理小总结

给小师妹展开说说,Spring Bean IOCAOP 循环依赖

给小师妹展开说说,Spring Bean IOCAOP 循环依赖

SpringBoot学习小结

Spring基础知识小结

spring boot 登录注册 demo -- 体验小结