一、AOP#

1.AOP概念##

  • aop:面向切面编程,扩展功能不修改源代码实现。
  • AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码。

2.AOP原理##

(1)第一种情况,有接口情况,使用动态代理创建接口实现类代理对象

(2)第二种情况,没有接口情况,使用动态代理创建类的子类代理对象

3.AOP操作术语###

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

  • Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义,即类中实际被增强的方法

  • Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

    (1)前置通知:在方法之前进行

    (2)后置通知:在方法之后执行

    (3)异常通知:方法出现异常时执行

    (4)最终通知:在后置通知之后执行

    (5)环绕通知:在方法之前和之后之后执行

  • Aspect(切面): 是切入点和通知(引介)的结合,即把增强应用到具体方法的过程,称为切面

  • Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field

  • Target(目标对象):代理的目标对象,即要增强的类

  • Weaving(织入):是把增强应用到目标的过程,即把advice应用到target的过程

  • Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

4.Spring的AOP操作###

  • 在spring里面进行aop操作,使用aspectj实现

    (1)aspectj不是spring一部分,和spring一起使用进行 aop操作

    (2)Spring2.0以后新增了对AspectJ支持

  • 使用aspectj实现aop有两种方式

    (1)基于aspectj的xml配置

    (2)基于aspectj的注解方式

4.1AOP操作准备###

(1)导入jar包

 除了导入基本jar包外,还要导入aop相关jar包

 注意:使用idea会自动为我们下载所需的jar包,但可能会有缺少的情况,比如我使用时缺少一个aspectjweaver.jar,这时需要自己下载导入

(2)使用表达式配置切入点

常用的表达式
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
(1)execution(* com.aop.Book.add(..)) //匹配add方法
(2)execution(* com.aop.Book.*(..))//匹配Book类中的所有方法
(3)execution(* *.*(..))//匹配所有类的所有方法
(4)execution(* save*(..))//匹配所有save开头的方法

4.2Aspectj的AOP操作(XML方式)###

首先创建User类和Book类

User.java

package test.spring.aop;
public class User {
public void test() {
System.out.println("user...");
}
}

Book.java

public class Book {

    public void before()
{
System.out.println("before...");
} public void afterReturn()
{
System.out.println("after return...");
} public void after()
{
System.out.println("after...");
} //环绕通知
//需要使用ProceedingJoinPoint参数
public void around(ProceedingJoinPoint proceedingJoinPoint)
{
System.out.println("方法之前...");
try {
proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("方法之后....");
}
}

然后使用bean管理配置对象

<!--配置对象-->
<bean id="book" class="test.spring.aop.Book"></bean>
<bean id="user" class="test.spring.aop.User"></bean>

最后配置aop操作

<!--配置aop操作-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pointcut1" expression="execution(* test.spring.aop.User.*(..))" ></aop:pointcut>
<!--配置切面
把增强用到方法上-->
<aop:aspect ref="book">
<!--配置增强类型:前置通知-->
<!--method:具体增强的方法-->
<!--pointcut-ref:切入点的id-->
<aop:before method="before" pointcut-ref="pointcut1"></aop:before>
<!--配置增强类型:最终通知-->
<aop:after method="after" pointcut-ref="pointcut1"></aop:after>
<!--配置增强类型:后置通知-->
<aop:after-returning method="afterReturn" pointcut-ref="pointcut1"></aop:after-returning>
<!--配置增强类型:环绕通知-->
<aop:around method="around" pointcut-ref="pointcut1"></aop:around>
</aop:aspect>
</aop:config>

测试结果如下

4.3Aspectj的注解AOP###

使用注解实现aop操作时需要在spring配置文件中做如下配置即可实现

<!--开启AOP操作-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

使用注解进行AOP操作

@Aspect
public class Book {
@Before("execution(* test.spring.aop.User.*(..))")
public void before()
{
System.out.println("before...");
}
@AfterReturning("execution(* test.spring.aop.User.*(..))")
public void afterReturn()
{
System.out.println("after return...");
}
@After("execution(* test.spring.aop.User.*(..))")
public void after()
{
System.out.println("after...");
}
@Around("execution(* test.spring.aop.User.*(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint)
{
System.out.println("方法之前...");
try {
proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("方法之后....");
}
}

测试结果同上

二、log4j#

1.什么是log4j##

  通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

2.使用log4j##

(1)导入log4j.jar

(2)导入log4j的配置文件,复制到src下

(3)设置日志级别

### 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//日志级别
//Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
//stdout标准输出,通常指控制台输出

log4j的用法会在之后进行更深入的学习,本次只是学会如何使用和配置

本节的Demo已上传github,如有需要请下载###

https://github.com/LELE-QAQ/TestSpring_2

Spring基础入门(二)的更多相关文章

  1. C#基础入门 二

    C#基础入门 二 循环语句 与C语言中用法相同. continue:结束本次循环(continue)后面的代码不再执行,进入下次循环(通常与if连用). 数组 一维数组定义:int[] intArra ...

  2. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  3. Spring基础入门

    一.Spring了解 Spring:程序员们的春天 Spring主要技术是IOC.AOP两个大概念 它是轻量级的,每个jar包就1M ~ 3M 左右,所以速度快 面向接口编程:降低了耦合度 面向切面编 ...

  4. Spring Boot入门(二):使用Profile实现多环境配置管理&如何获取配置文件值

    在上一篇博客Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件中,我们新建了一个最原始的Spring Boot项目,并使用了更为流行的yaml配置文件. ...

  5. Spring基础入门(一)

    一.Spring概念 1.什么是Spring   Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前 ...

  6. Spring基础学习(二)—详解Bean(上)

         在Spring配置文件中,用户不但可以将String.int等字面值注入Bean中,还可以将集合.Map等类型注入Bean中,此外还可以注入配置文件中其他定义的Bean. 一.字面值     ...

  7. 使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用

    一.简述 本文主要讲使用注解+xml配合使用的几种使用方式.基础课程请看前一节. 二.步骤 1.为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依 ...

  8. Spring boot 入门二:Spring Boot配置文件详解

    一.自定义属性 当我们创建一个springboot项目的时候,系统默认会为我们在src/main/java/resources目录下创建一个application.properties.同时也支持ym ...

  9. Spring基础入门(三)

    一.Spring的jdbcTemplate操作 (1)Spring是一站式框架,对于javaee三层,每一层都有解决技术. web层:springMVC service:spring的ioc dao层 ...

随机推荐

  1. iview table icon dorpdown html页面级别vue组件 #vuez#

    iview table icon dorpdown html页面级别vue组件 <!DOCTYPE html> <html> <head> <meta cha ...

  2. import downloadjs from 'downloadjs' 如果是自己写的函数 没用默认导出 记得加花括号 例如 import { download } from './data.js'

    import downloadjs from 'downloadjs' 如果是自己写的函数 没用默认导出 记得加花括号 例如 import { download } from './data.js'

  3. android打包需要的图标

    ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12 大小: 32x32.png 48 72 96 144

  4. redis基础一_常用指令

    # Redis configuration file example. # # Note that in order to read the configuration file, Redis mus ...

  5. js div大小随意伸缩

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. (二)Robto Framewoek使用自己的python库

    有时候找不到合适的库来完成自动化工作,则需要使用自己定义的python库.本文简单描述自建python库,以及在robotframework中的使用方法. 新建库目录 在C:\Python27\Lib ...

  7. linux 定时任务(注意事项)

    1.在要执行的脚本中,执行其他脚本时,需要加入其他脚本需要的环境变量. 2.路径要写全,绝对路径.命令要写全,使用绝对路径的方式.

  8. 3.3.4 使用 awk 重新编排字段

    awk 本身所提供的功能完备,已经是一个很好用的程序语言了.以后会好好地介绍该语言的精髓.虽然 awk 能做的事很多,但它主要的设计是要在 Shell脚本中发挥所长:做一些简单的文本处理,例如取出字段 ...

  9. functools内置装饰器

    def update_wrapper(wrapper, wrapped, assigned = WRAPPER_ASSIGNMENTS, updated = WRAPPER_UPDATES): def ...

  10. You Are the One (区间DP)

    The TV shows such as You Are the One has been very popular. In order to meet the need of boys who ar ...