cari
RumahJavajavaTutorialIOC的概念和分析

IOC的概念和分析

Jul 17, 2017 pm 01:36 PM

控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征,并非面向对象编程的专用术语。它与依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)并没有关系。

一 .IOC的概念 : IOC (Inversion of Control) 即控制反转,首先我们要搞清楚什么被反转了。java程序中的业务逻辑大都需要多个对象来协作完成,通常,每个对象在使用他的合作对象时,自己均要使用像new object() 这样的语法来完成合作对象的申请工作。这样一来对象间的耦合度就高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了。其实,IOC有个更合适的名字叫做DI (Dependency Injection),即依赖注入。

举个通俗的例子:假设现在有一个企业,企业需要有员工来完成相应的工作,那么企业就需要自己想方设法的根据需求寻找这方面的的人才来为公司工作。这是一种传统的方式,假设我们现在有了招聘网站,所有的人才都在网站上注册自己的信息,写明自己所拥有的技能和擅长的领域,当某个企业需要人才的时候,招聘网站就将特定的人才提供给公司,这样企业就只需要发布用人需求就可以了。这个例子中的企业可以认为是业务类EnterpriseService,人才是业务类完成工作所需要的协助类Employee。那么招聘网站就相当于IOC容器

<code class="java"><span class="hljs-number"><span style="color: #000000"><br/>1 . 传统获取对象的方式<br/></span></span></code>
public class EnterpriseService {

    Employee employee = new Employee();//自己通过new Object()方式获取对象public void service() {
        employee.doSomething();
    }
}
<code class="java"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-comment"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-params"><span class="hljs-number">2 . 使用IOC容器方式<br/></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
public class EnterpriseService {

    @Autowired
    Employee employee;//由容器完成对象的获取以及后续生命周期的管理public void service() {
        employee.doSomething();
    }
}

二 . DI 的原理分析
DI的原理很简单,就是基于java的反射机制实现的。我们在使用spring的时候都会有一个xml配置文件,这个文件用来描述Bean与Bean之间的依赖关系。IOC容器就是根据这个文件来维护管理所有的Bean,并提供Bean实例缓存,生命周期管理,Bean实例代理,事件发布,资源装载等高级任务。
IOC在启动的时候会通过Resource和ResourceLoader协助完成资源文件的读取和解析,并将文件中Bean的配置信息存储起来,然后在实例化该Bean的时候根据对应的类加载器,通过反射调用Bean的setter方法,为实例注入在配置文件中配置的属性来完成对象的创建。

三 . 相关内容
1 . 从注入方法上看,有三种注入方式:构造函数注入,属性注入,接口注入。spring支持构造函数注入和属性注入。
2 . BeanFactory是一个类工厂,它是spring框架最核心的接口,它提供了高级IOC的配置机制, BeanFactory使管理不同类型的java对象成为可能,ApplicationContext建立在BeanFactory基 础之上,提供了更多面向应用的功能,例如国际化支持和框架时事件体系。
3 . 通过BeanFactory启动IOC容器的时候并不会立即初始化配置文件中定义的Bean,初始化动作发生在第一次调用时。对于单例的Bean来说,BeanFactory会缓存Bean的实例(基于HashMap实 现),所以再次调用getBeans方法的时候会直接从IOC容器的缓存中获取Bean实例。
4 . ApplicationContext的主要实现类是ClassPathXmlApplication和 FileSystemXmlApplicationContext.而WebApplicationContext继承了ApplicationContext,是专门为web应用准备的,它允许从相 对于web应用根目录的路径中寻找和加载配置文件(使用Resource接口和ResourceLoaderb4987b795ffebe0a0f1dd3246bd0daaa接口实现)。WebApplicationContext中可以获得ServletContext引用,整个 WebApplicationContext将作为属性放置到ServletContext中,以便web应用环境可以访问 spring应用上下文。web应用中增加了三个bean的作用域:request,session,global session 。WebApplicationContext的初始化方式和BeanFactory和ApplicationContext有所区别,因为它需要ServletContext实例,即它必须在拥有web容器的前提下才能完成启动工作
5 .ApplicationContext的初始化和BeanFactory的初始化一个重大的区别是: ApplicationContext在初始化应用上下文的时候就实例化所有的Bean。另一个重大区别是:ApplicationContext会利用java反射机制自动识别出配置文件中定义的 BeanPostProcessor,InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将他们注册到应用上下文中,而BeanFactory需要在代码中手动通过 addBeanPostProcessor()方法进行注册
6 .对于scope="singleton"的Bean,spring会将bean放入IOC容器中缓存起来,将bean的引用返 回给调用者,并且继续对这些bean进行后续的生命管理。每次调用getBeans方法返回的是同一 个bean,而对于scope="prototype"的Bean,spring将bean返回给调用者后不再负责bean的生命 管,每次调用getBeans方法都会返回一个新的bean。

Atas ialah kandungan terperinci IOC的概念和分析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Bagaimanakah saya menggunakan Maven atau Gradle untuk Pengurusan Projek Java Lanjutan, Membina Automasi, dan Resolusi Ketergantungan?Bagaimanakah saya menggunakan Maven atau Gradle untuk Pengurusan Projek Java Lanjutan, Membina Automasi, dan Resolusi Ketergantungan?Mar 17, 2025 pm 05:46 PM

Artikel ini membincangkan menggunakan Maven dan Gradle untuk Pengurusan Projek Java, membina automasi, dan resolusi pergantungan, membandingkan pendekatan dan strategi pengoptimuman mereka.

Bagaimanakah saya membuat dan menggunakan perpustakaan Java Custom (fail JAR) dengan pengurusan versi dan pergantungan yang betul?Bagaimanakah saya membuat dan menggunakan perpustakaan Java Custom (fail JAR) dengan pengurusan versi dan pergantungan yang betul?Mar 17, 2025 pm 05:45 PM

Artikel ini membincangkan membuat dan menggunakan perpustakaan Java tersuai (fail balang) dengan pengurusan versi dan pergantungan yang betul, menggunakan alat seperti Maven dan Gradle.

Bagaimanakah saya melaksanakan caching pelbagai peringkat dalam aplikasi java menggunakan perpustakaan seperti kafein atau cache jambu?Bagaimanakah saya melaksanakan caching pelbagai peringkat dalam aplikasi java menggunakan perpustakaan seperti kafein atau cache jambu?Mar 17, 2025 pm 05:44 PM

Artikel ini membincangkan pelaksanaan caching pelbagai peringkat di Java menggunakan kafein dan cache jambu untuk meningkatkan prestasi aplikasi. Ia meliputi persediaan, integrasi, dan faedah prestasi, bersama -sama dengan Pengurusan Dasar Konfigurasi dan Pengusiran PRA Terbaik

Bagaimanakah saya boleh menggunakan JPA (Java Constence API) untuk pemetaan objek-objek dengan ciri-ciri canggih seperti caching dan malas malas?Bagaimanakah saya boleh menggunakan JPA (Java Constence API) untuk pemetaan objek-objek dengan ciri-ciri canggih seperti caching dan malas malas?Mar 17, 2025 pm 05:43 PM

Artikel ini membincangkan menggunakan JPA untuk pemetaan objek-relasi dengan ciri-ciri canggih seperti caching dan pemuatan malas. Ia meliputi persediaan, pemetaan entiti, dan amalan terbaik untuk mengoptimumkan prestasi sambil menonjolkan potensi perangkap. [159 aksara]

Bagaimanakah mekanisme kelas muatan Java berfungsi, termasuk kelas yang berbeza dan model delegasi mereka?Bagaimanakah mekanisme kelas muatan Java berfungsi, termasuk kelas yang berbeza dan model delegasi mereka?Mar 17, 2025 pm 05:35 PM

Kelas kelas Java melibatkan pemuatan, menghubungkan, dan memulakan kelas menggunakan sistem hierarki dengan bootstrap, lanjutan, dan pemuat kelas aplikasi. Model delegasi induk memastikan kelas teras dimuatkan dahulu, yang mempengaruhi LOA kelas tersuai

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.