Spring基础知识之依赖注入

Spring框架的四大原则:

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

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

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

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

1.1依赖注入:

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

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

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

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

  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);//1

        UseFunService UseFunService =
                context.getBean(UseFunService.class);//2

        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:

//1
public class UseFunctionService {
   //2
    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//1
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);//1

        UseFunctionService useFunctionService =
                context.getBean(UseFunctionService.class);

        System.out.println(useFunctionService.say("di"));

        context.close();
    }

}

结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏史上最简单的Spring Cloud教程

Java并发编程:JMM和volatile关键字

Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU...

2029
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-22总结转换流,随机访问流,合并流,序列化流,Properties

(3)转换流: package cn.itcast_04; import java.io.BufferedWriter; import java.io.IOEx...

3897
来自专栏专注 Java 基础分享

深入理解Java内部类

     内部类就是定义在一个类中的另外一个类,是一种从属关系。在没有实际了解内部类之前,我始终困惑,为什么要在一个类中定义另外一个类,这不是增加代码结构复杂度...

2318
来自专栏Java编程

Java抽象类与接口的区别

很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。

97811
来自专栏小筱月

ES6常用知识点小结

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。

972
来自专栏everhad

札记:Java异常处理

异常概述 程序在运行中总会面临一些“意外”情况,良好的代码需要对它们进行预防和处理。大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如...

1898
来自专栏LuckQI

学习Java基础知识,打通面试关七

761
来自专栏微信公众号:Java团长

Spring AOP是什么?你都拿它做什么?

上一篇文章中,我对Spring源码进行了分析讨论,此处不再赘述,有兴趣的同学可以看看向Spring大佬低头——大量源码流出解析,本文是对上一篇文章的一个补充。回...

632
来自专栏Java3y

JSP第三篇【JavaBean的介绍、JSP的行为--JavaBean】

什么是javaBean JavaBean就是一个普通的java类,也称之为简单java对象--POJO(Plain Ordinary Java Object),...

3246
来自专栏C/C++基础

C++ struct与union

编码运行环境:VS2012+Win32+Debug Win32既表示运行平台是Windows 32bits操作系统,又表示生成32bits的应用程序。

471

扫码关注云+社区