springboot成神之——ioc容器(依赖注入)
springboot成神之——ioc容器(依赖注入)
spring,maven环境请自行搭建,本文重点放在ioc容器的工作原理
spring的ioc功能
一个对象的实例和字段的值被一个特殊的对象从外部注入,这个特殊的对象就是ioc
ioc容器包含了所有的Spring Beans
文件目录结构

lang
// 定义此接口,用来作为Chinese和English类的公共实现接口
package com.springlearn.learn.lang;
public interface Language{
public String getGreeting();
public String getBye();
}
Chinese
// 具体功能实现类
package com.springlearn.learn.langimpl;
import com.springlearn.learn.lang.Language;
public class Chinese implements Language{
@Override
public String getGreeting(){
return "你好";
}
@Override
public String getBye() {
return "再见";
}
}
English
// 具体功能实现类
package com.springlearn.learn.langimpl;
import com.springlearn.learn.lang.Language;
public class English implements Language{
@Override
public String getGreeting(){
return "Hello";
}
@Override
public String getBye() {
return "Bye bye";
}
}
GreetingService
// 此类就是ioc容器中的一个bean,内部属性通过外部注入
// @Service的作用就是声明他是一个bean
// @Autowired的作用就是依赖注入
package com.springlearn.learn.bean;
import com.springlearn.learn.lang.Language;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class GreetingService{
@Autowired
private Language language;
public GreetingService() {
}
public void sayGreeting() {
String greeting = language.getGreeting();
System.out.println("Greeting:" + greeting);
}
}
MyRepository
// @Repository声明此类是一个bean,主要用于内部数据注入到其他bean中,比如MyComponent.java
package com.springlearn.learn.bean;
import java.util.Date;
import org.springframework.stereotype.Repository;
@Repository
public class MyRepository{
public String getAppName(){
return "Hello my first Spring App";
}
public Date getSystemDateTime() {
return new Date();
}
}
MyComponent
// @Component声明这是一个bean,并且字面上表示这个类是个组件依赖于其他的bean,也就是上面定义的Repository
package com.springlearn.learn.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyComponent {
@Autowired
private MyRepository repository;
public void showAppInfo(){
System.out.println("Now is:" + repository.getSystemDateTime());
System.out.println("App Name" + repository.getAppName());
}
}
AppConfiguration
// 此类是一个定义bean和集中bean的文件
// @Configuration声明这个类是定义bean的
// @ComponentScan扫描bean目录
// @Bean(name="language") 定义了一个名为language的bean,只要访问此bean就会自动调用getLanguage方法
package com.springlearn.learn.config;
import com.springlearn.learn.lang.Language;
import com.springlearn.learn.langimpl.Chinese;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com.springlearn.learn.bean"})
public class AppConfiguration{
@Bean(name="language")
public Language getLanguage() {
return new Chinese();
}
}
DemoApplication
// 此类是程序的启动类
// AnnotationConfigApplicationContext会调用配置类
// 通过调用context.getBean("language");会创建Chinese类实例
// context.getBean("greetingService");greetingService其中的@Autowired会将language实例注入
package com.springlearn.learn;
import com.springlearn.learn.bean.GreetingService;
import com.springlearn.learn.bean.MyComponent;
import com.springlearn.learn.config.AppConfiguration;
import com.springlearn.learn.lang.Language;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfiguration.class);
System.out.println("-------------");
Language language = (Language)context.getBean("language");
System.out.println("Bean Language: "+ language);
System.out.println("Call language.sayBye(): "+ language.getBye());
GreetingService service = (GreetingService) context.getBean("greetingService");
service.sayGreeting();
System.out.println("----------");
MyComponent myComponent = (MyComponent) context.getBean("myComponent");
myComponent.showAppInfo();
}
}
运行结果
-------------
Bean Language: com.springlearn.learn.langimpl.Chinese@258d79be
Call language.sayBye(): 再见
Greeting:你好
----------
Now is:Sun Sep 09 13:48:45 CST 2018
App NameHello my first Spring App
springboot成神之——ioc容器(依赖注入)的更多相关文章
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- Ioc容器依赖注入-Spring 源码系列(2)
Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostPr ...
- Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入
总结 在SpringApplication#createApplicationContext()执行时创建IOC容器,默认DefaultListableBeanFactory 在AbstractApp ...
- 【Spring】IoC容器 - 依赖注入
前言 上一篇文章已经学习了[依赖查找]相关的知识,这里详细的介绍一下[依赖注入]. 依赖注入 - 分类 因为自己是基于小马哥的脉络来学习,并且很认可小马哥梳理的分类方式,下面按照小马哥思想为[依赖注入 ...
- Spring IOC源代码具体解释之容器依赖注入
Spring IOC源代码具体解释之容器依赖注入 上一篇博客中介绍了IOC容器的初始化.通过源代码分析大致了解了IOC容器初始化的一些知识.先简单回想下上篇的内容 加载bean定义文件的过程.这个过程 ...
- 控制反转(Ioc)和依赖注入(DI)
控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...
- 控制反转IOC与依赖注入DI【转】
转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...
- 控制反转IOC与依赖注入DI - 理论篇
学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...
- Spring学习-理解IOC和依赖注入
最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...
随机推荐
- Selenium with Python 007 - Cookie处理
Webdriver 读取.添加.删除cookie信息基本用法 获得Cookie信息:driver.get_cookies() 添加Cookie信息:driver.add_cookie(cookie_d ...
- Django进阶Admin篇 - admin基本配置
django admin 是django自带的一个后台app,提供了后台的管理功能. 基础知识点: 一.认识ModelAdmin 管理界面的定制类,如需扩展特定的model界面,需要从该类继承 二.注 ...
- File工具类
package cn.itcast.bos.utils; import java.io.IOException; import java.net.URLEncoder; import sun.misc ...
- CountDownLatch闭锁
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完 ...
- 20-THREE.JS 混合材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- C#学习历程(二)[基础知识]
c#中类型的转换 1.Convert.ToInt32(string s) 这个方法的返回值是int类型,要用int类型的变量接收 如: string strNum=Console.ReadLine() ...
- Some Interview Questions About Python
一大波超链接即将袭来 Django认证流程 Python实现阶乘 Python文件处理 Python统计日志文件IP出现次数 JSON数据解析 JSON数据解析2 买卖股票的最佳时期 读取一个大文件比 ...
- javascript 继承的两种方式
js中继承可以分为两种:对象冒充和原型链方式 一.对象冒充包括三种:临时属性方式.call()及apply()方式1.临时属性方式 代码如下: function Person(name){ t ...
- 说说geotools中坐标转换那点事
概述: 本文说说geotools中坐标转换的那点事情,以WGS84和web墨卡托相互转换为例. 效果: 转换前 转换后 单个Geometry转换 实现代码: package com.lzugis.ge ...
- HAWQ取代传统数仓实践(十八)——层次维度
一.层次维度简介 大多数维度都具有一个或多个层次.例如,示例数据仓库中的日期维度就有一个四级层次:年.季度.月和日.这些级别用date_dim表里的列表示.日期维度是一个单路径层次,因为除了年-季度- ...