spring框架中的AOP学习之(一)

一、AOP术语

1、通知(advice):定义了切面何时(@Before, @After, @AfterThrowing ,@AfterReturning,@Around )使用

2、连接点(join point):在应用执行过程中能够被插入切面的一个点。

3、切点(pointcut):对连接点中的哪些连接点进行织入切面(切点是指匹配到的某些连接点)

4、切面(aspect):是通知加切点的给合

5、引入(introduction):允许我们向现有的类添加新的方法和属性(对已有的类引入新的接口,接口里定义了新的方法和属性)

6、织入(weaving):把切面应用到目标对象并创建新的代理对象的过程(编译期:Aspectj的织入编译器就是以这种方式;类加载期:AspectJ 5的加载时织入就是以这种方式织入;运行期:spring AOP就是以这种方式织入切面的)

二、AOP术语在应用程序中的对应

//正常的业务服务层
@Service
public class HelloWorldFirstImpl implements HelloWorld {
    @Override
    public void printHelloWorld() {
        System.out.println("This is HelloWorldFirstImpl.printHelloWorld()");
    }

    @Override
    public void doPrint() {
        try {
            Thread.sleep(1000);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        System.out.println("This is HelloWorldFirstImpl.doPrint()");
    }
}


//切面(需要切入的服务 : 获取执行时间)
@Aspect
@Component
public class TimeHandlerAspect {

    /**
     * advice 定义前置通知  // 连接点:* cc.freshair.springaop.services.impl.*.*(..)
     */
    @Before("execution(* cc.freshair.springaop.services.impl.*.doPrint(..))")
    public void printTime() {
        System.out.println("CurrentTime:" + System.currentTimeMillis());
    }

    @Around("execution(* cc.freshair.springaop.services.impl.*.doPrint(..))")
    public Object processTime(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Object result = point.proceed();
        long endTime = System.currentTimeMillis();
        System.out.println("process time:" + (endTime - beginTime));
        return result;
    }
}
//被引入的新类(主要是新类的方法或者属性,此处是将likeSmoke()方法引入到HelloWorldFirstImpl类中)
@Service
public class Man implements Person {
    @Override
    public void likeSmoke() {
        System.out.println("喜欢抽烟");
    }
}

//定义要引入的新类与目标类之间的关联
@Aspect
@Component
public class IntroductionAspect {
    @DeclareParents(value = "cc.freshair.springaop.services.impl.*", defaultImpl = Man.class)
    public static Person person;

}


//应用程序启动的入口
@SpringBootApplication
@EnableAspectJAutoProxy
public class SpringAopApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringAopApplication.class, args);
    }
}
//web应用的请求控制器
@RestController
@RequestMapping("/index")
public class IndexController {

    @Autowired
    public HelloWorld helloWorld;

    @Resource
    public Person person;

    @RequestMapping("/index")
    public String index() {
        helloWorld.doPrint();

     //调用AOP引入的方法
        person = (Person)helloWorld;
        person.likeSmoke();

        return "Hello World";
    }
}

1、通知(advice):TimeHandlerAspect 类的(@Before  @Around) 描述在切入点(“什么时候”执行:before:之前   around:环绕,从开始到结束 )

2、连接点(joinpoint):HelloWorldFirstImpl类的  doPrint()printHelloWorld()

3、切点(cutpoint):符合我们定义的规则的那些连接点  比如:doPrint()

4、切面(aspect):由切点和通知相结合而成的,定义通知应用到那些切入点上

5、引入点(intruduction):Man类+IntroductionAspect 类(将Man类的doSmoke方法引入到HelloWorldFirstImpl类上来)

6、织入(weaving):把切面的代码织入(应用)到目标函数的过程

原文地址:https://www.cnblogs.com/amuge/p/10410502.html

时间: 2024-10-08 21:21:48

spring框架中的AOP学习之(一)的相关文章

Spring框架中的aop

1.建立了日志类 package cn.edu.proxy.cglibproxy; public class Logger { public void logging() { // TODO Auto-generated method stub System.out.println("logging"); } } 2.建立安全类 package cn.edu.proxy.cglibproxy; public class Security { public void security()

Spring入门IOC和AOP学习笔记

Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容器中Bean之间的依赖关系,使用一种叫做"依赖注入"的方式来管理bean之间的依赖关系. Spring有两个核心接口:BeanFactory和ApplicationContext,ApplicationContext是BeanFactory的子接口.它们都可以代表Spring容器,Spri

细说shiro之五:在spring框架中集成shiro

官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${version.shiro}</version> </dependency&g

再析在spring框架中解决多数据源的问题

在前面我写了<如何在spring框架中解决多数据源的问题>,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注.在与网友探讨该问题的过程中,我发现我的方案并不完善,它只解决了一部分问题. 总结多数据源的问题,其实它需要分为以下三种情况:各个数据源的数据结构不同.各个数据源的数据结构相同.各个数据源的数据结构部分相同又有部分不同.对于第二种情况,各个数据源的数据结构相同,我们使用一个sessionFactory,而在sessionFactory中通

Spring Boot中使用AOP统一处理Web请求日志

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日志等.基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率.

转-Spring Framework中的AOP之around通知

Spring Framework中的AOP之around通知 http://blog.csdn.net/xiaoliang_xie/article/details/7049183 标签: springaop设计模式beanintegerclass 2011-12-07 11:39 6108人阅读 评论(0) 收藏 举报 在第一部分,您看到了如何使用Spring AOP来实现跟踪和记录方面.跟踪和记录都是"消极"方面,因为它们的出现并不会对应用程序的其他行为产生影响.它们都使用了消极的b

用 OpenSessionInViewInterceptor 的思路解决 Spring框架中的Hib

众所周知, 为了解决 Hibernate Lazy 问题, Spring 中引入了 OpenSessionInViewInterceptor, 这样虽然解决了页面上的 Lazy Load 问题,却增加了各层之间的偶合性, 如果一个 Lazy 的 Collection 在页面上可以被正确的 load, 但是如果请求不是来自于 HttpServletRequest (比如在 TestCase 或 Service 中希望获取 lazy 的属性), 一般会导致两种错误: 代码 [java] view p

Spring5源码解析-Spring框架中的事件和监听器

事件和平时所用的回调思想在与GUI(JavaScript,Swing)相关的技术中非常流行.而在Web应用程序的服务器端,我们很少去直接使用.但这并不意味着我们无法在服务端去实现一个面向事件的体系结构. 在本文中,我们将重点介绍Spring框架中的事件处理.首先,会先介绍下事件驱动编程这个概念.接着,我们会将精力放在专门用于Spring框架中的事件处理之上.然后我们会看到实现事件调度和监听的主要方法.最后,我们将在Spring应用程序中展示如何使用基本的监听器. 事件驱动编程 在开始讨论事件驱动

Spring框架中2种生成代理对象的方法

Spring框架中2种生成代理对象的方法 Jdk Proxy基于接口生成代理对象,只能赋值给接口的引用(默认使用jdk). Spring进一步封装 CGLIB,基于实现类生成代理对象,既可以赋值给接口的引用,也可以赋值给实现类的引用 JDK提供的Proxy,和spring进一步封装的CGLIB.二者生成的代理没有任何区别,生成的都是代理对象.只是生产方式不同,前者是基于接口生成代理,后者基于实现类生成代理对象 如何切换spring框架中默认生成代理的方式 <aop:config proxy-ta