Spring安全依賴查找

依賴查找安全性對比
依賴查找類型 表明實現 是否安全
單一類型 BeanFactory#getBean
ObjectFactory#getObject
ObjectProvider#getIfAvailable
集合類型 ListableBeanFactory#getBeansOfType
ObjectProvider#stream

實體類Rumenz.javahtml

package com.rumenz;
public class Rumenz{
    private Integer id;
    private String name;
    @Override
    public String toString() {
        return "Rumenz{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

BeanFactory#getBean 單一類型查找

package com.rumenz;



import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Map;


public class DemoApplication {

    public static void main(String[] args) {
         AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
         ac.register(DemoApplication.class); //沒有註冊Rumenz.class
         ac.refresh();
         //經過BeanFactory#getBean
         byBeanFactory(ac);
         ac.close();
    }

    private static void byBeanFactory(AnnotationConfigApplicationContext ac) {
        printBeanException("byBeanFactory",()->ac.getBean(Rumenz.class));
    }

    private static void printBeanException(String msg,  Runnable runnable) {
        System.err.println("from---->>>"+msg);
        try{
            runnable.run();
        }catch (Exception e){
            e.printStackTrace();
        }

    }


}

輸出java

因爲沒有註冊Rumenz.class,因此查找報錯,不安全
from---->>>byBeanFactory
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.rumenz.Rumenz' available

ObjectFactory#getObject 單一類型查找

package com.rumenz;



import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Map;


public class DemoApplication {

    public static void main(String[] args) {
         AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
         ac.register(DemoApplication.class);
         ac.refresh();

         //經過ObjectFactory#getObject
         byObjectFactory(ac);
         ac.close();
    }

    private static void byObjectFactory(AnnotationConfigApplicationContext ac) {
        ObjectProvider<Rumenz> beanProvider = ac.getBeanProvider(Rumenz.class);
        printBeanException("byObjectFactory",()->beanProvider.getObject());
    }
    private static void printBeanException(String msg,  Runnable runnable) {
        System.err.println("from---->>>"+msg);
        try{
            runnable.run();
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

輸出git

因爲沒有註冊Rumenz.class,因此查找報錯,不安全
from---->>>byObjectFactory
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.rumenz.Rumenz' available

ObjectProvider#getIfAvailable 單一類型查找

package com.rumenz;



import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Map;


public class DemoApplication {

    public static void main(String[] args) {
         AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
         ac.register(DemoApplication.class);
         ac.refresh();
         //經過ObjectProvider#getIfAvailable
         byObjectProvider(ac);
         ac.close();
    }

    private static void byObjectProvider(AnnotationConfigApplicationContext ac) {
        ObjectProvider<Rumenz> beanProvider = ac.getBeanProvider(Rumenz.class);
        printBeanException("byObjectProvider",()->beanProvider.getIfAvailable());
    }

    private static void printBeanException(String msg,  Runnable runnable) {
        System.err.println("from---->>>"+msg);
        try{
            runnable.run();
        }catch (Exception e){
            e.printStackTrace();
        }

    }


}

輸出github

不存在Rumenz.class,也不會報錯,安全
from---->>>byObjectProvider

ListableBeanFactory#getBeansOfType 集合查找

package com.rumenz;



import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Map;


public class DemoApplication {

    public static void main(String[] args) {
         AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
         ac.register(DemoApplication.class);
         ac.refresh();
         // 經過ListableBeanFactory#getBeansOfType 集合類型查找
         byListableBeanFactory(ac);


         ac.close();
    }

    private static void byListableBeanFactory(AnnotationConfigApplicationContext ac) {
        printBeanException("byListableBeanFactory",()->ac.getBeansOfType(Rumenz.class));

    }

    private static void printBeanException(String msg,  Runnable runnable) {
        System.err.println("from---->>>"+msg);
        try{
            runnable.run();
        }catch (Exception e){
            e.printStackTrace();
        }

    }


}

輸出spring

不存在Rumenz.class,也不會報錯,安全
from---->>>byListableBeanFactory

ObjectProvider#Stream 集合類型查找

package com.rumenz;



import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Map;


public class DemoApplication {

    public static void main(String[] args) {
         AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
         ac.register(DemoApplication.class);
         ac.refresh();
        

         // 經過ObjectProvider#stream
         byObjectProviderStream(ac);


         ac.close();
    }

    private static void byObjectProviderStream(AnnotationConfigApplicationContext ac) {
        ObjectProvider<Rumenz> beanProvider = ac.getBeanProvider(Rumenz.class);
        printBeanException("byObjectProviderStream",()->beanProvider.stream().forEach(System.out::println));
    }

    private static void printBeanException(String msg,  Runnable runnable) {
        System.err.println("from---->>>"+msg);
        try{
            runnable.run();
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}

輸出安全

不存在Rumenz.class,也不會報錯,安全
from---->>>byObjectProviderStream

WechatIMG8.png

源碼:https://github.com/mifunc/Spr...ide

原文: https://rumenz.com/rumenbiji/.htmlthis

相關文章
相關標籤/搜索