随着咪咕门户新架构项目的推荐,在这个过程中。使我对spring中各种api有了更进一步的了解,最近接到领导要求,因为每次接口调用的过程中,写了大量重复的代码,所以这次写出一个公共方法对代码进行优化。
一、在这里首先使用lambda表达式和函数式接口,作为底层方法。通过在函数式接口中定义default方法作为公共逻辑,通过lambda表达式调用具体的接口,为了简化排版,这里我暂时先列出了一个测试demo,
public class TestLamda
{
public static void main(String[] args)
{
System.out.println(getResult()); ;
}
private static int getResult(){
Converter<String, Integer> convent = (String from) -> {
return Integer.parseInt(from);
};
return convent.convert("56");
}
}
@FunctionalInterface
public interface Converter<F, T>
{
default T convert(F from )
{
System.out.println("transform from String to int");
return transform(from);
}
public T transform(F string);
}
二、因为接口调用需要引用spring容器中的类对象,在进行对象引用的时候会使用ApplicationContext.getBean(Class<T> paramClass)方法。因为本人原来调用容器中的对象都是通过配置中的id进行调用,很少使用Class类的对象。通过这次使用对class类有了一个新的认识。我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象。我们自己无法生成一个Class对象(构造函数为private),而这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。 我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置
我们知道类加载器的工作机制是双亲委派模型,所以可以保证每个class对象的唯一性,我们知道java中有多个加载器,每个加载器能载入多个类,所以只要取得Class类对象,就可利用其getClassLoader()方法取得该类加载器的引用。现在明白了class对象的引用,现在回到spring中IOC容器(beanfactory)getbean()方法中,可以明白通过class对象加载spring中的对象和通过配置中的id去加载都可以引用到我们的对象
三、第二条中有一个坑点,就是如果你往spring容器中注入两次同一个类,则通过getbean(class<T> class)方法获取对象会报错,因为在jvm中有两个一样的对象,这是会容器会不知道加载哪一个类