spring的依赖注入

一 点睛

控制反转和依赖注入在Spring环境下是等同的概念,控制反转是通过依赖注入实现的。所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系,而不是通过对象本身负责自己的创建和解决自己的依赖。

依赖注入的主要目的是为了解耦,体现一种组合的概念。如果你希望你的类具备某项功能的时候,是继承自一个具有次功能的父类好呢?还是组合另外一个具有此功能的类好呢?答案是不言而喻的,继承一个父类,子类和父类耦合了,组合另外一个类则使耦合度大大降低了。

Spring IoC 容器(ApplicationContext)负责创建Bean,并通过容器将功能Bean注入到你需要的Bean中。

Spring提供使用xml、注解、Java配置、groovy配置实现Bean的创建和注入。

无论是xml配置、注解还是Java配置,都被称为配置元数据,所谓元数据即描述数据的数据。元数据本身不具备任何可执行的能力,只有通过外界代码来对这些元数据进行解析后进行一些有意义的操作。Spring容器解析这些元数据进行Bean初始化,配置和管理依赖。

二 声明Bean的注解

  • @Component组件:没有明确的角色。

  • @Service:在业务逻辑层(service层)使用。

  • @Respository:在数据访问层(dao层)使用。

  • @Controller:在展现层(MVC->Spring MVC)使用。

三 注入Bean的注解

@Autowired:Spring提供的注解

@Inject:JSR-330提供的注解

@Resource:JSR-250提供的注解

@Autowired、@Inject、@Resource可注解set方法上或者属性上,一般习惯注解在属性上,优点是代码更少、层次更清晰。

四 实战

1 编写功能类的Bean

package com.wisely.highlight_spring4.ch1.di;

import org.springframework.stereotype.Service;

//使用@Service注解声明当前FunctionService类是Spring管理的一个Bean。
//使用@Component、@Service、@Respository、@Controller是等效的,可
//根据需要选择
@Service
public class FunctionService {
    public String sayHello(String word){
        return "Hello " + word +" !";
    }

}

2 使用功能类Bean

package com.wisely.highlight_spring4.ch1.di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service //使用@Service注解声明当前UseFunctionService类是Spring管理的一个Bean
public class UseFunctionService {
    //使用@Autowired 将FunctionService的实体Bean注入到UseFunctionService中
    //让UseFunctionService具备FunctionService的功能,此处使用JSR-330的Inject
    //注解或者JSR-250的@Resource注解等效
    @Autowired
    FunctionService functionService;
    
    public String SayHello(String word){
        return functionService.sayHello(word);
    }

}

3 配置类

package com.wisely.highlight_spring4.ch1.di;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration //@Configuration声明当前类是一个配置类。
//使用@ComponentScan,自动扫描包下所有@Component、@Service、@Respository、@Controller
//的类,并注册为Bean
@ComponentScan("com.wisely.highlight_spring4.ch1.di")
public class DiConfig {

}

4 运行类

package com.wisely.highlight_spring4.ch1.di;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
         //使用AnnotationConfigApplicationContext作为Spring容器,接收
         //一个配置类作为参数
         AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext(DiConfig.class);
         //获得声明配置UseFunctionService的Bean
         UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);
        
         System.out.println(useFunctionService.SayHello("world"));
        
         context.close();
    }
}

五 测试

Hello world !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值