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容器(依赖注入)的更多相关文章

  1. SpringBoot启动流程分析(六):IoC容器依赖注入

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  2. Ioc容器依赖注入-Spring 源码系列(2)

    Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostPr ...

  3. Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入

    总结 在SpringApplication#createApplicationContext()执行时创建IOC容器,默认DefaultListableBeanFactory 在AbstractApp ...

  4. 【Spring】IoC容器 - 依赖注入

    前言 上一篇文章已经学习了[依赖查找]相关的知识,这里详细的介绍一下[依赖注入]. 依赖注入 - 分类 因为自己是基于小马哥的脉络来学习,并且很认可小马哥梳理的分类方式,下面按照小马哥思想为[依赖注入 ...

  5. Spring IOC源代码具体解释之容器依赖注入

    Spring IOC源代码具体解释之容器依赖注入 上一篇博客中介绍了IOC容器的初始化.通过源代码分析大致了解了IOC容器初始化的一些知识.先简单回想下上篇的内容 加载bean定义文件的过程.这个过程 ...

  6. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  7. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

  8. 控制反转IOC与依赖注入DI - 理论篇

    学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...

  9. Spring学习-理解IOC和依赖注入

    最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...

随机推荐

  1. 10074 启用开发者模式 for vs2015rc

    1. 关于VS2015RC 有两个版本,它们都包含了Windows 10 SDK. 社区版:免费,可以开发Windows UAP应用.iOS和Android应用.在 帮助->注册产品 菜单可以登 ...

  2. 教你10步闯进google play排行榜前列

        1.正视最高榜单的价值 我们需要了解排名对你的游戏的价值,进入前20名你的游戏获得每日至少1万5千的安装量,而前10名获得至少2万5千的安装量.通过奖励性广告网络而获得这些流量需要你每日支付至 ...

  3. 【scala】循环

    1.while循环 Scala的while循环跟其他语言并没有很大差别. var i = 0; while(i<args.length){ println(i); i+=1; } Scala也有 ...

  4. jgit - java实现git操作

    在做一个项目中需要用到远程仓库,本来想使用svn的,但是svn的java api网上的资料很少,而且与git相比,svn显得笨重且不方便,因此放弃了svn转而使用git.java git api - ...

  5. 哥伦比亚大学 Columbia University Image Library (COIL-20) 数据集

    转自:http://blog.csdn.net/garfielder007/article/details/51480820,这个人博客里面有不错的 数据集,http://blog.csdn.net/ ...

  6. 【个人吐槽】C、Delphi、C#、java 摘抄

    作为个人的一个感受就是,在win平台上开发软件,别再他妈的用MFC了,不适合新手,上手太难.你妹,实现一个半透明的功能,一堆代码,而C#就他妈的几行话.靠. 似乎很多人都觉得Delphi已经没落了.过 ...

  7. 使用python对文件中的数值进行累加

    问题描述: 一个文件由若干条记录组成,记录的格式为:“num1 num2”,有时候,需要统计文件中num1对应的num2的总值.处理问题的思路 用传说中的python来处理,很方便.几行代码就可以了. ...

  8. 核PCA投影平面公式推导

    样本方差推导 样本方差公式\[S = \frac{1}{n-1}\sum_{i=1}^n(x_i-\mu_i)^2\] 扩展开来得到\[S = \frac{1}{n-1}[(X-\frac{1}{n} ...

  9. 51nod 1995 三子棋

    小的时候大家一定玩过“井”字棋吧.也就是在九宫格中,只要任意行.列,或者任意连续对角线上面出现三个相同的,就能获胜.现在小明和小花也在玩三子棋,但是他们不是在九宫格里,而是在3×4的格子里面.现在小明 ...

  10. rabbitmq java

    package com.enniu.rabbitmq; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.AMQP.BasicPr ...