当前位置: 首页 > news >正文

嘉兴外贸网站制作成都网络公司最新招聘

嘉兴外贸网站制作,成都网络公司最新招聘,免费的一级域名申请,如何用vps建网站1 概述 在Java的世界中#xff0c;实现AOP的主流方式是采用动态代理机制#xff0c;这点对于Spring AOP也一样。代理机制的主要目的就是为其他对象提供一种dialing以控制对当前对象的访问#xff0c;用于消除或缓解直接访问对象带来的问题。通过这种手段#xff0c;一个对象…1 概述 在Java的世界中实现AOP的主流方式是采用动态代理机制这点对于Spring AOP也一样。代理机制的主要目的就是为其他对象提供一种dialing以控制对当前对象的访问用于消除或缓解直接访问对象带来的问题。通过这种手段一个对象就代表另一个对象的部分功能我们创建包含当前对象的对象以便向外界提供功能接口。本篇将关注目前主流的动态代理实现技术并分析Spring AOP中的代理实现方式。 在Spring中采用的代理机制有两种即JDK动态代理和CGLIB动态代理。为了介绍动态代理机制引入一个具体的应用场景。考虑一个Account接口它包含一个用于图片展示的open方法代码如下 public interface Account {void open(); } 然后针对该接口有一个实现类RealAccount其中的方法只用于模拟不包括具体业务代码如下 public class RealAccount implements Account {private String name;public RealAccount(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;}Overridepublic void open() {System.out.println(打开 name 账户);} } 现在假设需要在执行RealAccount的open()方法的前后分别打印日志信息。接下来讨论如何分别基于JDK动态代理和CGLIB动态代理来实现这个目标。 2 JDK动态代理 在JDK自带的动态代理中存在一个InvocationHandler接口首先要做的就是提供一个该接口的实现类代码如下 public class AccountHandler implements InvocationHandler {private Object obj;public AccountHandler(Object obj) {super();this.obj obj;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result null;doBefore();result method.invoke(obj,args);doAfter();return result;}private void doAfter() {System.out.println(开户后);}private void doBefore() {System.out.println(开户前);}} InvocationHandler接口中包含一个invoke()方法必须实现这个方法。在这个方法中通常需要调用method.invoke()方法执行原有对象的代码逻辑然后可以在该方法前后添加相应的代理实现。在上述代码中只是简答的打印了日志。然后编写测试类来验证执行结果测试类代码如下 public class Test {public static void main(String[] args) {Account account new RealAccount(zhangsan);AccountHandler handler new AccountHandler(account);Account proxy (Account) Proxy.newProxyInstance(account.getClass().getClassLoader(),account.getClass().getInterfaces(),handler);proxy.open();} } 运行结果如下 这里的Proxy.newProxyInstance()方法的作用就是生成代理类。当该方法被调用时RealAccount类的实例被传入。然后当代理类的open()方法被调用时AccountHandler中invoke方法就会被触发从而实现代理机制。这里的类层次结构图如下 咨询分析上述代码结构可以发现其遵循“设计并实现业务接口——实现Handler——创建代理类”这个流程然后在Handler中构建具体的代理逻辑。上述流程也是代表了最基本的代理机制实现流程。联想一下很多基于AOP机制的拦截器底层实际上就是类似的原理。 3 CGLIB动态代理 CGLIB是一个Java字节码生成库提供了易用的API对Java字节码进行创建和修改。现在尝试拥CGLIB来代理前面的RealAccount类代码清单如下 import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class AccountCglibProxy implements MethodInterceptor {private Enhancer enhancer new Enhancer();public Object getProxy(Class? clazz){enhancer.setSuperclass(clazz);enhancer.setCallback(this);return enhancer.create();}Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(之前);methodProxy.invokeSuper(o,objects);System.out.println(之后);return o;} } 上述代码中的Enhancer类是CGLIB中最常用的一个类类似于前面介绍的JDK动态代理中的Proxy类。和Proxy只能代理接口不同Enhancer既能够代理类接口也能够代理不同类但不能拦截final类和方法。在这里我们实现了MethoInterceptor中的intercept()方法以提供代理逻辑。AccountCglibProxy类的使用方法也比较简单测试代码如下 public class CglibProxyTest {public static void main(String[] args) {AccountCglibProxy proxy new AccountCglibProxy();RealAccount account (RealAccount) proxy.getProxy(RealAccount.class);account.open();} } 作为对比下表展示了JDK动态代理和CGLIB动态代理之间的区别。 4 ProxyFactoryBean JDK自带的动态代理以及基于CGLIB的动态代理在Spring框架中都得到了应用最典型的应用场景就是实现AOP。Spring专门提供了一个ProxyFactoryBean类用于手动创建对象代理并将创建的代理对象作为目标对象的AOP代理。 ProxyFactoryBean提供了一组配置属性用于指定代理的执行行为比较常见的包括proxyTargetClass和exposeProxy。如果proxyTargetClass属性为true则仅使用CGLIB创建代理。如果该属性未设置那么有两种情况如果目标实现了接口则将使用JDK创建代理反之将使用CGLIB创建代理。而exposeProxy属性用于设置是否将当前代理暴露给ThreadLocal。如果该属性为true那么开发人员可以使用AopContext.currentProxy()方法来获取代理对象。 接下来将演示如何使用ProxyFactoryBean来创建和管理对象。继续使用前面的场景现在为MethodBeforeAdvice接口提供了一个实现类。显然从命名上看这个实现类是方法执行前通知的代码清单如下 import com.sun.istack.internal.logging.Logger; import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;public class AccountTransactionInterceptor implements MethodBeforeAdvice {private static final Logger LOGGER Logger.getLogger(AccountTransactionInterceptor.class);Overridepublic void before(Method method, Object[] objects, Object o) throws Throwable {LOGGER.info(账户交易被拦截);} }接着通过Java代码创建一个通知实现方式如下 import org.springframework.aop.Advisor; import org.springframework.aop.aspectj.AspectJExpressionPointcut; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.context.annotation.Bean;public class MyAdvisor {Beanpublic Advisor accountServiceAdvisor(){AspectJExpressionPointcut pointcut new AspectJExpressionPointcut();pointcut.setExpression(execution(*com.jay.aop.service.AccountService.doAccountTransaction(..)));return new DefaultPointcutAdvisor(pointcut,new AccountTransactionInterceptor());} } 最后创建一个ProxyFactoryBean实例并设置相关属性代码如下 Beanpublic ProxyFactoryBean accountService(){ProxyFactoryBean proxyFactoryBean new ProxyFactoryBean();proxyFactoryBean.setTarget(new AccountServiceImpl());proxyFactoryBean.addAdvisor(accountServiceAdvisor());proxyFactoryBean.setExposeProxy(true);return proxyFactoryBean;} 注意这里设置目标类为AccountService接口的实现类AccountServiceImpl并把exposeProxy属性设置为true。这样在AccountServiceImpl中就可以使用Spring AOP提供的AopContext.currentProxy方法来获取这个代理对象实例代码如下 public class AccountServiceImpl implements AccountService {private static final Logger LOGGER Logger.getLogger(AccountServiceImpl.class);Overridepublic boolean doAccountTransaction(Account source, Account dest, int amount) throws MinimumAccountException {((AccountService)(AopContext.currentProxy())).doAccountTransaction(source,dest,amount);return true;} }
http://www.pierceye.com/news/838085/

相关文章:

  • 站长工具视频怎么开免费网站
  • 网站地址怎么申请注册最近新闻大事
  • interidea 做网站网站域名备案 更改
  • 哈尔滨公司做网站动画设计的大学排名
  • 网站建设与网页制作试卷网站搜索引擎优化推广
  • 网站子目录设计网站开发数据库技术
  • 可以做音基题的音乐网站上海网站设计公司有哪些
  • 昆明做网站公司做家居的网站
  • 网站建设首选易网宣软文代发
  • 手机版网站开发用什么语言自己建设的网站怎么赚钱
  • 宁波建设监理协会网站软件开发文档的作用
  • 兰州电商平台网站建设网路神做网站怎么样
  • 诸城易讯网站建设服务中心网址的域名
  • 制作商务网站应用公园制作app软件下载
  • 情头定制网站被称为网站开发神器
  • 宝安网站设计案例淘宝页面制作
  • 天津品牌网站制作怎样建设网站流程
  • 怎样进行公司网站建设wordpress主题公司
  • 外宣做网站宣传网站功能描述
  • 部队网站建设多少钱营销自己的网站
  • 长春市城乡建设部网站南昌诚推网络技术有限公司
  • 网站 建设 欢迎你濮阳家电网站建设
  • 怎么快速建立一个网站如何用腾讯云服务器搭建wordpress
  • 五屏网站建设多少钱深圳网站公司有哪些
  • 莆田网站建站wordpress cd
  • 软件下载安装免费南京seo关键词优化服务
  • 广州网站设计软件建设将网站加入受信网站再试
  • 淘宝联盟网站备案常见的互联网应用
  • 自己做网站 搜索功能开发企业综合信息服务平台
  • 意大利语网站建设wordpress主题首页显示不全