Spring bean的自动装配

<bean>元素的autowire属性负责自动装配<bean>标签定义Javabean的属性。这样做可以省去很多配置Javabean属性的标签代码,使代码整洁、美观。

    1.按bean名称装配

    <bean>元素的byName属性以属性名区分自动装配。在容器中寻找与JavaBean的属性名相同的JavaBean,并将其自动装配到Javabean中。

    【例】按Bean名称自动装配User
    创建User类

public class User {
    private String name;
    private int age;
    private String sex;    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}

创建Manger类

public class Manger {
    private User user;
 
    public User getUser() {
        return user;
    }
 
    public void setUser(User user) {
        this.user = user;
    }
}

配置applicationContext.xml

<bean id="user" class="com.shw.User">
    <property name="name" >
        <value>小强</value>
    </property>
    <property name="age" >
        <value>25</value>
    </property>
    <property name="sex" >
        <value>男</value>
    </property>
</bean>
<bean autowire="byName" id="manger" class="com.shw.Manger"></bean>

创建测试类

public static void main(String[] args) {
        //加载applicationContext.xml
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取实例
        Manger manger=(Manger) context.getBean("manger");
        //调用方法
        System.out.println("姓名:"+manger.getUser().getName());
        System.out.println("年龄:"+manger.getUser().getAge());
        System.out.println("性别:"+manger.getUser().getSex());
    }

2.按bean类型装配

spring以bean类型区分自动装配,这次容器匹配的不再是bean名称。容器会自动寻找与JavaBean的属性类型相同的Javabean的定义,并将其注入到需要自动装配的JavaBean中。

【例】按bean类型自动装配User
将Manger类的User对象的属性修改为us

public class Manger {
    private User us;
 
    public User getUser() {
        return us;
    }
 
    public void setUser(User user) {
        this.us = user;
    }
}

修改applicationContext.xml

<bean autowire="byType" id="manger" class="com.shw.Manger"></bean>

小结:

  • byname的时候,需要保证所有bean的id唯一,并且这个bean需要和注入的属性的set方法的值一致
  • bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和注入的属性的类型一致

使用注解实现自动配置:

jdk1.5支持的注解,Spring2.5就支持注解了!

要使用注解须知:

  1. 导入约束 context约束

  2. 配置注解的支持:

<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>

@Autowired

直接在属性上用即可!也可以在set方式上使用!

使用Autowired我们可以不用使用Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在且符合名字(ByName)

科普:

@Nullable   字段标记了这个注解,说明这个字段可以为null
public @interface Autowired {
    boolean required() default true;
}

测试代码:

public class People {
    //如果显式的定义了AutoWired的required属性为false,说明这个对象可以为null,否则不允许为空
    @Autowired(required = false)
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候、我们可以使用@Qualifier(value = "xxx")去配合@Autowired的使用,指定一个唯一的bean对象注入

@Autowired注解

public class people{
@Autowired
private Cat cat;
@Autowired
@Qualifier(value = "dog")
private Dog dog;
private String name;
}

@Resource注解

public class people{
@Resource(name="cat")
private Cat cat;
@Resource
private Dog dog;
}

小结

@Resource和@Autowired的区别:

  • 都是用来自动装配的,都可以放在属性字段上
  • @Autowired通过byType的方式实现,而且必须要求这个对象存在!【常用】
  • @Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!
    • 执行顺序不同:@Autowired通过byType的方式实现 @Resource默认通过byname的方式实现

3.在spring中还有另外3种自动装配方式,通过设置autowire的不同属性值来实现。

(1)no属性

这是autowire采用的默认值,它采用自动装配。

(2)constructor属性

通过构造方法的参数类型自动装配。

(3)autodetect属性

首先会使用constructor方式来自动装配,然后使用byType方式。

转载:https://blog.csdn.net/dwenxue/article/details/80660959

           https://www.cnblogs.com/MrKeen/p/12028963.html

原文地址:https://www.cnblogs.com/hetaoyuan/p/12508663.html