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

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

  • 相关阅读:
    如何调试PHP程序
    Win10系统80端口被pid=4的System进程占用 -- 解决方法
    初用DataGrip,连接后看不到自己创建的数据库的问题
    AJAX实现跨域的三种方法
    Webstrom (或Phpstrom)使用git(oschina-码云)
    EXCEL 数字+E+数字 自动识别为指数形式的解决办法
    解决安装office2013时提示已安装相同版本的office
    将excel导入mysql(使用navicat)
    mysql按汉语拼音首字母排序
    SQL查询语句去除重复行
  • 原文地址:https://www.cnblogs.com/geningchao/p/6628113.html
Copyright © 2011-2022 走看看