IOC & AOP
ioc
IOC的回答要点:
一、底层原理:
-
工厂模式
-
反射机制
二、ioc的解释:
-
IOC就是控制反转,他把传统上的由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理,所谓的控制反转的概念就是对组件对象的控制权的转移,从程序代码本身转移到了外部的容器
-
spring IOC 负责创建对象 管理对象(通过依赖注入DI 装配对象、配置对象)并且管理这些对象的整个生命周期
-
简单的来说就是:我们自己new的一个对象 可能会导致程序的耦合度过高 后期维护不便利 引入ioc将创建对象的控制权交给spring的ioc容器
三、ioc的具体应用:
如果是配置文件如何管理bean对象,如果是注解,有哪些注解。DI,给属性赋值。
-
什么是bean管理
-
1、Spring创建对象
2、Sping注入属性
-
-
Bean管理实现方式
-
1、基于xml配置文件方式实现
-
2、基于注解方式实现
-
-
Spring 针对 Bean 管理中创建对象提供注解
-
(1)@Component(普通组件)
-
(2)@Service(一般用在业务逻辑层,或者Service层)
-
(3)@Controller(一般用在Web层)
-
(4)@Repository (一般用在Dao层)
-
-
基于注解方式实现属性的注入
-
@Autowired:根据属性类型进行自动装配
-
@Qualifier:根据名称进行注入
-
@Resource:可以根据类型注入,可以根据名称注入
-
@Value:注入普通类型属性
-
四、ioc的好处
-
集中管理对象
-
方便维护
-
降低耦合度
五、pringIOC容器的加载过程
-
实例化一个ApplicationContext对象
-
调用Bean工厂的后置处理器(invokeBeanFactoryPostProcessors)完成扫描
-
循环解析扫描出来的类信息
-
实例化一个BeanDefinition对象来存储解析出来的信息
-
把实例化好的beanDefinition对象放到beanDefinitionMap中,以便后面实例化bean
ApplicationContext
-
objectsMap
-
beanDefinitionMap
-
beanDefinition
-
propertyDefinition
-
-
-
解析配置文件 通过配置文件告诉spring容器 管理的bean 有哪些 把解析的对象数据 封装到BeanDefinition 中
每个bean 都会有自己的 BeanDefinition 对象,把这些bean 的定义信息对象封装到一个 Map 中, 以beanId 为key 以BeanDefinition 为值
-
利用反射创建对象 把创建的对象存储到 map 中 ,以 beanId 为key 以创建的对象为 value
-
DI 属性注入 反射调用set 方法 给对象的属性赋值 得到完整的 对象
-
AOP
AOP:Aspect - Oriented Programming 面向切面编程,是通过预编译方式和运行期间动态代理,实现程序功能的统一维护的技术
一、底层原理
-
代理模式
-
动态代理:在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。 JDK 动态代理、CGLIB
-
静态代理:指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因 此也称为编译时增强
-
二、aop的解释
能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理
目标(Target) | 被通知的对象 |
---|---|
代理(Proxy) | 向目标对象应用通知之后创建的代理对象 |
连接点(JoinPoint) | (通知方法需要指定通知位置,这个位置即为连接点)目标对象的所属类中,定义的所有方法均为连接点 |
切入点(Pointcut) | 被切面拦截 / 增强的连接点(切入点一定是连接点,连接点不一定是切入点) |
通知(Advice) | 增强的逻辑 / 代码,也即拦截到目标对象的连接点之后要做的事情 |
切面(Aspect) | 切入点(Pointcut)+通知(Advice) |
Weaving(织入) | 将通知应用到目标对象,进而生成代理对象的过程动作 |
横切关注点 | 非核心业务代码 |
三、aop的具体应用
一: 记录日志 二: 监控方法运行时间 (监控性能) 三: 权限控制 四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象 返回,不需要查询数据库 ) 五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )
四、aop的好处。
有效减少了系统间的重复代码,达到了模块间的松耦合目的。
解耦:实现低耦合高内聚;
实现代码复用,提高使用效率。
五、Spring AOP 和 AspectJ AOP 有什么区别?
Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,
如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比 Spring AOP 快很多。