Spring的IOC,注入问题,包括自动注入的条件和前提

1. 前言

Spring的核心技术IOC(Intorol of Converse控制反转)的实现途径是DI(dependency Insert依赖注入)。而依赖注入(DI)的实现方式又有两种,xml方式和注解方式。如下图所示:
在这里插入图片描述

什么是属性注入

属性注入就是在实例化对象时,同时向对象中的属性进行相应的赋值。
即,通俗点说,属性注入就是给类中的属性赋值。

属性注入的方式

可以通过配置xml文档或者使用注解来实现属性的自动注入

通过xml文档

set注入和构造注入

set方法注入
  • 前提条件:需要在配置的类中有对应属性的set方法
<!--   set方法注入属性-->
    <bean id="user" class="com.liu.test.User">
        <property name="name" value="root"/>
        <property name="password" value="666666"/>
        <property name="uid" value="0000000001"/>
    </bean>
  • property 即属性
  • name 即属性名,是在类中要注入的属性的名称
  • value 要注入的值
  • ref 引用值,引用其他的bean

通过注解来实现属性的自动注入
先了解一下自动注入

自动注入

所谓spring自动注入,是指容器中的一个组件中需要用到另一个组件(例如聚合关系)时,依靠spring容器创建对象,而不是手动创建.

autowire属性
<bean id="person" class="class" autowire="*">

autowire属性有如下六个取值,他们的说明如下:

  1. No:即不启用自动装配。Autowire默认的值。
  2. byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。Spring IoC容器会在配置文件中查找id/name属性与被注入属性名的名字的bean,然后使用Set方法为其注入。(如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置)
  3. byType:通过属性的类型查找JavaBean依赖的对象并为其注入。Spring IoC容器会查找Class属性为与被注入属性相同的bean,使用Set方法为其注入。
  4. constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Set方法注入,而是使用构造子注入。
  5. autodetect:在byType和constructor之间自动的选择注入方式。
  6. default:由上级标签的default-autowire属性确定。
注解 使用场景 说明
@AutoWired 可以应用于构造函数,注解类型, 方法,方法中的参数,字段或属性 根据属性类型自动装配
@Qualifier 可以应用于类的任何元素,注解类型, 方法,方法中的参数,字段或属性 根据属性的名称注入要和
@Value 可以应用于,注解类型, 方法,方法中的参数,字段或属性 注入普通类型属性

@Autowired
加上属性上,表示这个属性被自动注入了

@Qualifier(value=“*”)
加上属性上,q是指定自动装配哪个类型的文件

@Value(“*”)
加上属性上,表示这个属性在生成的时候注入“*”的值

@Autowired
    //q是指定自动装配哪个类型的文件
    @Qualifier("bookDao2")
    private BookDao bookDao ;

3. 什么情况下要使用自动注入?

在我们学习完set注入和构造注入之后,我们可能会发现,要是某个类的引用属性,也是其他类的属性的时候,若我们使用大量的使用去给其他类的这个引用属性赋值,就会显得十分的冗余。如下所示:

<bean id="bookDao" name="bookDaoBM" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory">
        <property name="connectionNum" value="6"></property>
        <property name="databaseName" value="ltx"></property>
    </bean>


    <bean id="bookService" name="bookServiceBM bookEbi" class="com.service.impl.BookServiceImpl">
        <!--7.配置server 与dao的关系
        property 标签表示配置当ibean的属性
        name届性表示阅置哪一个具体的属性
        ref属性表示参照哪个bean

        相当于我声明了bookService中有bookDao这个类
        -->
        <property name="bookDao" ref="bookDao"></property>
    </bean>

上面的写法就很冗余,那么有简单的写法吗?当然有,这种简便的方法就是自动注入。

byName和byType自动注入的使用要求:

  • 必须依赖set()方法,也就是说只支持对set注入方式的简写。

具体的byName和byType的使用细节看 Spring中自动注入的两种方式

setter注入和构造器注入方式可以看spring学习----bean02:bean依赖注入、自动装配和集合注入

猜你喜欢

转载自blog.csdn.net/missgrass/article/details/129092499