- 浏览: 890646 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
提到代理,我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置文件的编写带来繁重的工作
Spring为我们提供了,根据beanName匹配后进行自动代理的解决方法
业务接口
package AutoProxyOne;
public interface Shopping ...{
public String buySomething(String type);
public String buyAnything(String type);
public String sellSomething(String type);
public String sellAnything(String type);
}
public interface Shopping ...{
public String buySomething(String type);
public String buyAnything(String type);
public String sellSomething(String type);
public String sellAnything(String type);
}
业务实现类A,作为配置文件中的buyBean:
package AutoProxyOne;
public class ShoppingImplA implements Shopping ...{
private Customer customer;
public Customer getCustomer() ...{
return customer;
}
public void setCustomer(Customer customer) ...{
this.customer = customer;
}
public String buySomething(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String buyAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String sellAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
public String sellSomething(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
}
public class ShoppingImplA implements Shopping ...{
private Customer customer;
public Customer getCustomer() ...{
return customer;
}
public void setCustomer(Customer customer) ...{
this.customer = customer;
}
public String buySomething(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String buyAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String sellAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
public String sellSomething(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
}
业务实现类B,作为配置文件中的sellBean:
package AutoProxyOne;
public class ShoppingImplB implements Shopping ...{
private Customer customer;
public Customer getCustomer() ...{
return customer;
}
public void setCustomer(Customer customer) ...{
this.customer = customer;
}
public String buySomething(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String buyAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String sellAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
public String sellSomething(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
}
public class ShoppingImplB implements Shopping ...{
private Customer customer;
public Customer getCustomer() ...{
return customer;
}
public void setCustomer(Customer customer) ...{
this.customer = customer;
}
public String buySomething(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String buyAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}
public String sellAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
public String sellSomething(String type) ...{
System.out.println(this.getCustomer().getName()+" sell "+type+" success");
return null;
}
}
切面通知:
package AutoProxyOne;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
//前置通知
public class WelcomeAdvice implements MethodBeforeAdvice ...{
public void before(Method method, Object[] args, Object obj)
throws Throwable ...{
System.out.println("Hello welcome to bye ");
}
}
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
//前置通知
public class WelcomeAdvice implements MethodBeforeAdvice ...{
public void before(Method method, Object[] args, Object obj)
throws Throwable ...{
System.out.println("Hello welcome to bye ");
}
}
配置文件:
其中beanNames为buy*,意味着所有以buy开头的bean,都被spring容易自动代理,执行相应的切面通知
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<bean id="WelcomeAdvice" class="AutoProxyOne.WelcomeAdvice">
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>buy*</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>WelcomeAdvice</value>
</list>
</property>
</bean>
<bean id="buyBean" class="AutoProxyOne.ShoppingImplA">
<property name="customer">
<ref bean="customer"/>
</property>
</bean>
<bean id="sellBean" class="AutoProxyOne.ShoppingImplB">
<property name="customer">
<ref bean="customer"/>
</property>
</bean>
<bean id="customer" class="AutoProxyOne.Customer">
<constructor-arg index="0">
<value>gaoxiang</value>
</constructor-arg>
<constructor-arg index="1">
<value>26</value>
</constructor-arg>
</bean>
</beans>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<bean id="WelcomeAdvice" class="AutoProxyOne.WelcomeAdvice">
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>buy*</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>WelcomeAdvice</value>
</list>
</property>
</bean>
<bean id="buyBean" class="AutoProxyOne.ShoppingImplA">
<property name="customer">
<ref bean="customer"/>
</property>
</bean>
<bean id="sellBean" class="AutoProxyOne.ShoppingImplB">
<property name="customer">
<ref bean="customer"/>
</property>
</bean>
<bean id="customer" class="AutoProxyOne.Customer">
<constructor-arg index="0">
<value>gaoxiang</value>
</constructor-arg>
<constructor-arg index="1">
<value>26</value>
</constructor-arg>
</bean>
</beans>
测试代码:
在测试代码中,我们的buyBean打印两条买的信息,sellBean打印两条卖的信息,可以看到buyBean执行的方法已经进行了切面处理
需要注意的是,如果使用自动代码,则获得Spring Bean工厂要用
ApplicationContext ctx=new FileSystemXmlApplicationContext(filePath);
而不能用
BeanFactory factory=new XmlBeanFactory(new FileSystemResource(filePath));
原因我想是因为BeanFactory在初始化时并不实例化单例的Bean,而ApplicationContext则在初始化时候全部实例化了Bean,自动代理需要在初始化时候定义好代理关系
package AutoProxyOne;
import java.io.File;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
public class TestAdvisor ...{
public static void main(String[] args) ...{
String filePath=System.getProperty("user.dir")+File.separator+"AutoProxyOne"+File.separator+"hello.xml";
BeanFactory factory=new XmlBeanFactory(new FileSystemResource(filePath));
ApplicationContext ctx=new FileSystemXmlA
import java.io.File;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
public class TestAdvisor ...{
public static void main(String[] args) ...{
String filePath=System.getProperty("user.dir")+File.separator+"AutoProxyOne"+File.separator+"hello.xml";
BeanFactory factory=new XmlBeanFactory(new FileSystemResource(filePath));
ApplicationContext ctx=new FileSystemXmlA
转http://esffor.iteye.com/blog/96128
发表评论
文章已被作者锁定,不允许评论。
-
spring 2.5 注释驱动的 IoC 功能
2012-06-15 23:35 936概述 注释配置相对于 XML 配置具有很多的优势: 它可 ... -
在Spring BeanFactory容器中管理两种bean
2012-06-08 22:45 3013在Spring BeanFactory容器 ... -
Spring-security 1
2011-05-15 20:20 1675有没有发现一个问题 ... -
容器背后的秘密
2011-04-28 00:26 910核心提示:4.4 容器背 ... -
spring 监听器 IntrospectorCleanupListener简介
2011-04-27 15:49 1278其中JavaBeans Introspector是一个类,位置 ... -
通过ApplicationContextAware获取bean
2011-04-25 17:30 1659通过ApplicationContextAware获取bean ... -
详解 Spring 3.0 基于 Annotation 的依赖注入实现
2011-03-14 17:18 1091简介: Spring 的依赖配置方式与 Spring 框架的内 ... -
spring+hibernate操控LOB对象
2011-03-12 00:27 972spring为hibernate提供了对LOB对像的支持, ... -
Spring AOP
2011-03-11 10:32 863AOP是Aspect Oriented Programming ... -
Spring AOP配置选项
2011-03-11 08:59 1596Spring实现动态代理配置是有两种配置文件:1、 xml ... -
spring 事务传播属性和隔离级别
2011-02-13 14:53 1070一、Propagation (事务的 ... -
spring学习,实例化bean的方式及Bean的作用域
2010-10-26 10:09 1159今天继续学习Spring,黎老师对Spring中比较重要的部分 ... -
Spring学习 xml配置依赖注入
2010-10-26 09:39 989最近项目中也配了几遍ssh框架了,不过老出问题,还是Sprin ... -
IOC控制反转和DI依赖注入区别
2010-10-12 15:20 1180IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IO ... -
Quartz cron表达式详解
2010-09-27 15:13 953字段 允许 ... -
Spring Bean的作用域
2010-09-27 15:12 941XML代码 <bean id="role ... -
spring配置中调用properties文件
2010-09-27 14:59 1570system.propertiesdatabase.url=j ... -
DataSourceUtils.getConnection()要与其对称方法配合使用
2010-09-15 16:56 1401DataSourceUtils.getConnection() ... -
Spring源代码解析(一):IOC容器
2010-08-17 13:33 808在认真学习Rod.Johnson的三部曲之一:< < ... -
Spring源代码分析之(二):IOC容器在web容器中的启动[转]
2010-08-17 13:32 979以下引用自博客:http://jiwenke-spring.b ...
相关推荐
一、Spring自动代理简介 自动代理是Spring AOP的核心功能之一,它创建了一个代理对象来包装原始的bean。当调用代理对象的方法时,Spring会先执行一些预定义的行为(如切面),然后转发调用到实际的目标对象。这使得...
`BeanNameAutoProxyCreator`是Spring AOP实现中的一种代理创建器,它根据bean的名称来决定是否对bean进行代理处理。在本篇文章中,我们将深入探讨`BeanNameAutoProxyCreator`的使用方法及其背后的原理。 首先,`...
2. **使用BeanNameAutoProxyCreator**:根据Bean名称自动创建事务代理,这需要对Spring AOP有更深入的理解。 3. **使用DefaultAdvisorAutoProxyCreator**:与`BeanNameAutoProxyCreator`类似,但其配置的可读性可能...
`DefaultAdvisorAutoProxyCreator`是Spring中最常用的自动代理创建者,它会自动将所有符合条件的advisor应用到所有的bean上。与`BeanNameAutoProxyCreator`不同,它不依赖于bean名称,而是依赖于advisor的pointcut...
7.9. 使用“自动代理(autoproxy)”功能 7.9.1. 自动代理bean定义 7.9.1.1. BeanNameAutoProxyCreator 7.9.1.2. DefaultAdvisorAutoProxyCreator 7.9.1.3. AbstractAdvisorAutoProxyCreator 7.9.2. 使用元数据驱动...
`DefaultAdvisorAutoProxyCreator`是Spring AOP中用于自动创建代理的组件,它会寻找所有`Advisor`(包括事务增强`Advisor`),并将它们应用到相关的bean上。这样,我们可以通过定义`Pointcut`来决定哪些方法需要...
IntroductionInterceptor DelegatingIntroductionInterceptor Autoproxing 自动代理可以让您不用为每一个要被 Advised 的 Target 手动定义代理物件,透过 Bean 名称或是 Pointcut 的比对,自动为...
经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...
经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...
1. 基于Bean配置名规则的自动代理生成器:BeanNameAutoProxyCreator是这种类型的实现类,它允许为一组特定配置名的Bean自动创建代理实例。 2. 基于Advisor匹配机制的自动代理创建器:...
拦截顺序问题的原因是由于 Spring 框架中有多种自动代理方式的存在。Spring 框架中有三种自动代理方式: 1. 通过 Bean 的名称自动创建代理,实现类 BeanNameAutoProxyCreator 2. 根据 Bean 中的 AspectJ 注解自动...
通过配置事务管理器、事务拦截器以及自动代理创建器,开发者可以轻松地为应用程序添加事务支持,而无需编写复杂的事务代码。这种方式不仅提高了代码的可读性和可维护性,还降低了事务管理的复杂度,使得开发者可以...
了解并正确使用这些事务传播行为,可以帮助我们更好地设计和实现复杂的应用程序,确保数据的一致性和事务的完整性。在实际开发过程中,应根据具体的业务需求来选择合适的事务传播行为类型,以达到最佳的效果。
最后,`autoproxy` Bean 是一个自动代理创建器,它会为 `purviewimpl` 这个 Bean 创建一个代理,这个代理会在调用 `logincheck()` 方法时,先执行 `BeforeMethod` 的 `before()` 方法。 总结来说,这个例子展示了...
--定义DAO Bean ,由于BeanNameAutoProxyCreator自动生成事务代理--> class="com.service.impl.UserManagerImpl"> singleton="false"> </beans>
**四、自动代理的配置** 为了使事务拦截器能够应用于业务层的方法调用,我们需要使用`BeanNameAutoProxyCreator`来创建AOP代理: ```xml class="org.springframework.aop.framework.autoproxy....