1、spring的半自动代理(从spring中获取代理对象)

(1)spring中的通知类型

spring中aop的通知类型有五种:

前置:在目标方法执行前实施加强

后置:在目标方法执行后实施加强

环绕:在目标方法执行前后实施加强,必须手动执行目标方法,如果只在目标方法前面书写方法,就叫前置通知,前置通知可以阻止目标方法的执行,因为抛出异常后进入catch块,后置通知可以获得方法的返回值。

异常:在方法抛出异常后实施加强

引介:在目标类中添加一些新的方法和属性

(2)导入jar包

核心:4+1

aop:aop联盟(规范)、spring-aop(实现)

(3)创建目标类接口和接口的实现类:

public interface StudentService {
void addStudent();
void updateStudent();
void deleteStudent();
}
public class StudentServiceImpl implements StudentService{
@Override
public void addStudent() {
System.out.println("addStudent");
} @Override
public void updateStudent() {
System.out.println("updateStudent");
} @Override
public void deleteStudent() {
System.out.println("deleteStudent");
}
}

(4)创建切面:

public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("前");
methodInvocation.proceed();
System.out.println("后");
return null;
}
}

(5)配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!--目标类-->
<bean id="studentService" class="pers.zhb.proxy.StudentServiceImpl"></bean>
<!--切面类-->
<bean id="myAspect" class="pers.zhb.proxy.MyAspect"></bean>
<!--代理类
用于创建代理工厂bean,生成特殊代理对象
-->
<bean id="proxystudentService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interfaces" value="pers.zhb.proxy.StudentService"> </property><!--确定接口-->
<property name="target" ref="studentService"></property><!--目标类-->
<property name="interceptorNames" value="myAspect"></property><!--切面类的名称-->
</bean>
</beans>
  <property name="optimize" value="true"></property><!--强制使用cglib-->

如果目标类有接口使用jdk动态代理,没有接口的话采用cglib字节码增强。如果声明为true,则无论是否有接口都是采用cglib

(6)测试:

public class TestFactoryBean {
public static void main(String[] args) {
ApplicationContext applicationContext=new
ClassPathXmlApplicationContext("applicationContext.xml");
StudentService studentService= (StudentService) applicationContext.getBean("proxystudentService");
studentService.addStudent();
studentService.deleteStudent();
studentService.updateStudent();
}
}

addStudent


deleteStudent


updateStudent

2、全自动(从spring容器获得目标类,如果配置aop,spring将自动生成代理)

(1)导包:

要确定目标类,aspectj切入点表达式,导入jar包:

(2)创建目标类接口和接口的实现类:

public interface StudentService {
void addStudent();
void updateStudent();
void deleteStudent();
}
public class StudentServiceImpl implements StudentService{
@Override
public void addStudent() {
System.out.println("addStudent");
} @Override
public void updateStudent() {
System.out.println("updateStudent");
} @Override
public void deleteStudent() {
System.out.println("deleteStudent");
}
}

(3)切面:

public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("前");
methodInvocation.proceed();
System.out.println("后");
return null;
}
}

(4)配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
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">
<!--目标类-->
<bean id="studentService" class="pers.zhb.proxy.StudentServiceImpl"></bean>
<!--切面类-->
<bean id="myAspect" class="pers.zhb.proxy.MyAspect"></bean>
<!--aop编程-->
<aop:config >
<!--从目标对象获得具体方法,使用了切入点表达式-->
<aop:pointcut id="myPointCut" expression="execution(* pers.zhb.proxy.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut"></aop:advisor><!--特殊的通知,只有一个通知和切入点-->
</aop:config>
</beans>

(5)测试类:

public class TestFactoryBean {
public static void main(String[] args) {
ApplicationContext applicationContext=new
ClassPathXmlApplicationContext("applicationContext.xml");
//获得目标类
StudentService studentService= (StudentService) applicationContext.getBean("studentService");
studentService.addStudent();
studentService.deleteStudent();
studentService.updateStudent();
}
}

addStudent


deleteStudent


updateStudent

spring的aop编程(半自动、全自动)的更多相关文章

  1. Java基础-SSM之Spring的AOP编程

    Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...

  2. Spring之AOP编程

    一.AOP简介     AOP的英文全称是Aspect Oriented Programming,意为:面向切面编程.     AOP采取横向抽取的机制,取代了传统纵向继承体系的代码复用.AOP常用于 ...

  3. Spring框架--AOP编程

    2 手动实现AOP编程 AOP 面向切面的编程, AOP可以实现"业务代码"与"关注点代码"分离 // 保存一个用户 public void add(User ...

  4. Spring的AOP编程

    1.手动实现AOP编程(代理模式) AOP是面向切面的编程,主要功能就是实现"业务代码"和辅助业务代码的"关注点代码"分离.在一个方法中,出了核心的业务代码,其 ...

  5. Java进阶知识21 Spring的AOP编程

    1.概述 Aop:(Aspect Oriented Programming)面向切面编程          功能: 让关注点代码与业务代码分离! 关注点:重复代码就叫做关注点:切面: 关注点形成的类, ...

  6. 【AOP】spring 的AOP编程报错:[Xlint:invalidAbsoluteTypeName]error

    AOP来发过程中,报错如下: warning no match for this type name: net.shopxx.wx.institution.controller [Xlint:inva ...

  7. spring相关—AOP编程—切入点、连接点

    1 切入点表达式 1.1 作用 通过表达式的方式定位一个或多个具体的连接点. 1.2 语法细节 ①切入点表达式的语法格式 execution([权限修饰符] [返回值类型] [简单类名/全类名] [方 ...

  8. Spring AOP编程(二)-AOP实现的三种方式

    AOP的实现有三种方式: l         aop底层将采用代理机制进行实现. l         接口 + 实现类 :spring采用 jdk 的动态代理Proxy. l         实现类: ...

  9. Spring基础篇——Spring的AOP切面编程

    一  基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...

随机推荐

  1. 使用log4j将数据流入flume

    最近做了一个log抽取的项目,采用log4j+flume实现,在此分享记录一下. 准备 什么是flume? flume是一个提供高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统. flume ...

  2. Java动态代理(三)——Cglib动态代理

    一.Cglib动态代理Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类,使用Cglib即使代理类没有实现任何接口也可以实现动态代理功能.而且,它的运行速度要远远快 ...

  3. 目标追踪(Object Tracking)概念的简要介绍

    现在我们有一个视频流,可以拆解出 N 个帧出来,这时候初始帧/某一帧中出现了一个我们感兴趣目标,我们希望在后续帧中对这个目标进行追踪,这时候就需要 CV 中的目标追踪: 目标追踪的效果如下: 虽然效果 ...

  4. day42:HTML标签和CSS选择器

    目录 1.HTML 1.1 文档结构 1.2 head标签 1.3 body标签 1.3.1 h1-h6标签 1.3.2.br标签:换行 1.3.3.hr标签:一行横线 1.3.4 a标签:超链接标签 ...

  5. 手写Promise看着一篇就足够了

    目录 概要 博客思路 API的特性与手写源码 构造函数 then catch Promise.resolved Promise.rejected Promise.all Promise.race 概要 ...

  6. oracle坑。

    char(2)的,后面的有一个空格.删不掉.在plsql里可以正常查.写死的sql在程序也可以正常查. 程序用占位符的形式,不能查出来.只能转成to_number select t.*,t.rowid ...

  7. vagrant安装的坑

    关于VAGRANT安装过程的坑 标签: 虚拟化     闲来无聊 试试vagrant虚拟化技术 安装过程中坑太多了 所以记录下方便以后 注意: 执行 vagrant up 命令报错 如下   PS F ...

  8. Android开发之封装log打印日志的工具类,实用logutils详细代码

    public final class LogUtil { /** all Log print on-off */ private final static boolean all = true; /* ...

  9. HTTP协议中的提交方式和解释POST、GET、HEAD、PUT等

    最基本的方法有4种,分别是GET,POST,PUT,DELETE HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作 GET一般用于获取/查询资源信息,而PO ...

  10. C# 压缩源文件(导出源文件word文件)

    说明 1 : 在webUI 公共类,存放 ZipHelper 类 说明  2 :判断文件路径是否存在,不存在则创建文件夹 说明 3  : 引用类方法,判断压缩文件,返回的,是true/false 引用 ...