Spring初识(通过小实例清晰认识Spring)
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(); } }
版权所有.转发请注明出处,谢谢!