一、AOP

AOP是Spring框架另一个核心概念。
AOP:Aspect Oriented Programming,面向切面编程。
这是一个新的概念,我们知道Java是面向对象编程(OOP):指将所有的一切都看做对象,通过对象与对象之间相互作用来解决问题的一种编程思想。
AOP是对OOP的一个补充,在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。将不同方法的同一位置抽象成一个切面对象,对该切面对象进行编程就是AOP。
1 AOP:面向切面(方面)编程,扩展某个功能不用修改源代码实现(通过修改配置文件)
2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
3 AOP底层使用动态代理实现 其实就是java的反射机制
(1)第一种情况,有接口情况,使用动态代理创建接口实现类代理对象
(2)第二种情况,没有接口情况,使用动态代理创建类的子类代理对象

二、AOP的优点

1.降低模块之间的耦合度。
2.使系统容易扩展。
3.更好的代码复用。
4.非业务代码更加集中,不分散,便于统一管理。
5.业务代码更简洁纯粹,没有其他代码的影响。

三、Spring的AOP操作

java aop是什么设计模式_AOP

1 在spring里面进行AOP操作,使用aspectj实现
(1)aspectj不是spring一部分,和spring一起使用进行AOP操作
(2)Spring2.0以后新增了对AspectJ支持
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
百度百科 AspectJ 2 使用aspectj实现AOP有两种方式
(1)基于aspectj的xml配置
(2)基于aspectj的注解方式

AOP操作准备
1 除了导入基本的jar包之外,还需要导入AOP相关的jar包

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-aop</artifactId>
	    <version>5.1.2.RELEASE</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-aspects</artifactId>
	    <version>5.1.2.RELEASE</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
	<dependency>
	    <groupId>aopalliance</groupId>
	    <artifactId>aopalliance</artifactId>
	    <version>1.0</version>
	</dependency>

2 创建spring核心配置文件,导入AOP的约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
	
</beans>

使用表达式配置切入点
1 切入点:实际增强的方法
2 常用的表达式
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
第一个表示任意的修饰符,这个后面必须要加一个空格,
方法的括号中的…表示可以添加参数
(1)execution(* cn.itcast.AOP.Book.add(…))
(2)execution(* cn.itcast.AOP.Book.(…)) 表示类中的所有方法
(3)execution( .(…)) 表示所有类中的所有方法
(4)匹配所有save开头的方法 execution(
save*(…))

基于aspectj的注解实现AOP

1 使用注解方式实现AOP操作
第一步 创建对象
第二步 在spring核心配置文件中,开启AOP操作
第三步 在增强类上面使用注解完成AOP操作
在类上面加注解@Aspect
在方法上面加注解 里面也是通过表达式

log4j介绍

1 通过log4j可以看到程序运行过程中更详细的信息

经常使用log4j查看日志(在开发中很常用)

2 使用

(1)导入log4j的jar包

java aop是什么设计模式_java aop是什么设计模式_02


(2)复制log4j的配置文件log4j.properties,到src目录下面

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=info, stdout

3 设置日志级别
查看properties,前面两部分是格式
(1)info:看到基本信息
(2)debug:看到更详细信息