Spring 教程(二)
- public class User {
- private Integer id;
- private String name;
- }
- public class UserDao {
- public void save(User user){
- System.out.println("save user....");
- }
- public void delete(int id){
- System.out.println("delete user....");
- }
- public void update(User user) {
- System.out.println("update user ....");
- }
- public User query(String name) {
- System.out.println("getUser ....");
- return new User();
- }
- }
- public class UserBeforeAdvice implements MethodBeforeAdvice {
- public void before(Method method, Object[] args, Object target) {
- System.out.println("调用方法:"+method.getName() + "()前拦截处理");
- }
- }
- public class UserAfterAdvice implements AfterReturningAdvice {
- public void afterReturning(Object returnValue, Method method, Object[] args, Object target) {
- System.out.println("方法:"+method.getName() + "()返回后拦截处理");
- }
- }
- public class UserAroundAdvice implements MethodInterceptor {
- public Object invoke(MethodInvocation invocation) throws Throwable {
- System.out.println("调用方法:"+invocation.getMethod().getName() + "()前拦截处理");
- Object o = invocation.proceed();
- System.out.println("调用方法:"+invocation.getMethod().getName() + "()后拦截处理");
- return o;
- }
- }
- <?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-3.2.xsd">
- <bean id="userDaoTarget" class="com.boya.spring.dao.UserDao" />
- <bean id="userBeforeAdvice" class="com.boya.spring.aop.UserBeforeAdvice" />
- <bean id="userAfterAdvice" class="com.boya.spring.aop.UserAfterAdvice" />
- <bean id="userAroundAdvice" class="com.boya.spring.aop.UserAroundAdvice" />
- <bean id="userDao" class="org.springframework.aop.framework.ProxyFactoryBean">
- <property name="interceptorNames">
- <list><value>userAroundAdvice</value></list>
- </property>
- <property name="target" ref="userDaoTarget"></property>
- </bean>
- </beans>
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
- UserDao userDao = context.getBean("userDao", UserDao.class);
- userDao.save(new User());
- }
调用方法:save()前拦截处理save user....调用方法:save()后拦截处理
3、使用Spring配置文件将业务逻辑和AOP切面逻辑进行组装
- public interface SignInterface {
- public Object sign(String nameList);
- }
- public class Teacher implements SignInterface {
- public Object sign(String nameList) {
- System. out .println( "Teacher sign..." );
- return new Object();
- }
- }
- public class Leader implements SignInterface {
- private Teacher teacher;
- public Object sign(String nameList) {
- if (teacher == null) {
- teacher = new Teacher();
- }
- Object o = teacher.sign(nameList);
- return o;
- }
- }
- public static void main(String[] args) {
- SignInterface s = new Leader();
- s.sign("names");
- }
- public class ProxyObject implements InvocationHandler {
- private Object proxy_obj;
- ProxyObject(Object obj) {
- this.proxy_obj = obj;
- }
- public static Object getProxy(Object obj) {
- Class cls = obj.getClass();
- // 通过Proxy类的newProxyInstance方法来返回代理对象
- return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new ProxyObject(obj));
- }
- /**
- * 实现InvocationHandler接口的invoke
- */
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("调用方法:" + method + "()之前拦截处理");
- if (args != null) {
- System.out.println("方法有" + args.length + "个参数");
- for (int i = 0; i < args.length; i++) {
- System.out.println(args[i]);
- }
- }
- // 利用反射机制动态调用真实对象的方法
- Object o = method.invoke(proxy_obj, args);
- System.out.println("调用方法:" + method + "()之后拦截处理");
- return o;
- }
- // 测试代码
- public static void main(String agr[]) {
- SignInterface si = (SignInterface) getProxy(new Teacher());
- si.sign("names");
- }
- }
- public class CGLibTeacher {
- public Object sign(String nameList) {
- System.out.println("Teacher sign...");
- return new Object();
- }
- }
- public class CGLibAop implements MethodInterceptor {
- public Object intercept(Object arg0, Method arg1, Object[] arg2,
- MethodProxy arg3) throws Throwable {
- System.out.println("before...");
- Object o = arg3.invokeSuper(arg0, arg2);
- System.out.println("after...");
- return o;
- }
- }
- public class CGLibProxy {
- public static CGLibTeacher create(CGLibAop aop){
- Enhancer en = new Enhancer();
- //进行代理
- en.setSuperclass(CGLibTeacher.class);
- en.setCallback(aop);
- //生成代理实例
- return (CGLibTeacher)en.create();
- }
- public static void main(String[] args) {
- CGLibTeacher t = CGLibProxy.create(new CGLibAop());
- t.sign("names");
- }
- }
Spring 教程(二)的更多相关文章
- Spring Security教程(二):自定义数据库查询
Spring Security教程(二):自定义数据库查询 Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就 ...
- SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1
在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...
- Spring教程索引
Spring教程索引 2016-11-15 1 入门 1 概述.深入浅出Spring(一)Spring概述 2 体系结构 3 环境设置 4 Hello World 实例 5 IoC 容器 IoC容 ...
- 13、Spring教程之全部(包括所有章节)
Spring 教程 1.Spring概述 简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置
前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- 无废话ExtJs 入门教程二[Hello World]
无废话ExtJs 入门教程二[Hello World] extjs技术交流,欢迎加群(201926085) 我们在学校里学习任何一门语言都是从"Hello World"开始,这里我 ...
随机推荐
- Bootstrap 内核引用(一)
方法一: Bootstrap CDN推荐 本站实例采用的是百度的静态资源库(http://cdn.code.baidu.com/)上的Bootstrap资源. 百度的静态资源库的 CDN 服务,访问速 ...
- C#中字符串驻留技术
转自:http://www.cnblogs.com/Charles2008/archive/2009/04/12/1434115.html MSDN概念:公共语言运行库通过维护一个表来存放字符串,该表 ...
- XCode6.1中的ios7.1适配
在xcode6.1中新创建的项目,运行在我的ios7.1的ipod touch上时(与5s的一样的尺寸, Retina屏幕), 上下出现了黑边,由于没有下载7.1的模拟器,不知道模拟器上有无问题, 查 ...
- WEB开发人员必知的20+HTML5技巧(转)
互联网科技发展的速度真可谓惊人的快,一个稍不留神,你就可能无法跟上它的步伐. HTML5的变化和更新也压倒不少人,这篇文章将向大家介绍一些最基本也非常必要的 HTML技巧. 1. 新的文档类型(Doc ...
- ANN中Precision-Recall权衡
如果想要得到较高的精度,则需要较长的编码. 编码长度m增长的话,则item碰撞的概率会成倍的减小,从而导致召回率下降. 为了得到较高的召回率,则需要多个哈希表. 参考http://yongyuan.n ...
- NOIP2014 行记
不知道OI是啥或者信息学竞赛是啥的可以按`Ctrl+W`. <del>很早开始写的..准备出分之后再发布.</del> 谨以此文纪念我信息学竞赛的第一次正式考试. 背景音乐底部 ...
- Notepad++ 右键菜单自定义配置
问:想在右键菜单里面多加几个功能,怎么加,比如区块注释 答:其实notepad++的配置文件存放路径不在自己的软件路径,而存在于 xp:C:\Documents and Settings\Admini ...
- ASProtect.SKE.2.11 stolen code解密
关于ASProtect.SKE.2.11 stolen code方面的文章已经很多了,今天我想再详细地说说它的细节,献给喜欢破解的兄弟们. stolen code并不可怕! ASProtect.SKE ...
- 结构型—桥接(Bridge)模式
1.意图: 将抽象部分(抽象接口)与它的实现部分(代码实现)分离,使它们都可以独立地变化. 理解:抽象部分是对外展现的接口(api),而实现部分是针对抽象接口提供的不同版本的功能实现,使两者独立变化指 ...
- ICMP and InetAddress.isReachable()
In Java it is only possible to work with two types of sockets: stream based ones (or TCP ones - java ...