AOP ( Aspect Oriented Programming )面向切面编程
AOP不是一种技术,实际上是编程思想。凡是符合AOP思想的技术,都可以看成是AOP的实现
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。
连接点(JoinPoint):需要在程序中插入横切关注点的点,连接点可能是在类初始化、方法调用、字段调用或处理异常等等。Spring中只支持方法执行连接点。
切入点(Pointcut):一组相关连接点的集合。
通知(Advice):在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段。包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice)。
切面(Aspect):通知和切入点的结合。
织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程。
代理(Proxy):通过代理方式来对目标对象应用切面。AOP代理可以用JDK动态代理或CGLIB代理实现。
目标对象(Target):需要被织入关注点的对象。即被代理的对象。
通知(Advice):通知是切面的一种,可以完成简单的织入功能。通知可以定义切面织入的时间点,切入点定义了切面织入的位置。
顾问(Advisor):顾问是切面的一种,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂的切面的装配器。

/*AOP编程使用
*注解版本实现AOP
*/
@Aspect //指定一个类为切面类
@Pointcut("execution(* com.itmayiedu.service.UserService.add(..))") //指定切入点表达式
@Before("pointCut_()")// 前置通知: 目标方法之前执行
@After("pointCut_()") //后置通知:目标方法之后执行(始终执行)
@AfterReturning("pointCut_()") //返回后通知: 执行方法结束前执行(异常不执行)
@AfterThrowing("pointCut_()") //异常通知: 出现异常时候执行
@Around("pointCut_()") //环绕通知: 环绕目标方法执行
编程应用场景
日志记录,性能统计,安全控制,事务处理,异常处理。
IOC(控制反转)就是依赖倒置原则的一种代码设计思路。就是把原先在代码里面需要实现的对象创建、对象之间的依赖,反转给容器来帮忙实现。
所谓的 IoC 容器就是指的 Spring 中 Bean 工厂里面的 Map 存储结构(存储了 Bean 的实例)。
(1)ApplicationContext 接口:
(2)BeanFactory 工厂(是 Spring 框架早期的创建 Bean 对象的工厂接口)
其实通过源码分析,不管是 BeanFactory 还是 ApplicationContext,其实最终的底层BeanFactory 都是 DefaultListableBeanFactory。
创建 Bean 对象的时机不同:
(1)BeanFactory 采取延迟加载,第一次调用 getBean() 方法时才会初始化 Bean。
(2)ApplicationContext 是加载完 applicationContext.xml 时,就创建具体的 Bean 对象的实例。(只对 BeanDefition 中描述为是单例的 bean,才进行饿汉式加载)
@Override 用在方法上,表示这个方法重写了父类的方法
@Deprecated 表示这个方法已经过期,不建议开发者使用。(暗示在将来某个不确定的版本,就有可能会取消掉)
@SuppressWarnings Suppress英文的意思是抑制的意思,这个注解的用处是忽略警告信息。
@SuppressWarnings 有常见的值,分别对应如下意思
1.deprecation:使用了不赞成使用的类或方法时的警告(使用@Deprecated使得编译器产生的警告);
2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 关闭编译器警告
3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
4.path:在类路径、源文件路径等中有不存在的路径时的警告;
5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
6.finally:任何 finally 子句不能正常完成时的警告;
7.rawtypes 泛型类型未指明
8.unused 引用定义了,但是没有被使用
9.all:关于以上所有情况的警告。
@Target 表示这个注解能放在什么位置上
ElementType.TYPE:能修饰类、接口或枚举类型
ElementType.FIELD:能修饰成员变量
ElementType.METHOD:能修饰方法
ElementType.PARAMETER:能修饰参数
ElementType.CONSTRUCTOR:能修饰构造器
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType.ANNOTATION_TYPE:能修饰注解
ElementType.PACKAGE:能修饰包
@Retention 表示生命周期
RUNTIME>CLASS>SOURCE (这是作用域大小比较)
RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。@Override 就是这种注解。
RetentionPolicy.CLASS: 注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。@Retention的默认值,即当没有显式指定@Retention的时候,就会是这种类型。
RetentionPolicy.RUNTIME: 注解在运行起来之后依然存在,程序可以通过反射获取这些信息,
@Inherited 表示该注解具有继承性。
@Document 表示是否将我们的注解生成在javadoc中

注意,只有一个值的时候,使用value,在赋值时可以忽略,但其他的单词是不行的,这是一个不成文的规定
动态语言:在运行代码的时候可以改变自身的结构(Object-C, C#, JavaScript, PHP, Python)
静态语言:运行时结构不可变(Java, C, C++)
Java不是动态语言,但java被称之为“准动态语言”。我们可以利用反射机制获得类似于动态语言的特性