Spring注入详解

2023-05-16

注入方式

构造函数注入

public class UserServiceImpl implents UserService{
    private UserDao userDao;
    
    @Autowire
    public UserServiceImpl(UserDao userDao){
        this.userDao = userDao;
    }
}

setter注入

public class UserServiceImpl implents UserService{
     private UserDao userDao;
     
     @Autowire
     public serUserDao(UserDao userDao){
         this.userDao = userDao;
     }
 }

基于字段注入

public class UserServiceImpl implents UserService{
     @Autowire
     private UserDao userDao;
 }

基于字段的依赖注入缺点

对于有final修饰的变量不好使

Spring的IOC对待属性的注入使用的是set形式,但是final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,这个是基于字段的依赖注入做不到的地方.只能使用基于构造函数的依赖注入的方式

掩盖单一职责的设计思想

与Spring的IOC机制紧密耦合

当你使用基于字段的依赖注入方式的时候,确实可以省略构造方法和setter这些个模板类型的方法,但是,你把控制权全给Spring的IOC了,别的类想重新设置下你的某个注入属性,没法处理(当然反射可以做到).

本身Spring的目的就是解耦和依赖反转,结果通过再次与类注入器(在本例中为Spring)耦合,失去了通过自动装配类字段而实现的对类的解耦,从而使类在Spring容器之外无效.

隐藏依赖性

当你使用Spring的IOC的时候,被注入的类应当使用一些public类型(构造方法,和setter类型方法)的方法来向外界表达:我需要什么依赖.但是基于字段的依赖注入的方式,基本都是private形式的,private把属性都给封印到class当中了.

无法对注入的属性进行校验

注入方法

@Autowired

Spring Bean注入一般采用@Autowired 注解,安装类型进行注入。

public @interface Autowired {
    boolean required() default true;
}

默认如果没有找到Bean,则会抛出异常,可以设置 required属性为false

如果有多个同一类型的Bean,在@Autowired时会抛出异常。

@Primary

如果有多个同类型Bean,指定主要的bean。不然注入时会抛出异常


@Bean
public Date d1() {
  return new Date() ;
}
@Bean
@Primary
public Date d2() {
  return new Date() ;
}

//会找到d2,因为指定了@Primary。
@Autowired
private Date date;

@Resoure

JavaEE注解,按照名称进行查找。

@Resource("d1")
private Date date

@Qualifier

按照名称查找bean。

@Autowired
@Qualifier("d1")
private Date date ;

筛选注入的Bean

在应用加了@Qualifier 注解的@Autowired注入时,只有在生成bean时,在@Bean注解声明的对象上,加上@Qualifier注解的bean才能被注入。

例如:

@Qualifier
@Bean
public Date d1() {
  return new Date() ;
}
@Bean
public Date d2() {
  return new Date() ;
}
//dates对象,会注入2个bean,因为此处没有加 @Qualifier, 所有bean都会被注入
@Autowired
private List<Date> dates = Collections.emptyList() ;


//dates对象,仅会注入1个bean,因为此处加了 @Qualifier, 所有注解了@Qualifier的bean才会被注入
//此处只有d1会被注入。
@Autowired
@Qualifier           //注意此处的注解
private List<Date> dates = Collections.emptyList() ;




Spring cloud @LoadBalanced

在使用Ribbon做负载均衡时,在配置RestTemplate时会加入如下注解:

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
  return new RestTemplate() ;
}

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}

在Ribbon的自动配置类LoadBalancerAutoConfiguration中,指明了只收集带有@LoadBalanced注解的RestTemplate对象。然后给对应RestTemplate设置拦截器来实现直接通过服务名就能调用接口。

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RestTemplate.class})
@ConditionalOnBean({LoadBalancerClient.class})
@EnableConfigurationProperties({LoadBalancerRetryProperties.class})
public class LoadBalancerAutoConfiguration {
    @LoadBalanced  //注意此处的注解
    @Autowired(
        required = false
    )
  //收集 加了  @LoadBalanced 的RestTemplate
    private List<RestTemplate> restTemplates = Collections.emptyList();
  
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring注入详解 的相关文章

随机推荐

  • 面试题集锦-SpringBoot

    spring boot 1 什么是 spring boot xff1f 2 为什么要用 spring boot xff1f 3 spring boot 核心配置文件是什么 xff1f 4 spring boot 配置文件有哪几种类型 xff
  • 面试题集锦-hibernate

    hibernate 1 什么是 ORM 框架 xff1f 2 为什么要使用 hibernate xff1f 3 hibernate 中如何在控制台查看打印的 SQL 语句 xff1f 4 hibernate 有几种查询方式 xff1f 5
  • 面试题集锦- spring cloud

    spring cloud 1 什么是 spring cloud xff1f 2 spring cloud 断路器的作用是什么 xff1f 3 spring cloud 的核心组件有哪些 xff1f 1 什么是 spring cloud xf
  • 面试题集锦-Mybatis

    Mybatis 1 MyBatis 中 和 的区别是什么 xff1f 2 MyBatis 有几种分页方式 xff1f 3 RowBounds 是一次性查询全部结果吗 xff1f 为什么 xff1f 4 MyBatis 逻辑分页和物理分页的区
  • 面试题集锦-RabbitMQ

    RabbitMQ 1 RabbitMQ 的使用场景有哪些 xff1f 2 RabbitMQ 有哪些重要的角色 xff1f 3 RabbitMQ 有哪些重要的组件 xff1f 4 RabbitMQ 中 vhost 的作用是什么 xff1f 5
  • 面试题集锦-kafka

    kafka 1 kafka 可以脱离 zookeeper 单独使用吗 xff1f 为什么 xff1f 2 kafka 有几种数据保留的策略 xff1f 3 kafka 同时设置了 7 天和 10G 清除数据 xff0c 到第五天的时候消息达
  • 面试题集锦-Zookeeper

    Zookeeper 1 zookeeper 是什么 xff1f 2 zookeeper 都有哪些功能 xff1f 3 zookeeper 有几种部署模式 xff1f 4 zookeeper 怎么保证主从节点的状态同步 xff1f 5 集群中
  • 面试题集锦-MySQL

    MySQL 模式主备切换方式方式 主从概述原理主节点从节点 方式 读写分离分库分表索引页页目录目录页B 43 树聚簇索引和非聚簇索引为什么InnoDB只有一个聚簇索引 xff0c 而不将所有索引都使用聚簇索引 xff1f 联合索引的最左前缀
  • 面试题集锦-Redis

    Redis 1 Redis 是什么 xff1f 都有哪些使用场景 xff1f 2 Redis 和 memcache 有什么区别 xff1f 3 Redis 为什么是单线程的 xff1f 4 什么是缓存穿透 xff1f 怎么解决 xff1f
  • Ubuntu18.04 qt5.14安装

    1 下载qt5 14 2 链接Index of archive qt 2 安装 打开终端 xff0c 进入安装包目录 xff0c 给安装包rwx权限 chmod 777 qt opensource linux x64 5 14 2 run
  • 面试题集锦-JVM

    JVM 1 说一下 JVM 的主要组成部分 xff1f 及其作用 xff1f 2 说一下 JVM 运行时数据区 xff1f 3 说一下堆栈的区别 xff1f 4 队列和栈是什么 xff1f 有什么区别 xff1f 5 什么是双亲委派模型 x
  • eclipse快捷键

    ctrl 43 t 查看接口实现类 ctrl 43 shif 43 t 快速查找某个类 包括jar中类 ctrl 43 shift 43 r 快速查找工作空间中项目的类
  • short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

    答 xff1a 对于short s1 61 1 s1 61 s1 43 1 由于1是int类型 xff0c 因此s1 43 1运算结果也是int 型 xff0c 需要强制转换类型才能赋值给short型 而short s1 61 1 s1 4
  • int和Integer有什么区别

    答 xff1a Java是一个近乎纯洁的面向对象编程语言 xff0c 但是为了编程的方便还是引入了基本数据类型 xff0c 但是为了能够将这些基本数据类型当成对象操作 xff0c Java为每一个基本数据类型都引入了对应的包装类型 xff0
  • Java 中 Equals和==的区别

    在谈论equals和 61 61 的区别前 xff0c 我们先简单介绍一下JVM中内存分配的问题 在JVM中 内存分为栈内存和堆内存 二者有什么区别呢 xff1f 当我们创建一个对象 xff08 new Object xff09 时 xff
  • 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

    答 xff1a 是值传递 Java语言的方法调用只支持参数的值传递 当一个对象实例作为一个参数被传递到方法中时 xff0c 参数的值就是对该对象的引用 对象的属性可以在被调用过程中被改变 xff0c 但对对象引用的改变是不会影响到调用者的
  • 什么情况下用+运算符进行字符串连接比调用StringBuilder对象的append方法连接字符串性能更好?

    经常在网上看到或者在周围听到有人说字符串拼接不要直接用 String 相加 xff0c StringBuilder 的效率要比 String 直接相加拼接要高 还有人常说 xff0c StringBuffer 是同步的 xff08 线程安全
  • 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。

    答 xff1a 通常我们定义一个基本数据类型的变量 xff0c 一个对象的引用 xff0c 还有就是函数调用的现场保存都使用内存中的栈空间 xff1b 而通过new关键字和构造器创建的对象放在堆空间 xff1b 程序中的字面量 xff08
  • Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

    Math round 11 5 的返回值是12 xff0c Math round 11 5 的返回值是 11 四舍五入的原理是在参数上加0 5然后进行下取整 所谓向上取整指当计算的结果不为整数时取大于计算结果的整数 向下取整指当计算的结果不
  • Spring注入详解

    注入方式 构造函数注入 public class UserServiceImpl implents UserService private UserDao userDao 64 Autowire public UserServiceImpl