Spring框架的四大原则:

  1)使用POJO进行轻量级和最小侵入式的开发。

  2)通过依赖注入和基于接口编程实现松耦合。

  3)通过AOP和默认习惯进行声明式编程。

  4)使用AOP和模板(template)减少模式化代码。

1.1依赖注入:

  控制反转(Inversion of Control - IoC)与依赖注入(dependency injection - DI)在Spring环境下是同等的概念。

  控制反转是通过依赖注入实现的。所谓的控制反转指的是:容器负责创建对象和维护对象间的依赖关系。

  依赖注入的主要目的是实现解耦,添加一个功能一般有两种方式:继承父类、组合另一个具有该功能的类。

  组合相对于继承父类来说,其耦合度是较低的。

  2017/12/28补充:(来源自SpringBoot揭秘+快速构建微服务体系一书)

    实际上IOC与DI并不是等同的概念,DI属于IoC的一个模式,IOC由DI与DL(Dependency Lookup)组成。

    DI是软件实体被动接受其依赖的其他组件被IoC注入;DL则是当前软件实体主动去某个服务注册地查找其依赖的那些服务。

    DL,更多见于主动通过容器获取Bean。

    而使用SpringIoC容器时,往往使用的是DI(也有一部分DL的逻辑存在)

  SpringIoC容器(ApplicationContext)负责创建Bean,并通过容器将功能类Bean注入到需要的Bean中去。Spring通过XML、注解、java配置实现IoC(DI)。

  XML、注解、java配置都是配置元数据。

    元数据:用来描述数据的数据。

  元数据不具备任何可执行能力,只能通过外界代码来对元数据进行解析然后赋予特定的功能。Spring容器解析这些配置元数据后进行Bean的初始化、配置和管理依赖。

  

  声明Bean的注解:

    @Component:没有明确的角色

    @Service:  在业务逻辑层使用

    @Repository:在数据访问层(dao)使用

    @Controller:在MVC层使用

    注:上面四个注解功能是一样的,不过为了业务区分采用了不同的表现。

  注入Bean的注解:

    @Autowired  :Spring提供的注解

    @Inject    :JSR-330提供的注解

    @Resource  :JSR-330提供的注解

    上面三个注解一般可用于set方法或者属性上,但是一般习惯写法是用在属性上。

基于注解的Bean的初始化与依赖注入,Spring容器选用AnnotationConfigApplicationContext。

功能类Bean:

@Service
public class FunService {
public String sayHello(String word) {
return "Hello " + word + " !";
}
}

  注:@Service声明当前FunService类是一个Spring管理的Bean,其中使用@Component、@Service、@Repository、@Controller是等效的。

使用功能类的Bean:

@Service
public class UseFunService {
@Autowired
private FunService FunService; public String sayHello(String word) {
return FunService.sayHello(word);
}
}

  注:@Service声明当前类是Spring管理的Bean

    @Autowired将FunService的实体注入到UseFunService中,使其能够使用其中的方法。

配置类:

@ComponentScan("learn.learn.spring.ioc")
@Configuration
public class Diconfig { }

  注:@ComponentScan,自动扫描指定包下的所有使用@Component、@Controller、@Service、@Repository的类,并注册为Bean。

运行:

public class App
{
public static void main( String[] args ) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(Diconfig.class);// UseFunService UseFunService =
context.getBean(UseFunService.class);// System.out.println(UseFunService.sayHello("di")); context.close();
} }

  注:1)使用AnnotationConfigApplicationContext作为Spring的容器,接受一个配置类作为参数。

    2)获取声明配置的UseFunService的Bean。

结果:

1.2java配置:

  Java配置是Spring4.x推荐使用的配置方式,可以完全取代XML配置;java配置也是springboot中推荐使用的配置方式。

  java配置是通过@Configuration和@Bean实现的。

    @configuration声明当前类是一个配置类,相当于Spring配置的XML文件。

    @Bean注解在方法上,声明当前方法返回值为一个Bean。

  注:实际工作中java配置的方式往往与XML实现的方式一样,主要是用于数据库的配置等一些常用的数据配置,当然你也可以根据业务需要来做自己需要的配置方式。

  一般配置原则:全局配置使用java配置(如数据库,MVC等配置);业务Bean使用注解配置(@Component、@Controller、@Service、@Repository)。

  

示例:

功能类的Bean:

public class FunctionService {
public String say(String word) {
return "Hello" + word + " !";
}
}

  注:此处没有使用@Service声明Bean

使用功能类Bean:

//
public class UseFunctionService {
//
FunService FunService; public void set(FunService FunService) {
this.FunService = FunService;
} public String say(String word) {
return FunService.sayHello(word);
}
}

  注:1:此处没有使用@Service声明Bean

    2:此处没有使用@Autowired注解注入Bean

配置类:

@Configuration//
public class DiConfig {
@Bean
public FunctionService functionService() {
return new FunctionService();
} @Bean
public UseFunctionService useFunctionService() {
return new UseFunctionService();
} }

  注:1:@Configuration表明此类是一个Spring配置类,类似于XML文件。

运行:

public class App {
public static void main( String[] args ) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(DiConfig.class);// UseFunctionService useFunctionService =
context.getBean(UseFunctionService.class); System.out.println(useFunctionService.say("di")); context.close();
} }

结果:

  

Spring基础知识之依赖注入的更多相关文章

  1. C#基础知识之依赖注入

    目录 1 IGame游戏公司的故事 1.1 讨论会 1.2 实习生小李的实现方法 1.3 架构师的建议 1.4 小李的小结 2 探究依赖注入 2.1 故事的启迪 2.2 正式定义依赖注入 3 依赖注入 ...

  2. ASP.NET Core 2.2 基础知识(一) 依赖注入

    依赖: 类A用到了类B,我们就说类A依赖类B.如果一个类没有任何地方使用到,那这个类基本上可以删掉了. public class Test { private MyDependency md = ne ...

  3. Spring基础知识

    Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...

  4. spring 控制反转与依赖注入原理-学习笔记

    在Spring中有两个非常重要的概念,控制反转和依赖注入:控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上将Spring容器管理的依赖对象注入到应用之中: 所谓依赖 ...

  5. Spring源码剖析依赖注入实现

    Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java   版权声明:本文为博主原 ...

  6. Spring基础知识及bean的配置

    IOC与DI: IOC(inversion of control):其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源.作为回应,容器适时的返回资源.而应用了IOC之后,则是 ...

  7. (转)Spring读书笔记-----Spring核心机制:依赖注入

    Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...

  8. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)

    前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...

  9. Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入

    Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...

随机推荐

  1. Appscan 配置中登录管理的问题

    一.登录录制时录制为空 这个问题出现在 9.0.3.5 版本上,当时同事一录制为空,我录制却ok,后来发现他录制前将谷歌浏览是打开状态,谷歌浏览关闭掉,再使用外部浏览器Chrome进行会话录制后,问题 ...

  2. 对于Mongodb数据库的学习

    数据库主要分为两种 1.关系型数据库(RDBS) 2.非关系性数据库(NoSQL) 而MongoDB就是非关系型数据库里的一种 文档型数据库(BSON) 文档型数据库(BSON)顾名思义就是以文档的形 ...

  3. C#动态获取鼠标坐标

    .Net封装好的方法 int Control.MousePosition.X;int Control.MousePosition.Y; 用API方法 using System.Runtime.Inte ...

  4. Eclipse中启动tomcat从console跳回servers

  5. ThreeJS的特效合成器和后期处理通道

    最近要写个 web 交互式发光可交互的框架.没查到啥好资料,自己一个人摸索了很久,有些失望,可是毕竟是探索过的东西,所以做个记录,怀念我过去好多天掉的青丝(捂脸).我在前面那篇博客里面已经介绍了如何让 ...

  6. enote笔记法(2)——why的使用

    章节:why的使用 用法: why 概念|词汇(比概念更一般的形式的keyword)|短语|句子 用法1: why 概念|why keyword([比概念更一般的形式的keyword]) “why 概 ...

  7. Spring学习笔记(二)之装配Bean

    一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...

  8. yum安装jdk

    安装步骤: 1.首先查看java的版本有哪些  :  yum -y list java* 2. 安装目标jdk版本(我选择的是1.7) :   yum -y install java-1.7.0-op ...

  9. 【MAVEN】maven系列--pom.xml标签详解

    pom文件作为MAVEN中重要的配置文件,对于它的配置是相当重要.文件中包含了开发者需遵循的规则.缺陷管理系统.组织.licenses.项目信息.项目依赖性等.下面将重点介绍一下该文件的基本组成与功能 ...

  10. 深入理解 Android 消息机制原理

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:汪毅雄 导语: 本文讲述的是Android的消息机制原理,从Java到Native代码进行了梳理,并结合其中使用到的Epoll模型予以介 ...