DefaultAdvisorAutoProxyCreator类在xml文件中的使用,只针对增强器有效,没有工厂
使用原因:在配置文件中我们往往需要给很多个目标对象设置代理对象,那么之前例子的方式就需要每个目标对象的代理对象都需要配置一套类似的标签

自动代理:可以用很少的配置为xml文件中的目标对象自动的生成对应的代理对象(根据目标对象的变量名拿到代理类对象)
没有了工厂类

<bean class=“org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator” />

AccountServiceImpl.java

public class AccountServiceImpl implements IAccountService{private AccountDao accountDao;private Account account;@Overridepublic void bankAction() {accountDao.withdraw(account, 100);accountDao.deposit(account, 100);}public AccountDao getAccountDao() {return accountDao;}public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}public Account getAccount() {return account;}public void setAccount(Account account) {this.account = account;}
}

自增一个新的测试类com.briup.aop.autoProxy.MyTest

public class MyTest {public void findUser(long id) {System.out.println("findUser方法执行了");}public void findStudent(long id) {System.out.println("findStudent方法执行了");}public void findTeacher(long id) {System.out.println("findTeacher方法执行了");}public void bankTest(long id) {System.out.println("bankTest方法执行了");}
}

xml文件,现在有两个类AccountServiceImpl的对象target、myTest的对象test已经被初始化了,共有方法bankAction、findUser、findStudent、findTeacher、bankTest,,选择哪些方法被代理

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd"><!-- 配置切面类 --><bean name="logger" class="com.briup.aop.aspect.MyLogger"></bean><!-- 配置前置通知 --><bean name="beforeAdvice" class="com.briup.aop.before.BeforeAdvice"><!-- 注入切面类对象 --><property name="logger" ref="logger"></property></bean><!-- 配置目标对象 --><bean name="target" class="com.briup.aop.service.AccountServiceImpl"><!-- 注入相关的类 --><property name="accountDao" ref="accountDao"></property><property name="account" ref="account"></property></bean><!-- 配置dao层对象和account对象,为了给service注入 --><bean name="accountDao" class="com.briup.aop.dao.AccountDaoImpl"></bean><bean name="account" class="com.briup.aop.pojo.Account"><property name="id" value="1"></property><property name="name" value="tom"></property><property name="balance" value="2000"></property></bean><!-- 自动代理 新加的类测试:多个类中的方法同时被代理 --><bean name="test" class="com.briup.aop.autoProxy.MyTest"></bean><!-- 增强器 --><!--作用:筛选出要代理的方法 --><bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><!-- 注入通知 --><property name="advice" ref="beforeAdvice"></property><property name="patterns"><list><!-- 正则表达式 --><value>.*find.*</value><value>.*bank.*</value></list></property></bean><!-- 自动代理 --><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
</beans>

自动代理是根据目标对象,当成要获取的代理对象的名字,拿到代理对象的名字。。。所以是container.getBean(“target”)

测试:
container.getBean(“target”);
container.getBean(“test”);

// 自动代理会把当前xml中配置的所有的对象全代理了
// 注意:一定是在使用了advisor的基础上才能使用这个自动代理
@Test
public void aop_autoproxy() {try {String path = "com/briup/aop/autoProxy/autoProxy.xml";ApplicationContext container = new ClassPathXmlApplicationContext(path);//拿目标类的变量名当成要获取的代理名IAccountService proxy=(IAccountService) container.getBean("target");proxy.bankAction();       System.out.println("------------");System.out.println(proxy.toString());System.out.println("------------");System.out.println(proxy.getClass());//第二个类中的方法代理com.briup.aop.autoProxy.MyTest t= (MyTest) container.getBean("test");t.findUser(1);t.findStudent(1);t.findTeacher(1);t.bankTest(1);System.out.println(t.getClass());} catch (Exception e) {e.printStackTrace();}
}


使用自动代理的时候需要注意的方面:
1.当前的配置里面"一定要有"一个advisor的配置
2.不需要向自动代理类中注入任何信息,就这一个配置
<bean class=“org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator” />
3.不管目标对象是否实现了一个或多接口,自动代理的方式都能够为它产生代理对象(CGLib的方式).
4.从spring容器中拿代理对象的时候,需要通过目标对象的名字来拿。
5.spring如何确定配置文件中哪个bean是作为目标对象:通过advisor中筛选的方法,如果这个bean中含有advisor中所配置的方法,则这个bean将来称为我们的目标对象进行代理;如果是没有实现接口的就采用CGLib,如果使用的是接口方式就使用jdk代理方式

特点:自动代理必须有增强器,而且如果想代理多个类,则必须在增强器中有对应要过滤的类中的方法,不需要写更多的增强器了

总结:不需要写多个增强器了,只需要写一个就行了,在此增强器里面有对应过滤类中的方法。

10.自动代理AutoProxy相关推荐

  1. spring的auto-proxy自动代理(融合机制实现)

    背景 最近在实施并行加载,遇到一个问题: 重复代理,或者说是两次cglib代理. 主要是并行加载技术本身是采用了cglib+拦截的技术进行控制,所以势必会要求进行一次代理配置那 1. 如果需要代理的原 ...

  2. Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP 源码解析系列,建议大家按顺序阅读,欢迎讨论 Spring源码-AOP(一)-代理模式 Spring源码- ...

  3. PAC自动代理文件格式,教你如何写PAC文件

    前些天,同事给我抱怨,公司的GPO强制更改了笔记本的IE代理服务器,在办公室还好,一回家就上不了网了,必须手动更改代理设置,真是麻烦.我想了想,proxy.pac自动代理文件应该可以解决这个问题,于是 ...

  4. 自动代理(automated agent,AA)

    自动代理(automated agent,AA)不一定是指SkyNet或一些通用的人工智能.自动代理至少已经存在10年了,无须人工干预运行的或者说自主运行的软件都是AA.计算机病毒就是个完美的例子.开 ...

  5. PAC (proxy auto-config) 自动代理

    代理是个好东西,帮你节省时间,减少麻烦.今天讲一个自动代理文件格式-PAC,它是微软发明的,1999年就提交到了IETF标准化组织,但后来就没有下文了,好在常见的浏览器(Firefox,IE,Safa ...

  6. AOP的自动代理(基于AspectJ框架)

    AOP的通知类型: aop联盟 定义 aop通知类型,spring 对 aop联盟规范支持. AOP 联盟不是Spring的,先是AOP联盟定义了一个接口org.springframework.aop ...

  7. 有关windows 10自动更新 永久关闭

    有关windows 10自动更新 永久关闭 怎么关闭win10的自动更新. 首先,点开始菜单,然后再点设置图标. 打开了设置窗口之后,然后输入"服务",再进行搜索. 搜索出来之后, ...

  8. 不是架构的架构之四:业务层的实现与自动代理

    我们在开篇中提到,希望能有一种办法,能自动适应系统的环境配置,在局域网小型应用中将直接访问数据库以获得最高的性能,在分布式环境中自动使用WCF来获得较好的安全性和连通性. 但是,我们不希望这样的特性使 ...

  9. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  10. Mac 自动代理切换

    Mac 自动代理切换 背景: 工作有时需要用goole搜索,所以会配置一下公司提供的HTTP和HTTPS代理,但是下班之后回到家,只有公司内网才能访问代理,所以还需要把代理关掉.每次都要点呀点,有点麻 ...

最新文章

  1. __proto__和prototype
  2. ASP.NET中随机数生成及应用
  3. SELECT TOP n 性能测试
  4. 不会PS抠图?免抠(扣)PNG图片网就解决了
  5. 华泰证券:如何自研高效可靠的交易系统通信框架?
  6. SSH密钥 - 仍然要求输入密码和密码
  7. less 之Extend 及 Extend all用法
  8. ModelSim之命令行仿真入门
  9. JavaScript打开新窗口的方法
  10. QT中双击mdiArea区域打开文件(监听双击事件)
  11. 2021年开始,Adobe Flash Player 不能用了?
  12. 实时风控引擎项目部署
  13. MATLAB动画绘制
  14. nohup sh xxx.sh /dev/null
  15. 【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议
  16. L2TP 配置 实践出配置
  17. win10计算机睡眠 隔几分钟就唤醒,Win10电脑睡眠时经常被自动唤醒如何解决
  18. CF1091F New Year and the Mallard Expedition
  19. 电脑检测软件列表及电脑硬件驱动大全
  20. 谈判技巧---From一亩三分地帖子

热门文章

  1. 固态硬盘扩展分区合并主分区方法
  2. outlook 2019 mac中如何设置邮件签名
  3. 微信中各种代码/符号合集
  4. 外贸邮箱能群发吗?用哪个外贸邮箱发开发信回复率高?
  5. IO summery
  6. [应用广播], 一览华夏文化,诗词三万首震撼上线
  7. Kindle dxg 越狱升级小记
  8. 小码哥C++学院-零基础入门C语言
  9. python运算符重载、并且编写复数类的加减乘除_编程基础篇:定义一个复数类Complex,重载运算符“+,-,*,/”,使之能用于复数的加减乘除.....出现的问题及代码...
  10. 无人驾驶技术——YOLO目标检测