Spring中的动态代理

  动态代理:指的就是通过一个代理对象来创建需要的业务对象,然后在这个代理对象中统一进行各种需求的处理。

  学习完Spring后会发现,Spring中的AOP(面向方面编程:Aspect Oriented Programming)是个很重要的知识点。实现AOP,我们一般采用代理的方式来实

现,这样可以减少重复代码的编写,也符合了OCP原则,即:对修改关闭,对扩展开放。其创建过程如下:

  步骤1:编写一个类实现InvocationHandler接口,例如:LogProxy类

  步骤2:在类中创建一个代理对象,例如:private Object target;

  步骤3:在类中创建一个方法来生成对象,这个方法的参数是指要代理的对象,getInstacne所返回的对象就是代理对象,例如:public static Object getInstance(Object o){ return null}

    步骤3.1:创建LogProxy对象,例如:LogProxy proxy = new LogProxy();

    步骤3.2:设置这个代理对象,例如:proxy.target = o;

    步骤3.3:通过Proxy的方法创建代理对象,第一个参数是要代理对象的classLoader,第二个参数是要代理对象实现的所有接口,第三个参数是实现类

InvocationHandler的对象,此时的result就是一个代理对象,代理的是o,例如:Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(), 

o.getClass().getInterfaces(), proxy);

  步骤4:当有了代理对象之后,不管这个代理对象执行什么方法,都会调用invoke方法,只要在该方法中作相应操作就可以了。

  创建该类的具体代码如下:

    

package com.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class LogProxy implements InvocationHandler {private Object target;public static Object getInstance(Object o){LogProxy proxy = new LogProxy();proxy.target=o;Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces() , proxy);return result;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Logger.info("进行了相关的操作");Object obj = method.invoke(target, args);return obj;}}

接下来就是调用该类进行注入了。首先,需要在applicationContent.xml配置文件中的bean中调用LogProxy类,并且采用工厂方法的方式,即:factory-method="getInstance"。参考代码如下:

   <bean id="userDynamicDao" class="com.proxy.LogProxy" factory-method="getInstance"><!-- 构造方法中引用userDao --><constructor-arg ref="userDao"/></bean>

如果采用annotation来注入,则直接在userService类中的setUserDao方法前面加上注解:@Resource(name="userDynamicDao") 就可以了

package com.service;import javax.annotation.Resource;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;import com.dao.IUserDao;
import com.model.User;
import com.sun.xml.internal.bind.v2.runtime.Name;

@Service("userService")//业务层一般用Service
public class UserService implements IUserService {private IUserDao userDao;public void add(User user) {userDao.add(user);}public void delete(int id) {userDao.delete(id);}public IUserDao getUserDao() {return userDao;}public User load(int id) {return userDao.load(id);}@Resource(name="userDynamicDao")//采用代理来注入public void setUserDao(IUserDao userDao) {this.userDao = userDao;}}

相关的类如下:

package com.model;public class User {private int id;private String username;public User() {}public User(int id, String username) {this.id=id;this.username=username;}public int getId() {return id;}public String getUsername() {return username;}public void setId(int id) {this.id = id;}public void setUsername(String username) {this.username = username;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + "]";}
}
package com.dao;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;import com.model.User;//@Component("userDao")//等于完成了<bean id="userDao" class="com.dao.UserDao" />
@Repository("userDao")//@Repository一般用于DAO的注入
public class UserDao implements IUserDao {public void add(User user) {System.out.println("添加用户:"+user);}public void delete(int id) {System.out.println("删除id:"+id);}public User load(int id) {System.out.println("加载id:"+id);return null;}}
package com.dao;import com.model.User;public interface IUserDao {public void add(User user);public void delete(int id);public User load(int id);}
package com.proxy;import java.util.Date;public class Logger {public static void info(String info){System.out.println(new Date()+"---->"+info);}
}
package com.service;import com.model.User;public interface IUserService {public void add(User user);public void delete(int id);public User load(int id);
}

相应的配置文件:

<?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:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- 打开Spring的Annotation支持 --><context:annotation-config/><!-- 设定Spring 去哪些包中找Annotation --><context:component-scan base-package="com"/><bean id="userDynamicDao" class="com.proxy.LogProxy" factory-method="getInstance"><!-- 构造方法中引用userDao --><constructor-arg ref="userDao"/></bean>
</beans>

 

转载于:https://www.cnblogs.com/misterzxy/p/3548859.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LED——S5PV210的LED的理论与操作

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、LED物理特性介绍 LED本身有2个接线点&#xff0c;一个是LED的正极&#xff0c;一个是LED的负极。 LED的功能就是亮或者不亮&#xff0c;只需要给LED的正极加电压即可点亮LED&#xff0c;去掉电压…

“.公司”域名注册总量TOP15:新网问鼎 万网居亚

IDC评述网&#xff08;idcps.com&#xff09;01月16日报道&#xff1a;根据ntldstats.com发布的最新数据显示&#xff0c;截止至01月15日17:00&#xff0c;在“.公司”域名注册总量大战中&#xff0c;新网打败众多国内外域名服务商&#xff0c;成为新晋霸主&#xff0c;其“.公…

Prepare for Mac App Store Submission--为提交到Mac 应用商店做准备

返回 Mac App Store Prepare for Mac App Store Submission 提交到Mac 应用商店之前的准备 Most of your time is spent on coding tasks, but to develop for the Mac App Store, you need to perform a number of administrative tasks, using Xcode and other tools. You’l…

ARM通识——关于ARM的一些认识

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 注意&#xff0c;由于文章的撰写时间过早&#xff0c;很多内容没有更新&#xff0c;这里仅当一个通识了解。 1、ARM发展的里程碑 ARM的前身为艾康电脑&#xff08;Acorn&#xff09;&#xff0c;于…

使用RMAN备份数据库

1.1使用控制文件备份全库 1.1.1配置备份路径 1.1.2 RMAN备份全库 1.2使用catalog数据库备份全库 1.2.1配置到远程数据库的TNS 1.2.2创建表空间及设置用户 1.2.3进入目录数据库并注册 1.2.4 CATALOG方式备份全库 转载于:https://www.cnblogs.com/myrunning/p/4231057.html

PL/SQL Developer连接Oracle 11g在Win8 64位系统下乱码

PL/SQL Developer在64位系统上连接Oracle&#xff0c;需要安装32位Oracle client客户端&#xff0c;使用后&#xff0c;发现操作数据库出现乱码的情况。经过查找资料&#xff0c;解决此问题&#xff0c;方法如下&#xff1a; 需要在系统的环境变量中&#xff0c;加入以下变量&a…

命令模式--command模式

首先来一个命令的接口&#xff1a; package mode.command;/*** * 定义一个命令接口&#xff0c;其中有一个抽象的执行方法&#xff0c;参数人命令接收器* * */ public interface Command {public void execute(CommandReceiver commandReceiver); }定义一个命令接受者的接口&am…

uploadify scriptData参数无法传参的问题

最近需要使用到uploadify&#xff0c;需要向后台传递参数&#xff0c;使用script最多只能够传递一个参数&#xff0c;当然也可以通过合并参数然后再在服务器段拆分参数的方法来传递多个参数&#xff0c;而uploadify插件提供的scriptData却怎么都无法使用&#xff0c;网上查阅了…

安装iproute2

yum install -y gcc bison flex#tar -xzf iproute2-3.17.0.tar.gz#cd iproute2-3.17.0#sed -i /^TARGETS/sarpdg misc/Makefile#make SBINDIR/sbin#make SBINDIR/sbin install参考资料&#xff1a;http://blog.sina.com.cn/s/blog_5f5716580100rvop.htmlhttps://www.kernel.or…

「北京」京东 JD.COM 招聘中/高级前端工程师

职位描述&#xff1a; 1、计算机或相关专业专科以上学历&#xff0c;2年以上网站前端开发经验&#xff0c;电子商务相关从业经验优先&#xff1b;2、精通各种Web前端技术&#xff0c;对符合web标准的网站重构有丰富经验&#xff0c;有成功作品&#xff1b;3、理解并掌握JavaScr…

前端上传组件Plupload使用指南

我之前写过一篇文章《文件上传利器SWFUpload使用指南》&#xff0c;里面介绍了上传组件SWFUpload的使用方法&#xff0c;但现在随着html5技术的逐渐推广和普及&#xff0c;再去使用以flash为上传手段的SWFUpload显然就有点过时了&#xff0c;毕竟html5原生的就给我们提供了文件…

HTML5简易在线画图工具

HTML5简易在线画图工具 原文:HTML5简易在线画图工具继上次学习了HTML5的路径画圆做了动态时钟、异次元空间的反转做了运动的太阳系&#xff0c;这两天将画线、画圆、填充等知识点结合起来做了一个简易的在线画图工具&#xff1a; 查看DEMO&#xff1a;HTML5简易在线画图工具 功…

uboot中系统时钟初始化函数:system_clock_init

时钟初始化函数内容如下&#xff1a; /** system_clock_init: Initialize core clock and bus clock.* void system_clock_init(void)*/ system_clock_init:ldr r0, ELFIN_CLOCK_POWER_BASE 0xe0100000/* Set Mux to FIN */ldr r1, 0x0str r1, [r0, #CLK_SRC0_OFFSET]ldr r1, …

【excel技巧读书笔记001】清除打开过的文件记录

我们在工作的时候经常打开工作薄&#xff0c;这些工作薄都会在最近使用的工作薄列表看到&#xff0c;如果不希望别人看到自己打开过的记录&#xff0c;可以将最近使用的工作薄列表清空。具体步骤如下&#xff1a;1.【文件】-【选项】-【高级】-【显示】显示此数目的最近使用文档…

写一个函数,使给定的一个二维数组(3×3)转置,即行列互换

写一个函数&#xff0c;使给定的一个二维数组&#xff08;&#xff13;&#xff13;&#xff09;转置&#xff0c;即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 163 Solved: 120[Submit][Status][Web Board]Description 写一个函数&#xff0c;使给定的一个二维…

快速开发系统之前台页面 ---- NO1----登录页面

2019独角兽企业重金招聘Python工程师标准>>> 快速开发系统之前台页面 ---- NO1----登录页面 <% page language"java" contentType"text/html; charsetutf-8"pageEncoding"utf-8"%> <!DOCTYPE html> <html lang"z…

微信公众平台用户分组管理开发文档详解

本文转载至 http://www.5icool.org/a/201402/a4292.html 时间&#xff1a;2014-02-09 来源&#xff1a;互联网 开发者可以使用接口&#xff0c;对公众平台的分组进行查询、创建、修改操作&#xff0c;也可以使用接口在需要时移动用户到某个分组。 创建分组 一个公众账号&…

HP服务器F10 Function Disabled,无法使用F10安装操作系统

HP惠普服务器正确安装操作系统的方法是使用F10引导安装&#xff0c;可以自动安装操作系统&#xff0c;与硬件结合的更好&#xff0c;而且安装完成后&#xff0c;如果是windows操作系统&#xff0c;可以有HP管理页。某次&#xff0c;在使用F10引导安装操作系统的时候&#xff0c…

apt-get for ubuntu 工具简介

先介绍几个和apt-get相关的目录: /var/lib/dpkg/available 文件的内容是软件包的描述信息, 该软件包括当前系统所使用的 Debian 安装源中的所有软件包,其中包括当前系统中已安装的和未安装的软件包. /var/cache/apt/archives 目录是在用 apt-get install 安装软件时&#xff0c…

【VMCloud云平台】SCAP(一)规划

完成了System Center中的悍将SCO基础篇后&#xff0c;咱们来聊聊SCAP&#xff0c;很多人说SCAP是一个简单的组件&#xff0c;何必单独拿出来聊呢&#xff1f;我倒是认为不然&#xff0c;作为System Center中为数不多的主打Portal类型的组件&#xff08;除开组件的Web Console就…