Spring IoC依賴注入:Spring提供了哪些依賴注入模式和類型呢?

Spring 容器最基本最基本的接口就是BeanFactory。BeanFactory負責配置,建立、配置Bean,其中有一個子接口ApplicationContext,也被稱爲Spring上下文。容器同時還管理這Bean和Bean之間的依賴關係
app


Spring IoC容器的實現,從根源上是BeanFactory,可是真正做爲一個能夠獨立使用的IoC容器的仍是DefaultListableBeanFactory所以能夠說DefaultListableBeanFactory是整個Spring IoC的始祖ide


上一篇文章簡單闡述Spring的依賴查找方式ui

  • 經過Bean 名稱查找.  this

    Object getBean(String name)spa

  • 經過Bean 的類型查找  code

    <T> T getBean(Class<T> requiredType)orm

  • 經過Bean 的名稱+類型組合查找xml

    <T> T getBean(String name, Class<T> requiredType)對象

  • 經過註解查找blog

    Map<String, Object> getBeansWithAnnotation(Class<? extendsAnnotation> annotationType)


若是說BeanFactory 是Spring 的心臟,那麼ApplicationContext就是完美的身軀,繼承BeanFactory接口,除了包含BeanFactory的全部功能以外。在國際化、資源訪問(如:URL和文件)、事件傳播等方面進行了良好支持

圖片

在獲取ApplicationContext實例後,就能夠像BeanFactory同樣調用getBean(beanName)返回Bean了。ApplicationContext的初始化和BeanFactory有一個重大的區別:BeanFactory在初始化容器時,並未實例化Bean,直到第一次訪問某個Bean時才實例化目標Bean;而ApplicationContext則在初始化應用上下文時就實例化全部單實例的Bean,經過ApplicationContext的依賴樹圖,不難發現Spring Bean的依賴注入來源

  • 自定義的Bean

  • 依賴注入Bean  (如:內建依賴 BeanFactory)

  • 容器內建依賴 Bean (如:容器內建 Environment)


依賴注入案例

























public class UserRepository {    private Collection<User> users;  // 自定義 Bean    private BeanFactory beanFactory; // 內建非 Bean 對象(依賴)    private ObjectFactory<ApplicationContext> objectFactory;     public Collection<User> getUsers() {        return users;    }    public void setUsers(Collection<User> users) {        this.users = users;    }    public void setBeanFactory(BeanFactory beanFactory) {        this.beanFactory = beanFactory;    }    public BeanFactory getBeanFactory() {        return beanFactory;    }    public ObjectFactory<ApplicationContext> getObjectFactory() {        return objectFactory;    }    public void setObjectFactory(ObjectFactory<ApplicationContext> objectFactory) {        this.objectFactory = objectFactory;    }}

圖片





















public class DependencyInjectionDemo {
   public static void main(String[] args) {        // 啓動 Spring 應用上下文        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-injection-context.xml");
       // 依賴來源一:自定義 Bean        UserRepository userRepository = applicationContext.getBean("userRepository", UserRepository.class);
       // 依賴來源二:依賴注入(內建依賴)        System.out.println(userRepository.getBeanFactory());
       ObjectFactory<ApplicationContext> userFactory = userRepository.getObjectFactory();        System.out.println(userFactory.getObject() == applicationContext);
       // 依賴來源三:容器內建 Bean        Environment environment = applicationContext.getBean(Environment.class);        System.out.println("獲取 Environment 類型的 Bean:" + environment);    }}

圖片

相關文章
相關標籤/搜索