自动创建代理

  在前面的例子中, 我们都通过ProxyFactoryBean创建织入切面的代理, 每一个需要被代理的bean都需要使用一个ProxyFactoryBean进行配置, 虽然可以使用父子bean进行改造,但还是很麻烦.对于小型系统而言,这种方法还可以将就使用, 但是对于很多需要代理的bean的系统, 再使用这种方法就会很麻烦.

  幸运的是, spring为我们提供了自动创建代理的机制, 容器为我们自动生成代理, 把我们从繁琐的配置工作中解放出来.在内部, Spring使用BeanPostFactory完成这项工作.

1、实现类介绍

这些基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理实例。

1)基于Bean配置名规则的自动代理创建器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator;

2)基于Advisor匹配机制的自动代理创建器:它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(即为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator;

3)基于Bean中AspjectJ注解标签的自动代理创建器:为包含AspectJ注解的Bean自动创建代理实例,它的实现类是AnnotationAwareAspectJAutoProxyCreator,该类是Spring 2.0的新增类。

2、BeanNameAutoProxyCreator

使用Bean名进行自动代理配置:

<bean id="waiterTarget" class="com.bao.bao.advisor.Waiter"/>
<bean id="sellerTarget" class="com.bao.bao.advisor.Seller"/>
<bean id="greetAdvice" class="com.bao.bao.advisor.GreetingBeforeAdvice"/>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    <property name="beanNames" value="*Target"/>    <property name="interceptorNames" value="greetAdvice"/>    <property name="proxyTargetClass" value="true"/></bean>

BeanNameAutoProxyCreator 有一个beanNames属性,它允许用户指定一组需要自动代理的Bean名称,Bean名称可以使用 * 通配符。

测试代码:

package com.bao.bao.advisor;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by xinfengyao on 16-10-22.
 */
public class TestAdvisor {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-base.xml");
        Waiter waiter = (Waiter) context.getBean("waiterTarget");
        Seller seller = (Seller) context.getBean("sellerTarget");

        waiter.greetTo("tom");
        waiter.serveTo("tom");
        seller.greetTo("tom");
    }
}

运行结果:

Here are you! tom
waiter greetTo tom...
Here are you! tom
waiter serving tom...
Here are you! tom
seller greet to tom...

可以看到, 都自动织入了切面

3、DefaultAdvisorAutoProxyCreator

Advisor是切点和增强的复合体,Advisor本身已经包含了足够的信息:横切逻辑(要织入什么)以及连接点(织入到哪里)。DefaultAdvisorAutoProxyCreator能够扫描容器中的Advisor,并将Advisor自动织入到匹配的目标Bean中,即为匹配的目标Bean自动创建代理。

<bean id="waiterTarget" class="com.bao.bao.advisor.Waiter"/>
<bean id="sellerTarget" class="com.bao.bao.advisor.Seller"/>
<bean id="greetAdvice" class="com.bao.bao.advisor.GreetingBeforeAdvice"/>
<bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">    <property name="advice" ref="greetAdvice"/>    <property name="patterns">        <list>            <value>.*greet.*</value>        </list>    </property></bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

测试代码:

package com.bao.bao.advisor;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by xinfengyao on 16-10-22.
 */
public class TestAdvisor {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-base.xml");
        Waiter waiter = (Waiter) context.getBean("waiterTarget");
        Seller seller = (Seller) context.getBean("sellerTarget");

        waiter.greetTo("tom");
        waiter.serveTo("tom");
        seller.greetTo("tom");
    }
}

运行结果:

Here are you! tom
waiter greetTo tom...
waiter serving tom...
Here are you! tom
seller greet to tom...
时间: 2024-10-12 23:22:30

自动创建代理的相关文章

Spring中自动创建代理器

1.AbstractAutoProxyCreator 该类继承关系如代码所示: public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware { 首先,它继承了ProxyProcessorSupport,查看该类: // 显然,它是个ProxyConfig 拥有AOP

关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-使用工厂创建代理(Using the ProxyFactoryObject to create AOP proxies)

本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 如果你正在为你的业务模型使用IoC容器--这是个好主意--你将会想使用某个 Spring.NET's AOP特定的IFactoryObject 的实现(要记住,一个工厂的实例提供了一个间接层,使这个工厂能够创建不同类型的对象-5.3.9节,"通过使用其他类型和实例创建一个对象"). 一个基本的创建Spring.NET

AOP系列(二)——为符合条件的目标对象创建代理

接着上篇文章,我们将采用新的方式进行动态代理. ObjectNameAutoProxyCreator创建代理 实现思路 根据配置文件中的配置,Spring容器会根据此配置,为符合条件的对象创建代理. 具体代码 配置文件 <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="spring"> <section name=

SQL Server Alwayson创建代理作业注意事项

介绍 Always On 可用性组活动辅助功能包括支持在辅助副本上执行备份操作. 备份操作可能会给 I/O 和 CPU 带来很大的压力(使用备份压缩). 将备份负荷转移到已同步或正在同步的辅助副本后,您可以使用承载第一层工作负荷的主副本的服务器实例上的资源,您可以创建主数据库的任何类型的备份. 也可以创建辅助数据库的日志备份和仅复制完整备份. 一.概念 1.辅助副本上支持的备份类型 BACKUP DATABASE :在辅助副仅支持数据库.文件或文件组的仅复制完整备份. 请注意,仅复制备份不影响日

项目里出现的问题02(xcode的插件安装路径)(自动创建launchimage)

Xcode的插件安装路径: /Users/用户名/Library/Application Support/Developer/Shared/Xcode/Plug-ins 黑马  微博 第一天 05 如果要实现 UIViewController  里的代理方法 和  数据方法  我们就不能用UIViewController来创建 子控制器   应该用一个UIViewController的分类 自动创建launchimage 先删去 LaunchScreen 然后再 (1)点击  Launch Im

sql2008 计划自动创建数据库分区【转】

本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建分区作业. 步骤一:创建分区的计划任务 打开MsSQL2008,找到作业该项,如果打不开或者SQL Server代理是未启动状态,请先在windows服务中启动SQL Server代理(参考图片),   右击MsSQL2008对象资源管理器中的作业,选择新建作业,输入该作业你想用的名称,类别不用管,

自动创建文件夹的两种方法

自动创建文件夹的两种方法 1.CreateDictionary() CreateDirectory(myPath, 0); //在临时文件夹中创建本应用的文件夹 原型为:BOOL WINAPI CreateDirectory(__in  LPCTSTR lpPathName, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes); 其中lpPathName是要创建的目录的路径,第2个涉及安全性问题 传NULL就好了 例如: char path[MAX_

linux字符设备-自动创建设备号和设备节点

Linux字符设备-自动创建设备号和设备节点 先写一个自动分配字符设备号和设备节点的例子及APP 手动安装步骤: Insmod my_char_dev.ko 不需要再安装设备节点 然后是测试app ./my_char_dev_app 1 1 #include <linux/module.h> 2 #include <linux/init.h> 3 #include <linux/io.h> 4 #include <linux/fs.h> 5 #include

性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项 (转载)

原文译自:http://www.mssqltips.com/sqlservertip/2766/sql-server-auto-update-and-auto-create-statistics-options/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012913 统计信息是如何提高SQLServer查询性能的?统计直方图用作在查询执行计划中查询优化器的选择依据.