zoukankan      html  css  js  c++  java
  • Spring初识(通过小实例清晰认识Spring)

    1.spring架构:

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

    2.spring架构图:

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

        2.2AOP面向切面编程

         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();
    }
    
    }

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

  • 相关阅读:
    Good Bye 2014 B. New Year Permutation(floyd )
    hdu 5147 Sequence II (树状数组 求逆序数)
    POJ 1696 Space Ant (极角排序)
    POJ 2398 Toy Storage (叉积判断点和线段的关系)
    hdu 2897 邂逅明下 (简单巴什博弈)
    poj 1410 Intersection (判断线段与矩形相交 判线段相交)
    HDU 3400 Line belt (三分嵌套)
    Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)
    Codeforces Round #179 (Div. 2) B. Yaroslav and Two Strings (容斥原理)
    hdu 1576 A/B (求逆元)
  • 原文地址:https://www.cnblogs.com/geningchao/p/6628113.html
Copyright © 2011-2022 走看看