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"开始,这里我 ...
随机推荐
- PS 颜色表大全-CMYK颜色表(2)
CMYK颜色表 编号 C M Y K R G B 16进制值 1 0 100 100 45 139 0 22 8B0016 2 0 100 100 25 178 0 31 B2001F 3 0 100 ...
- springMVC上传图片
http://blog.csdn.net/cheung1021/article/details/7084673/ http://toutiao.com/a6293854906445021442/ 工程 ...
- ASP.NET遍历textbox文本框
Asp.Net如何遍历所有TextBox控件并清空 asp.net 不能像window那样直接遍历this.Controls就可以了,因为: this.Controls只是包含了Page根一级的con ...
- bzoj 3637: Query on a tree VI 树链剖分 && AC600
3637: Query on a tree VI Time Limit: 8 Sec Memory Limit: 1024 MBSubmit: 206 Solved: 38[Submit][Sta ...
- 从零开始运维之旅:如何监控你的 Windows?
小弟乃刚刚踏入运维圈的资深小白一枚,正所谓完事开头难,公司里怕我把生产系统搞坏就让我先在测试环境上先练练手.巧的是测试环境又是我熟悉的 Windows 环境,心中窃喜啊.但问题随之而来,运维从何下手呢 ...
- windows中断与共享的连接(samba)
问题:window下当成功登录到samba服务器上的共享的目录的时候,若要是再系想登录此服务器上另外一个共享目录时,会弹出登录窗口. 但是不管输入的用户名和密码对错都会提示. “不允许一个用户使用一个 ...
- 在linux下,查看一个运行中的程序, 占用了多少内存
1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...
- highcharts 柱形堆叠图
<!doctype html> <html lang="en"> <head> <script type="text/javas ...
- [Unity菜鸟] 材质
1. 材质定义: 2. 把材质都改成支持透明通道 因为物体太多了,比如树跟房子材质必须用不一样的.所以办法还是你得改每个材质的Shader,都改成支持透明通道的. 在Project的搜索窗口输入t: ...
- Qt之显示网络图片(可以改成升级模块)
http://blog.csdn.net/u011012932/article/details/50773382