Spring 自动代理创建器详细介绍及简单实例

Spring 自动代理创建器

前言:

在经典的spring Aop中,可以手工为目标Bean创建代理Bean,配置文件必须为每一个需要增强的Bean声明一个代理,结果配置文件里声明了大量的代理Bean。

在经典的Spring Aop中,Spring提供了自动代理创建器(Aotu proxy creator),有了自动代理创建器,就不再需要使用ProxyFactoryBean手工地创建代理了。

接口Animal和Book:

 package com.zzj.aop; 

public interface Animal {
 public void eat();
 public void drink();
}
package com.zzj.aop; 

public interface Book {
 public void read();
}

目标类:

package com.zzj.aop; 

public class Human implements Animal, Book{
 @Override
 public void eat() {
  System.out.println("eat...");
 } 

 @Override
 public void drink() {
  System.out.println("drink...");
 } 

 @Override
 public void read() {
  System.out.println("read...");
 }
}

前置通知和后置通知:

package com.zzj.aop; 

import java.lang.reflect.Method; 

import org.springframework.aop.MethodBeforeAdvice; 

public class MethodBefore implements MethodBeforeAdvice { 

 public void before(Method arg0, Object[] arg1, Object arg2)
   throws Throwable {
  System.out.println("before " + arg0.getName());
 } 

}

package com.zzj.aop; 

import java.lang.reflect.Method; 

import org.springframework.aop.AfterReturningAdvice; 

public class MethodAfter implements AfterReturningAdvice { 

 public void afterReturning(Object arg0, Method arg1, Object[] arg2,
   Object arg3) throws Throwable {
  System.out.println( "after " + arg1.getName());
 } 

}

Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- 定义目标对象 -->
  <bean id="human" class="com.zzj.aop.Human"></bean> 

  <!-- 定义通知 -->
  <bean id="beforeAdvice" class="com.zzj.aop.MethodBefore"></bean>
  <bean id="afterAdvice" class="com.zzj.aop.MethodAfter"></bean> 

  <!-- 定义切入点 -->
  <bean id="methodNamePointcut"
   class="org.springframework.aop.support.NameMatchMethodPointcut">
   <property name="mappedNames">
    <list>
     <value>eat</value>
     <value>read</value>
    </list>
   </property>
  </bean> 

  <!-- 定义后置增强器(关联通知和切入点) -->
  <bean id="AfterMethodNameAdvisor"
   class="org.springframework.aop.support.DefaultPointcutAdvisor">
   <property name="advice" ref="afterAdvice"></property>
   <property name="pointcut" ref="methodNamePointcut"></property>
  </bean>
  <!-- 定义前置增强器(关联通知和切入点) -->
  <bean id="BeforeMethodNameAdvisor"
   class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
   <property name="advice" ref="beforeAdvice"></property>
   <property name="expression">
    <value>execution(* *.*in*(..))</value><!-- 可匹配drink -->
   </property>
  </bean> 

  <!-- 定义自动代理创建器 -->
  <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
   <property name="beanNames">
    <list>
     <value>*human</value>
    </list>
   </property>
   <property name="interceptorNames">
    <list>
     <value>AfterMethodNameAdvisor</value>
     <value>BeforeMethodNameAdvisor</value>
    </list>
   </property>
  </bean>
</beans>

以上自动代理器可以为以human结尾的Bean创建代理。

测试:


package com.zzj.aop; 

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

public class Test { 

 /**
  * @param args
  */
 public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
  Animal animal = (Animal) context.getBean("human");
  Book book = (Book) animal;
  animal.eat();
  animal.drink();
  book.read(); 

 } 

}

输出:

eat...
after eat
before drink
drink...
read...
after read

Spring还提供了另一个自动代理创建器:DefaultAdvisorAutoProxyCreator。这个自动代理创建器不需要任何配置,他会自动检查Ioc容器里声明的每一个增强器和Bean。如果存在与增强器切入点匹配的的Bean,那么DefaultAdvisorAutoProxyCreator将自动为其创建代理。

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

需要注意的是,DefaultAdvisorAutoProxyCreator可能会代理那些不希望被代理的目标Bean,所以使用时要格外小心。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Spring事务管理只对出现运行期异常进行回滚

    一.结论 Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚. 如果一个方法抛出Exception或者Checked异常,Spring事务管理默认不进行回滚. 关于异常的分类一下详细介绍: 1.基本概念 看java的异常结构图  Throwable是所有异常的根,java.lang.Throwable Error是错误,java.lang.Error Exception是异常,java.lang.Exception 2.Excep

  • spring结合redis如何实现数据的缓存

    1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错.因为commons-pooljar的目录根据版本的变化,目录结构会变.前面的版本是org.apache.pool,而后面的版本是org.apache.pool2... style="background-color: #0098dd; color: white; font-s

  • Spring MVC中上传文件实例

    SpringMVC(注解)上传文件需要注意的几个地方: 1.form的enctype="multipart/form-data",这个是上传文件必须的 2.applicationContext.xml配置: 复制代码 代码如下: <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipartResolver" class="org.springframework.w

  • Java简单实现SpringMVC+MyBatis分页插件

    1.封装分页Page类 package com.framework.common.page.impl; import java.io.Serializable; import com.framework.common.page.IPage; /** * * * */ public abstract class BasePage implements IPage, Serializable { /** * */ private static final long serialVersionUID

  • Spring实现文件上传(示例代码)

    在实际开发中,经常遇到要实现文件上传到服务器端的功能.Spring可以继承commons-fileupload插件来实现文件上传的功能.分为前端JSP编写和后台Controller的编写. 前期准备工作,首先要引入commons-fileupload这个jar包,pom.xml中的配置如下: 复制代码 代码如下: <!-- 实现文件上传,spring集成了这个功能 --><dependency> <groupId>commons-fileupload</group

  • java Spring整合Freemarker的详细步骤

    我的開發環境框架:springmvc開發工具:springsource-tool-suite-2.9.0版本:1.6.0_29tomcat版本:apache-tomcat-7.0.26前言:FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等.簡而言之,Freemarker就是在Jave Web開發

  • Spring常用注解汇总

    本文汇总了Spring的常用注解,以方便大家查询和使用,具体如下: 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包). <context:component-scan base-package="cn.test"/> @Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean. @Scope注解 作用域 @Lazy(true) 表示延迟初始化 @Service用于

  • springboot与mybatis整合实例详解(完美融合)

    简介 从 Spring Boot 项目名称中的 Boot 可以看出来,Spring Boot 的作用在于创建和启动新的基于 Spring 框架的项目.它的目的是帮助开发人员很容易的创建出独立运行和产品级别的基于 Spring 框架的应用.Spring Boot 会选择最适合的 Spring 子项目和第三方开源库进行整合.大部分 Spring Boot 应用只需要非常少的配置就可以快速运行起来. Spring Boot 包含的特性如下: 创建可以独立运行的 Spring 应用. 直接嵌入 Tomc

  • 详解Java的Spring框架中的注解的用法

    1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } ... } 配置文件: <bean id="userManagerImpl" class="com.

  • Spring中的事务管理实例详解

    本文实例讲述了Spring中的事务管理.分享给大家供大家参考.具体分析如下: 事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当作一个单独的工作单元.这些动作要么全部完成,要么全部不起作用 事务的四个关键属性(ACID) ① 原子性(atomicity):事务室一个原子操作,有一系列动作组成.事务的原子性确保动作要么全部完成,要么完全不起作用 ② 一致性(consistency):一旦所有事务动作完成,事务就被提交.数据和资源就

  • spring快速入门实例教程

    本文实例讲述了spring的基本配置与控制反转.分享给大家供大家参考.具体如下: 这里我们采用了maven构建java项目,没有采用maven的同样适用. 1. 创建maven项目,我创建的项目名称为springdemo. 2. 添加依赖包,我是通过maven添加的包,maven相关配置如下: 复制代码 代码如下: <dependency>     <groupId>org.springframework</groupId>     <artifactId>

  • SpringMVC+MyBatis声明式事务管理

    采用的基本搭建环境:SpringMVC.MyBatis.MySQL.tomcat Spring事务管理分解了传统的全局事务管理和本地事务管理的劣势,使得在任何环境中都可以使用统一的事务管理模型,你可以写一次代码,然后在不同的环境从你的代码里面配置不同的事务管理策略,Spring提供两种事务管理策略:一种是声明式事务管理策略,另一种是编程式事务管理策略,这里主要介绍声明式事务管理策略 由于采用的是SpringMVC. MyBatis,故统一采用了标注来声明Service.Controller 由于

  • SpringMVC文件上传 多文件上传实例

    必须明确告诉DispatcherServlet如何处理MultipartRequest.SpringMVC中提供了文件上传使用方式如下配置xxx-servlet.xml,添加如下代码: 复制代码 代码如下: <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">          <!-- 设置

随机推荐