Spring框架IOC及AOP概述

IOC

什么是IOC

        1.控制反转,把创建对象和对象之间的调动过程交给spring进行管理

        2.使用IOC的目的是为了降低代码耦合度

        3.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂

IOC底层原理:XML文件解析  工厂模式  反射

spring提供IOC容器实现的两种方式  (两个接口)

  1. BeanFactory:IOC容器基本实现,是Spring内部的接口,不提供给开发人员使用

加载配置文件时不会创建对象,在获取对象(使用)才会创建对象

  1. ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开饭人员进行使用,主要使用两个实现类(加载配置文件的时候会直接创建对象,把占资源耗时的任务交给服务器完成
  1. FileSystemXmlApplicationContext: 调用时参数要写xml配置文件的绝对路径,例如:C : ..\..
  2. ClassPathXmlApplicationContext:调用时参数要写类路径,在src下直接写文件名就可以

Bean管理

概念:Bean管理指的是Spring创建对象,Spring注入属性两个操作

FactotyBean(工厂bean)

Spring 有两种类型的bean,一种是普通bean,一种是Factorybean(工厂bean),普通bean在配置文件中定义的bean类型就是返回对象的类型,但是在工厂bean中,配置文件中定义的bean类型,可以和返回的类型不一样

第一步:创建类,让这个类作为工厂bean,让他实现类接口FactoryBean

第二步:实现接口里面的方法,在方法中定义返回的bean类型

Bean对象作用域和生命周期

       作用域:通过设置bean标签的scope属性控制创建spring对象是单实例还是多实例,singleton是单实例prototype是多实例

       bean生命周期:  如果算上后置处理器一共七步

  1. 通过构造器创建bean实例
  2. 为bean的属性设置值和对其他对象引用(调用set方法)

(把bean的实例传递给后置处理器的postProcessBeforInitialization方法)

  1. 调用bean的初始化方法(需手动配置init-method)

(把bean的实例传递给后置处理器的postProcessAfterInitialization方法)

  1. Bean可以使用了
  2. 当容器关闭的时候,调用bean的销毁方法(需手动配置destory-method和.close)

Bean管理两种实现方式 :

  1. 基于XML配置文件方式实现
  1. 基于XML方式创建对象的描述

在spring配置文件中使用Bean标签,添加对应属性,来创建对象,创建对      象时      也默认执行无参构造方法

  1. 基于XML方式注入属性的基本方式(DI:依赖注入,就是注入属性,是IOC的一种具体实现)

set注入 : property标签

构造方法注入:constructor-arg标签

  1. Null值注入

在property标签中加入null标签

  1. 特殊符号注入

<>可以进行转义,或者将特殊符号内容写入CDATA结构中:  <![CDATA[..**..]]>

  1. 内部bean和级联赋值

不在外部创建<bean>标签将对象属性注入,而是在<property>标签中创建       <bean>标签并且对对象属性赋值的行为称为内部bean注入

级联赋值:指在创建一个类的bean对象的时候将另一个类的bean对象也进行        赋值的行为

  1. 基于注解方式实现

注解:注解是代码的特殊标记,注解作用在类上面,方法上面和属性上面,目的是           简化XML配置代码

格式:@注解名称(属性名=属性值,属性名=属性值)(可以不写id属性值,默认是类名首字                    母小写)

*步骤 1.引入spring-aop.jav包依赖

2.开启组件扫描   <context:component-scan>标签

3.在类上面添加创建对象注解@Componet,@Sercvice,@controller或                            @Repository

注解注入属性:在属性上面添加注解

@AutoWired:根据属性类型进行自动装配

@Qualifier:根据属性名称进行注入(当一个接口有多个实现类时不能用@Autowired,就需要指                       定对象名称注入)

@Resource:可以根据类型注入,也可以根据名称注入

@Value:注入普通类型属性(上面三个是注入对象类型属性)

AOP

AOP概念

面向切面编程,通俗来讲就是在不修改源码的情况下,在主干功能中添加新的功能

AOP术语

连接点:类里面可以被增强的方法,这些方法被称为切点

切入点:实际被增强的方法被称为切入点

通知  :也叫增强,实际增加的逻辑部分称为通知(增强),有5种类型(前置/              后置/环绕/异常/最终通知)

切面  :把通知应用到切入点的过程叫做切面

AspectJ

Spring框架中一般都是通过AspectJ实现AOP操作

AspectJ并不是Spring的组成部分,是独立的AOP框架,一般把它和Spring框架一起使用,进行AOP操作

AspectJ两种实现AOP的方式

  1. 基于XML方式实现
  2. 基于注解方式实现(推荐)

在增强类上添加注解@Aspect 生成类代理对象( 在此之前需要在XML文件中配置           <aop:aspectj-autoproxy>标签 )

切入点表达式

作用是知道对那个类的那个方法进行增强

语法:(execution([权限修饰符][返回值类型][类全路经].[方法名称](参数列表))) 例:

(1)对com.ithiem.spring.Dao类下的add方法进行增强

Execution(*com.ithiem.spring.Dao.add(..))

  1. 对com.ithiem.spring.Dao类下的所有方法进行增强

Execution(*com.ithiem.spring.Dao.*(..))

       相同切入点抽取:在构造方法上添加@Pointcut注解,抽取后通知类型value属性

填方法名即可

例如下代码可写:@Befor(value=”pointdemo”)

                           @Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")

                       public void pointdemo() {

}

五种通知类型

@Before(value=”切入点表达式)前置通知:方法执行之前执行

@After()最终通知:方法执行之后执行,不管有没有异常都执行

@AfterReturning()返回通知:方法返回结果值之后执行,比@after靠后

@AfterThrowing()异常通知

@Around()环绕通知

公共切入点提取和优先级

提取:建立一个方法,在方法上用切入点注解@Pointcut(切入点表达式),当通知使用相同切入点时直接在属性值填入方法名即可

@Order():添加在增强类上,当一个方法有多个增强类的时候需要设置优先级,值越小优先级越高,优先级高的先执行

底层原理

AOP底层使用动态代理

动态代理步骤:

(1)创建一个实现接口InvocationHandler的类,它必须实现invoke方法

(2)创建被代理的类以及接口

(3)通过Proxy的静态方法newProxyInstance(ClassLoaderloader, Class[]                      interfaces, InvocationHandler h)创建一个代理

(4)通过代理调用方法

  1. 有接口的情况,使用jdk动态代理:

    首先创建需要动态代理的接口                

         

  2.   需要代理的实际对象                    

  3.     

    调用处理器实现类

    当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用。也就是说,当代码执行到:

    subject.SayHello("jiankunking")这句话时,会自动调用InvocationHandlerImpl的invoke方法

猜你喜欢

转载自blog.csdn.net/yb941693493/article/details/125478417