Spring依赖注入

简介: Spring依赖注入

Spring的依赖注入


Spring中有几种依赖注入的方式?


从大的范围来说就是:手动注入和自动注入


手动注入


手动注入是我们最开始学习spring的时候使用的,因为对于初学者来说那更容易理解。


set注入


<bean name="userService" class="com.qijian.service.UserService">
  <property name="orderService" ref="orderService"/>
</bean>


构造方法注入


<bean name="userService" class="com.qijian.service.UserService">
  <constructor‐arg index="0" ref="orderService"/>
</bean>


使用命名空间注入


c名命空间和p名命空间不能直接使用需要导入xml约束。


@Data
public class User {
    private String name;
    private int age;
}


C:xmlns:c="http://www.springframework.org/schema/c"


<bean id="user1" class="com.qijian.pojo.User" c:name="qijianc" c:age="18"/>


P:xmlns:p="http://www.springframework.org/schema/p"


<bean id="user" class="com.qijian.pojo.User"
              p:name="qijian"
              p:age="18"
        />


自动注入


xml的autowire自动注入


在xml中,可以定义一个Bean时去指定这个bean的自动注入模式


byType,byName,constructor,default,no


<bean id="userService" class="com.luban.service.UserService" autowire="byType"/>


表示Spring会自动的给userService中所有的属性自动赋值(不需要这个属性上有

@Autowired注解,但需要这个属性有对应的set方法)。


Spring在通过byName的自动填充属性时流程是:


找到所有set方法所对应的XXX部分的名字

根据XXX部分的名字去获取bean


Spring在通过byType的自动填充属性时流程是:


获取到set方法中的唯一参数的参数类型,并且根据该类型去容器中获取bean

如果找到多个,会报错。


Spring在通过constructor的自动填充(假设只有一个构造方法


此时就可以不写set方法了,当某个bean是通过构造方法来注入时,spring利用


构造方法的参数信息从Spring容器中去找bean,找到bean之后作为参数传给构造方法,从而实例化得到一个bean对象,并完成属性赋值(属性赋值的代码得程序员来写)。


其他

no,表示关闭autowire


default,表示默认值,我们一直演示的某个bean的autowire,而也可以直接在标签中设置autowire,如果设置了,那么标签中设置的autowire如果为default,那么则会用标签中设置的autowire。


注意:XML中的autowire控制的是整个bean的所有属性,而@Autowired注解是直接写在某个属性、某个set方法、某个构造方法上的。


@Autowired注解相当于XML中的autowire属性的注解方式的替代。


从本质上讲,@Autowired注解提供了与autowire相同的功能,但是拥有更细粒度的控制和更广泛的适用性。


为什么我们平时都是用的@Autowired注解呢?而没有用上文说的这种自动注入方式呢?


@Autowired是更细粒度的控制(XML中的autowire控制的是整个bean的所有属性,而@Autowired注解是直接写在某个属性、某个set方法、某个构造方法上的。)


如果一个类有多个构造方法,那么如果用XML的autowire=constructor,你无法控制到底用哪个构造方法,而你可以用@Autowired注解来直接指定你想用哪个构造方法。同时,用@Autowired注解,还可以控制,哪些属性想被自动注入,哪些属性不想,这也是细粒度的控制。但是@Autowired无法区分byType和byName,@Autowired是先byType,如果找到多个则byName。


@Autowired注解的自动注入

@Autowired注解可以写在:


  1. 属性上:先根据属性类型去找Bean,如果找到多个再根据属性名确定一个
  2. 构造方法上:先根据方法参数类型去找Bean,如果找到多个再根据参数名确定一个
  3. set方法上:先根据方法参数类型去找Bean,如果找到多个再根据参数名确定一个


为什么@Autowired不支持静态字段或属性的注入?


@Component
@Scope("prototype")
public class OrderService {
}


@Component
@Scope("prototype")
public class UserService  {
  @Autowired
  private static OrderService orderService;
  public void test() {
    System.out.println("test123");
  }
}


UserService和OrderService都是原型Bean,假设Spring支持static字段进行自动注

入,那么现在调用两次


UserService userService1 = context.getBean("userService")
UserService userService2 = context.getBean("userService")


问此时,userService1的orderService值是什么?还是它自己注入的值吗?

答案是不是,一旦userService2 创建好了之后,static orderService字段的值就发生了修改了,从而出现bug。


相关文章
|
3月前
|
开发框架 Java Spring
Spring依赖注入以及使用建议
Spring依赖注入以及使用建议
52 0
|
3月前
|
XML Java 数据格式
Spring系列文章2:基于xml方式依赖注入
Spring系列文章2:基于xml方式依赖注入
|
1月前
|
XML Java 测试技术
Spring Boot中的依赖注入和控制反转
Spring Boot中的依赖注入和控制反转
|
3月前
|
XML Java 程序员
Spring6框架中依赖注入的多种方式(推荐构造器注入)
依赖注入(DI)是一种过程,对象通过构造函数参数、工厂方法的参数或在对象实例构建后设置的属性来定义它们的依赖关系(即与其一起工作的其他对象)。
50 3
|
3月前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
40 0
|
17天前
|
设计模式 自然语言处理 Java
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
15 2
|
30天前
|
缓存 Java Spring
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
|
2月前
|
设计模式 Java 测试技术
Spring Boot中的依赖注入详解
Spring Boot中的依赖注入详解
|
2月前
|
缓存 Java 测试技术
Spring 框架,不只是依赖注入和面向切面那么简单!
【6月更文挑战第25天】Spring框架超越DI和AOP,涵盖事务管理、数据访问抽象如`JdbcTemplate`、消息驱动支持如`@JmsListener`、缓存管理和测试工具。示例代码展示了其简化复杂性的能力,如自动事务处理、数据库操作及消息队列监听。Spring是构建高效企业级应用的全面解决方案。
28 4
|
2月前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves