1.spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解;使用注解来取代配置文件.
1.1 引入xmlns:context ,指定扫描范围

<context:component-scan base-package="com.advice,com.test"></context:component-scan>

1.3 @Component

1.4 相当于<bean/>

1.5 如果没有参数,把类名首字母变小写,相当于<bean id=”别名”/>

1.6 @Component(“自定义名称”)

1.7     <aop:aspectj-autoproxy proxy-target-class="true"> </aop:aspectj-autoproxy>
                  <!--proxy-target-class="true"使用cglib动态代理;
                          否则使用jdk动态代理-->

1.8  实现步骤:

2.1  在spring 配置文件中设置注解在哪些包中 ,多个文件夹用分号隔开 ;以及加入属性:"  xmlns:context"" xsi:schemaLocation"

<?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"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.advice,com.test"></context:component-scan>
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<!--proxy-target-class="true"使用cglib动态代理;
否则使用jdk动态代理--> </beans>

2.2在Demo 类中添加@Componet

  2.2.1在方法上添加@Pointcut(“”) 定义切点

import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component; @Component
public class demo {
@Pointcut("execution(* com.test.demo.demo1())")
public void demo1(){
// int i=5/0;
System.out.println("demo1");
}
}

2.3在通知类中配置 --@Component @Aspect 都不能剩下!!

  2.3.1@Component 类被spring 管理
    @Aspect 相当于<aop:aspect/>表示通知方法在当前类中;

package com.advice;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component; @Component
@Aspect
public class MyAdvice {
@Before("com.test.demo.demo1()")
public void mybefore(){
System.out.println("前置通知!!");
}
@After("com.test.demo.demo1()")
public void myafter(){
System.out.println("后置通知");
}
@AfterThrowing("com.test.demo.demo1()")
public void mythrow(){
System.out.println("异常通知");
}
@Around("com.test.demo.demo1()")
public Object myArround(ProceedingJoinPoint p) throws
Throwable {
System.out.println("环绕-前置");
Object result = p.proceed();
System.out.println("环绕-后置");
return result;
}
}

2.4 编写test测试类并进行测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
// 输出Spring自动加载的所有类
// String[] names = ac.getBeanDefinitionNames();
// for(int i=0;i< names.length;i++)
// System.out.println(names[i]);
demo d=ac.getBean("demo",demo.class);
d.demo1(); }
}
myAdvice
demo
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.aop.config.internalAutoProxyCreator
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor
环绕-前置
前置通知!!
demo1
环绕-后置
后置通知

(测试结果)


八.代理设计模式

1.设计模式:前人总结的一套解决特定问题的代码.
2.代理设计模式优点:
2.1保护真实对象
2.2让真实对象职责更明确.
2.3扩展
3.代理设计模式
3.1真实对象.(老总)
3.2代理对象(秘书)
1.抽象对象(抽象功能),谈小目标

九. 静态代理设计模式

2.由代理对象代理所有真实对象的功能.
2.1自己编写代理类

2.2每个代理的功能需要单独编写
3.静态代理设计模式的缺点:
1.当代理功能比较多时,代理类中方法需要写很多.

十. 动态代理

2.为了解决静态代理频繁编写代理功能缺点.
3.分类:
3.1JDK 提供的cglib 动态代理

十一. JDK 动态代理

1.和cglib 动态代理对比
1.1优点:jdk 自带,不需要额外导入jar
1.2缺点:
1.2.1真实对象必须实现接口
1.2.2利用反射机制.效率不高.
2.使用JDK 动态代理时可能出现异常ClasscastException : cat not cast to xxx.
出现原因:希望把接口对象转换为具体真实对象

十二: cglib 动态代理

1.cglib 优点:
1.1基于字节码,生成真实对象的子类.
1.1.1运行效率高于JDK 动态代理.
1.2不需要实现接口
2.cglib 缺点:
2.1非JDK 功能,需要额外导入jar
3.使用spring aop 时,只要出现Proxy 和真实对象转换异常
3.1设置为true 使用cglib
3.2设置为false 使用jdk(默认值)

<aop:aspectj-autoproxy
proxy-target-class="true"></aop:aspectj-autoproxy>

Spring -07 -AOP [面向切面编程] - 使用注解@+ AspectJ 方式实现环绕/前/后等通知 -超简洁 --静态代理/动态代理{JDK/cglib}的更多相关文章

  1. spring:AOP面向切面编程(注解)03

    使用注解写aop时最好使用环绕通知写 切面类: /** * 用于记录日志的工具类,它里面提供了公共的代码 */ @Component("logger") @Aspect //表示当 ...

  2. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  3. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  4. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程   在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业.   ...

  5. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

  6. Spring框架——AOP面向切面编程

    简介 AOP练习 使用动态代理解决问题 Spring AOP 用AspectJ注解声明切面 前置后置通知 利用方法签名编写AspectJ切入点表达式 指定切面的优先级 基于XML的配置声明切面 Spr ...

  7. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  8. spring:AOP面向切面编程02

    参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...

  9. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

随机推荐

  1. Netty实现SSL双向验证完整实例

    Netty实现SSL双向验证完整实例 博客分类: netty nettyssl自签证书  一.证书准备 要使用ssl双向验证,就必须先要生成服务端和客户端的证书,并相互添加信任,具体流程如下(本人调试 ...

  2. SVN 本地文件锁/服务端文件锁清除步骤

    1.本地文件锁,直接cleanup,cleanup界面选择break locks即可 2.服务端文件锁,本地文件右击没有release lock或者break lock的选项时 方法1:右键,svn选 ...

  3. 多核vs多处理器

    多核vs多处理器 多核CPU性能最好,但成本最高:多CPU成本小,便宜,但性能相对较差 线程数=cpu处理器个数 * 一个cpu内的核数[如果有超线程,再乘以超线程数] 多核 CPU 和多个 CPU ...

  4. python 包多熟悉一个干活就轻松点

    包管理 管理包和依赖的工具. pip – Python 包和依赖关系管理工具. pip-tools – 保证 Python 包依赖关系更新的一组工具. conda – 跨平台,Python 二进制包管 ...

  5. TCP/IP学习笔记3--传输方式的分类

    网络通信中有多中分类方法: )分组较短.出错几率降低,每次重发的数据量也降低,不仅提高了可靠性,也降低了时延.缺点:(1)因为数据进入交换节点后要经历存储转发这一过程,从而引起的转发时延(包含接受分组 ...

  6. Java8 时间日期类操作

    Java8 时间日期类操作 Java8的时间类有两个重要的特性 线程安全 不可变类,返回的都是新的对象 显然,该特性解决了原来java.util.Date类与SimpleDateFormat线程不安全 ...

  7. MySql 、Oracle 获取表结构和字段信息

    1.MySql获取表结构信息 SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.`TABLES` WHERE TABLE_SCHEMA ...

  8. 魔术方法之__call、__callStatic

    1.__call() 作用,当调用不存在的方法时,会调用该方法.实际应用,当程序调用不存在的方法时,意外导致程序终止. .或者当你调用了受保护的或者是私人的方法时,也会自动调用__call方法 结果: ...

  9. rest_framework框架——版本控制组件

    API版本控制可以用来在不同的客户端使用不同的行为.REST框架提供了大量不同的版本设计. 版本控制是由传入的客户端请求决定的,并且可基于请求URL,或者基于请求头. rest_framework 当 ...

  10. Appium移动端自动化测试--使用IDE编辑并强化脚本

    目录 Appium客户端安装 安装Python IDE-Pycharm Java IDE 安装 使用隐式等待让用例更稳定 隐式等待 启动Appium非GUI模式:Appium Server 安装Pyt ...