在传统的基于代理类的AOP实现中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大。
解决方案:自动创建代理

  • BeanNameAutoProxyCreator 根据Bean名称创建代理
  • DefaultAdvisorAutoProxyCreator 根据Advisor本身包含信息创建代理
  • AnnotationAwareAspectJAutoProxyCreator 基于Bean中的AspectJ注解进行自动代理

1、基于Bean名称的自动代理

创建StuDao接口和接口实现类StuDaoImpl
StuDao接口,代码示例如下:

public interface StuDao {
public void save();
public void modify();
public void delete();
}

StuDaoImpl实现类,代码示例如下:

public class StuDaoImpl implements StuDao {
@Override
public void save() {
System.out.println("保存");
} @Override
public void modify() {
System.out.println("修改");
} @Override
public void delete() {
System.out.println("删除");
}
}

创建CustomDao类,演示不使用接口的实例方式

public class CustomDao {
public void add(){
System.out.println("添加客户");
}
public void modify(){
System.out.println("修改客户");
}
}

创建切面类,实现增强方法

public class MyBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("前置增强========");
}
}

在applicationContext.xml中配置

<!--配置目标类-->
<bean id="stuDao" class="aop.StuDaoImpl"></bean>
<bean id="customDao" class="aop.CustomDao"></bean>
<!--配置增强-->
<bean id="myBeforeAdvice" class="aop.MyBeforeAdvice"></bean>
<!--配置自动创建代理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="*Dao"></property>
<property name="interceptorNames" value="myBeforeAdvice"></property>
</bean>

创建测试类

@Test
public void demo(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
StuDao stuDao = (StuDao) app.getBean("stuDao");
stuDao.save();
stuDao.modify();
stuDao.delete();
CustomDao customDao = (CustomDao) app.getBean("customDao");
customDao.add();
customDao.modify();
}

运行结果

2、基于切面信息的自动代理

StuDao接口,代码示例如下:

public interface StuDao {
public void save();
public void modify();
public void delete();
}

StuDaoImpl实现类,代码示例如下:

public class StuDaoImpl implements StuDao {
@Override
public void save() {
System.out.println("保存");
} @Override
public void modify() {
System.out.println("修改");
} @Override
public void delete() {
System.out.println("删除");
}
}

创建CustomDao类,演示不使用接口的实例方式

public class CustomDao {
public void add(){
System.out.println("添加客户");
}
public void modify(){
System.out.println("修改客户");
}
}

创建切面类,实现环绕增强

public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation m) throws Throwable {
//增强方法
check();
//执行目标方法
Object obj = m.proceed();
//增强方法
log();
return obj;
} public void check(){
System.out.println("模拟权限控制============");
}
public void log(){
System.out.println("模拟日志记录============");
}
}

在applicationContext.xml中配置

<!--配置目标类-->
<bean id="stuDao" class="aop.StuDaoImpl"></bean>
<bean id="customDao" class="aop.CustomDao"></bean>
<!--配置增强-->
<bean id="myAroundAdvice" class="aop.MyAspect"></bean>
<!--配置切面-->
<bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!--配置要增强的方法,\. 表示转义字符-->
<property name="pattern" value="aop\.CustomDao\.add"></property>
<property name="advice" ref="myAroundAdvice"></property>
</bean>
<!--配置基于切面自动创建代理-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

创建测试类

@Test
public void demo(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
StuDao stuDao = (StuDao) app.getBean("stuDao");
stuDao.save();
stuDao.modify();
stuDao.delete();
CustomDao customDao = (CustomDao) app.getBean("customDao");
customDao.add();
customDao.modify();
}

运行结果

Spring框架学习08——自动代理方式实现AOP的更多相关文章

  1. spring框架之AspectJ的XML方式完成AOP的开发

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  2. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  3. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  4. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  5. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  6. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

  7. Spring框架学习笔记(5)——Spring Boot创建与使用

    Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...

  8. Spring框架学习笔记(8)——spring boot+mybatis plus+mysql项目环境搭建

    之前写的那篇Spring框架学习笔记(5)--Spring Boot创建与使用,发现有多小细节没有提及,,正好现在又学习了mybatis plus这款框架,打算重新整理一遍,并将细节说清楚 1.通过I ...

  9. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

随机推荐

  1. iOS视频流开发(2)—视频播放

    承上篇,本篇文章主要介绍iOS视频播放需要用到的类.以及他们的使用场景和开发中遇到的问题. MPMoviePlayerViewController MP简介 iOS提供MPMoviePlayerCon ...

  2. 【API】恶意样本分析手册——API函数篇

    学编程又有材料了 http://blog.nsfocus.net/malware-sample-analysis-api/

  3. C语言表驱动法编程实践

    数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明.编程的核心是数据结构,而不是算法. ——Rob Pike  说明 本文基于这样的认识:数据是易变的,逻辑是稳定的. ...

  4. Linux Kernel 代码艺术——编译时断言【转】

    转自:http://www.cnblogs.com/hazir/p/static_assert_macro.html 本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码 ...

  5. WPF当中StaticResource调用方法

    1.先在Converter命名空间当中,定义转换功能类: public sealed class BoolToValueConverter : System.Windows.Data.IValueCo ...

  6. mybatis主键自增长

    在数据库中建序列:SEQ_T_RESOURCE 第一种:会在传入该方法的的参数集合中添加主键元素,相当于:map.put("RES_ID",xxx); <insert id= ...

  7. openwrt 添加 802.1x客户端njit

    1.修改feed的配置文件 feeds.conf.default 添加下面两句: src-svn njit https://github.com/liuqun/openwrt-clients/trun ...

  8. elasticsearch5.0.1安装 marvel 插件

    elasticsearch5.0.1安装 marvel 插件 1.在elasticsearch上安装x-pach插件 在elasticsearch的根目录(每个节点),运行 bin/elasticse ...

  9. Linux安全配置步骤简述

    一.磁盘分区  1.如果是新安装系统,对磁盘分区应考虑安全性:   1)根目录(/).用户目录(/home).临时目录(/tmp)和/var目录应分开到不同的磁盘分区:   2)以上各目录所在分区的磁 ...

  10. 转载:为什么选择Nginx(1.2)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19610.html 为什么选择Nginx?因为它具有以下特点: (1)更快 这表现在两个方面:一方面,在正常情况下,单次请求会得到更快 ...