首页 > 技术文章 > Spring第一篇【依赖注入】

kwdlh 2020-05-02 13:05 原文

依赖注入的方式

  • xml配置
    • 构造函数
    • setter
    • p命名空间
    • 自动装配(了解)
  • 注解
  • JavaConfig配置类

xml配置

构造函数

<bean id="userMapper" class="com.example.mapper.UserMapper">
</bean>

<bean id="userService" class="com.example.service.UserService">
    <constructor-arg type="com.example.mapper.UserMapper" ref="userMapper"></constructor-arg>
</bean>

setter

<bean id="userMapper" class="com.example.mapper.UserMapper">
</bean>

<bean id="userService" class="com.example.service.UserService">
    <property name="userMapper" ref="userMapper"></property>
</bean>

p命名空间

<!-- 相当于setter的优化(需要在Spring3版本以上才能使用),需要添加命名空间xmlns:p="http://www.springframework.org/schema/p" -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userMapper" class="com.example.mapper.UserMapper">
    </bean>

    <bean id="userService" class="com.example.service.UserService" p:userMapper-ref="userMapper">
    </bean>
</beans>

自动装配(了解)

  1. byName
<!--
    1.通过名字来自动装配(这个名字是从setter获得的)
    2.发现userService中有个叫userMapper的属性
    3.看看IOC容器中没有叫userMapper(即id="userMapper")的对象
    4.如果有,就装配进去
-->
<bean id="userMapper" class="com.example.mapper.UserMapper">
</bean>

<bean id="userService" class="com.example.service.UserService" autowire="byName">
</bean>
  1. byType
<!--
    1.通过类型来自动装配
    2.发现userService中有个叫userMapper的属性
    3.看看IOC容器userMapper类型的对象
    4.如果有且仅有一个,就装配进去
-->
<bean id="userMapper" class="com.example.mapper.UserMapper">
</bean>

<bean id="userService" class="com.example.service.UserService" autowire="byName">
</bean>

拓展:

  • 设置默认的自动装配
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-autowire="byName">

    <bean id="userMapper" class="com.example.mapper.UserMapper">
    </bean>

    <bean id="userService" class="com.example.service.UserService">
    </bean>
</beans>

注解

  1. 用在成员变量上
  2. 用在构造方法上
  3. 用在setter方法上
  4. 用在任意方法上

1是通过成员变量的类型实现自动装配,如果有多个bean符合,则再根据成员变量名称进行自动装配
2,3,4都是通过方法参数的类型实现自动装配,如果有多个bean符合,则再根据参数名称进行自动装配

拓展:

@Autowried(required=false),如果IOC容器中没有对应的bean则不进行装配,不会报错

JavaConfig配置类

//该注解表示这个类为javaConfig类
@Configuration
public class JavaConfig {

    //该注解表示向容器中注册一个叫做userMapper的对象
    @Bean("userMapper")
    public UserMapper getUserMapper(){
        return new UserMapper();
    }
    
}

推荐阅读