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();
}
}
版权所有.转发请注明出处,谢谢!