spring小结一(三)

2014-11-24 11:07:23 · 作者: · 浏览: 2
Service 用于标注业务层组件
@Controller 用于标注控制层组件(如struts中的action)
@Repository 用于标注数据访问组件,即DAO组件
@Component 泛指组件,当组件不好归类时,可以用这个注解标注.
8.spring中的继承
Person类:
public class Person{
private String sex;
//..setter,getter方法略
}
student类:
public class Student extends Person{
..
}
配置文件:
man
配置文件中,parent属性为student在容器中继承person,如果去掉person是不行的.
四、面向切面编程
1.代理模式
(1)JDK动态代理
[java]
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler {
private Object targetObject; //代理的目标对象
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
//第一个参数设置代码使用的类加载器,一般采用跟目标类相同的类加载器
//第二个参数设置代理类实现的接口跟目标类使用相同的接口
//第三个参数设置回调对象,当代理对象的方法被调用时,会调用该参数指定对象的invoke方法
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代理类实例" + proxy.getClass());
System.out.println("方法名称" + method.getName());
if(args!=null && args.length>0) { //方法的参数值
for(int i=0; i
System.out.println("方法参数值" + args[i].toString());
}
Object returnvalue = null; //定义方法的返回值,没有返回值时是null
returnvalue = method.invoke(this.targetObject, args);//调用目标对象的方法
System.out.println("方法的返回值" + returnvalue);
return returnvalue;
}
return null;
}
}
总结:jdk动态代理必须具备四个条件:目标接口、目标类、拦截器、代理类
* 因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有.
* 利用JDKProxy方式必须有接口的存在
* invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型.
(2)CGLIB做代理
* 用CGlib生成代理类是目标类的子类
* 用CGlib生成代理类不需要接口
* 用CGlib生成的代理类重写了父类的各个方法
* 拦截器中的intercept方法内容正好就是代理类中的方法体
[java
//代码示例:需要添加cglib的jar包,可以在spring文档的lib下找到
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor{
private Object targetObject; //代理的目标对象
//创建目标对象的代理对象
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer(); //该类用于生成代理对象
enhancer.setSuperclass(this.targetObject.getClass()); //设置父类
enhancer.setCallback(this); //设置回调对象为本身
return enhancer.create(); //创建代理对象
}
/* obj 目标对象代理类的实例
* method 代理实例上调用父类方法的Method实例
* args 传入到代理实例上方法参数值的对象数组
* methodProxy 使用它调用父类的方法
*/
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
System.o