1.spring架构:

  spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

2.spring架构图:

  2.1)IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。spring中有三种注入方式,一种是set注入,一种是接口注入,另一种是构造方法注入。

2.2)AOP面向切面编程

  aop就是纵向的编程,如下图所示,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。

 

  spring中面向切面变成的实现有两种方式,一种是动态代理,一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是有继承。

3.spring实例:

  在不使用spring之前,假如我们要对我们的一个程序方法进行计时,通常的做法是在该方法执行前和执行后加上时间函数,获得执行该方法前后的时间,再相减得到该方法的执行时间,这样做是很正常,也是很常见的;但是现在有个问题,假如我们这个类中有很多个方法,现在要求得每一个方法执行的时间,这个时候正常情况下,我们是在每一个函数前后都加上刚才那两段程序,但是这样做,我们就会想,既然添加的部分代码是一致的,添加的位置也是一样的,有没有一种方法,使得我只要添加一次该代码,就可以获得所有方法的执行时间呢,这就是spring的一个应用场景.这个过程有两种实现方法,一种是利用java自带的Proxy,另一种是利用Cglib,下面将分别给出两种方法分别实现的小实例.工程所需要的所有jar包链接:http://pan.baidu.com/s/1kUZmpWb

3.1. Proxy实现

(1)定义一个接口UserManager.java,里面包含我们要计时的所有函数:

public interface UserManager {
public void addUser(String username, String password);

public void delUser(int userId);

public String findUserById(int userId);

public void modifyUser(int userId, String username, String password);
}

  (2)定义实现刚才的接口类UserManagerImpl.java:

public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
System.out.println("UserManager.addUser");
}

public void delUser(int userId) {
System.out.println("UserManager.delUser");
}

public String findUserById(int userId) {
System.out.println("UserManager.findUserById");
return "张三";
}

public void modifyUser(int userId, String username, String password) {
System.out.println("UserManager.modifyUser");
}
}

  (3)采用proxy方法,添加计时代码

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class SecurityHandler implements InvocationHandler {

private Object targetObject;

public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(),
this);
}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub

//加入统计开始时间

// 统计时间的目标方法
Object ret = method.invoke(targetObject, args);

//加入统计结束时间

//计算方法执行时间

return ret;
}

}

  (4)定义测试类ProxyTest:

public class ProxyTest {
public static void main(String[] args) {

SecurityHandler handler = new SecurityHandler();
UserManager userManager = (UserManager) handler.createProxyInstance(new UserManagerImpl());
userManager.delUser(12);
}
}

3.2.Cglib实现:

  (1)定义要计时的方法类B,里面有我们要计时的所有方法:

public class B {
public void f1(){
System.out.println("f1........");
}

public void f2(){
System.out.println("f2........");
}

public void f3(){
System.out.println("f3........");
}

public void f4(){
System.out.println("f4........");
}

public void f5(){
System.out.println("f5........");
}
}

  (2)采用Cglib方法,添加计时代码:

public class CglibB implements MethodInterceptor{

private Object target;
public Object getInstance(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}


@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub

//加入统计开始时间

arg3.invokeSuper(arg0, arg2);

//加入统计结束时间

//计算方法执行时间

return null;
}

}

  (3)定义测试类:

public class CglibTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
B b = (B)new CglibB().getInstance(new B());
b.f1();
}

}

版权所有.转发请注明出处,谢谢!

Spring初识(通过小实例清晰认识Spring)的更多相关文章

  1. MyBatis初识(通过小实例清晰认识MyBatis)

    1.MyBatis框架: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  2. Spring+SpringMVC+Hibernate小案例(实现Spring对Hibernate的事务管理)

    原文地址:https://blog.csdn.net/jiegegeaa1/article/details/81975286 一.工作环境 编辑器用的是MyEclipse,用Mysql数据库,mave ...

  3. spring+mybatis之声明式事务管理初识(小实例)

    前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...

  4. spring+mybatis之注解式事务管理初识(小实例)

    1.上一章,我们谈到了spring+mybatis声明式事务管理,我们在文章末尾提到,在实际项目中,用得更多的是注解式事务管理,这一章将学习一下注解式事务管理的有关知识.注解式事务管理只需要在上一节的 ...

  5. 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】

    初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...

  6. 获取Spring容器中Bean实例的工具类(Java泛型方法实现)

    在使用Spring做IoC容器的时候,有的类不方便直接注入bean,需要手动获得一个类型的bean. 因此,实现一个获得bean实例的工具类,就很有必要. 以前,写了一个根据bean的名称和类型获取b ...

  7. Redis整合Spring结合使用缓存实例

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...

  8. activiti自定义流程之Spring整合activiti-modeler5.16实例(九):历史任务查询

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  9. activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

随机推荐

  1. [Android ADB] An auto-input method for Android and Windows

    The Valentine's Day is coming. Here is an auto-input method and you may use it to send multiple word ...

  2. iOS程序生命周期 AppDelegate

    iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受 ...

  3. java 多线程之卖票两种方式

    1.通过extends Thread /* 需求:简单的卖票,多个窗口同时买票 (共用资源) 创建线程的第二种方式:实现Runnable接口 步骤: 1,定义类实现Runnable接口 2,覆盖/重写 ...

  4. Python学习--22 异步I/O

    在同步IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行.而异步IO方式中,线程发送一个IO请求到内核,然后继续处理其他的事情,内核完成IO请求后,将会通知线程IO操 ...

  5. [Bullet3]三种碰撞检测及实现

    官方文档:http://bulletphysics.org 开源代码:https://github.com/bulletphysics/bullet3/releases API文档:http://bu ...

  6. Vimium -为键盘而生

    The hacker's browser. 作为一个Chrome的忠实使用者,从开发人员工具到谷歌的扩展程序(extensions)[插件],这些都在无形之中提高我们的工作效率. N年前的一天,看到了 ...

  7. Java之路——名词解释(一)

    一.开篇 许多人在初接触Java的时候,都会被各种Java的英文缩写名词给弄得头晕脑胀.看一个技术,内容里又会有一堆其他的技术名词,看了半天不知所云.尝试去查一下这些名词的解释,除了非常学术性的解释之 ...

  8. Log4net 日志记录配置信息

    <log4net> <!--配置日志的级别,低于此级别的就不写到日志里面去 OFF.FATAL.ERROR, WARN, INFO, DEBUG, ALL --> <ro ...

  9. iOS开发之Runtime常用示例总结

    经常有小伙伴私下在Q上问一些关于Runtime的东西,问我有没有Runtime的相关博客,之前还真没正儿八经的总结过.之前只是在解析第三方框架源码时,聊过一些用法,也就是这些第三方框架中用到的Runt ...

  10. unity脚本的运行顺序以及单例的实现

    unity引擎把所有脚本先行编译后,在运行的时候一批,一批的函数进行执行. unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> St ...