Spring框架IOC及AOP概述
IOC
什么是IOC
1.控制反转,把创建对象和对象之间的调动过程交给spring进行管理
2.使用IOC的目的是为了降低代码耦合度
3.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
IOC底层原理:XML文件解析 工厂模式 反射
spring提供IOC容器实现的两种方式 (两个接口)
- BeanFactory:IOC容器基本实现,是Spring内部的接口,不提供给开发人员使用
(加载配置文件时不会创建对象,在获取对象(使用)才会创建对象)
- ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开饭人员进行使用,主要使用两个实现类(加载配置文件的时候会直接创建对象,把占资源耗时的任务交给服务器完成)
- FileSystemXmlApplicationContext: 调用时参数要写xml配置文件的绝对路径,例如:C : ..\..
- 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生命周期: 如果算上后置处理器一共七步
- 通过构造器创建bean实例
- 为bean的属性设置值和对其他对象引用(调用set方法)
(把bean的实例传递给后置处理器的postProcessBeforInitialization方法)
- 调用bean的初始化方法(需手动配置init-method)
(把bean的实例传递给后置处理器的postProcessAfterInitialization方法)
- Bean可以使用了
- 当容器关闭的时候,调用bean的销毁方法(需手动配置destory-method和.close)
Bean管理两种实现方式 :
- 基于XML配置文件方式实现
- 基于XML方式创建对象的描述
在spring配置文件中使用Bean标签,添加对应属性,来创建对象,创建对 象时 也默认执行无参构造方法
- 基于XML方式注入属性的基本方式(DI:依赖注入,就是注入属性,是IOC的一种具体实现)
set注入 : property标签
构造方法注入:constructor-arg标签
- Null值注入
在property标签中加入null标签
- 特殊符号注入
<>可以进行转义,或者将特殊符号内容写入CDATA结构中: <![CDATA[..**..]]>
- 内部bean和级联赋值
不在外部创建<bean>标签将对象属性注入,而是在<property>标签中创建 <bean>标签并且对对象属性赋值的行为称为内部bean注入
级联赋值:指在创建一个类的bean对象的时候将另一个类的bean对象也进行 赋值的行为
- 基于注解方式实现
注解:注解是代码的特殊标记,注解作用在类上面,方法上面和属性上面,目的是 简化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的方式
- 基于XML方式实现
- 基于注解方式实现(推荐)
在增强类上添加注解@Aspect 生成类代理对象( 在此之前需要在XML文件中配置 <aop:aspectj-autoproxy>标签 )
切入点表达式
作用是知道对那个类的那个方法进行增强
语法:(execution([权限修饰符][返回值类型][类全路经].[方法名称](参数列表))) 例:
(1)对com.ithiem.spring.Dao类下的add方法进行增强
Execution(*com.ithiem.spring.Dao.add(..))
- 对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)通过代理调用方法
- 有接口的情况,使用jdk动态代理:
首先创建需要动态代理的接口
-
需要代理的实际对象
-
调用处理器实现类
当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用。也就是说,当代码执行到:
subject.SayHello("jiankunking")这句话时,会自动调用InvocationHandlerImpl的invoke方法
银杏.: 期待Up继续更新
CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java
CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java