Spring中使用注解来实现自动装配Bean | Spring系列(五)

2,112 阅读3分钟

这是我参与更文挑战的第15天,活动详情查看: 更文挑战


相关文章

Spring系列:Spring系列


使用注解实现自动装配

  • 上一篇文章我们讲解了Spring自动装配的几种方式,其实在实际开发中,我们用的最多的是使用注解来实现装配。
一、@Autowired

①这里首先说明一个点,尽量不要使用idea自动创建的beans头文件引入,需要补全,不然会报错: 在这里插入图片描述 ②补充引入文件头:

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

③xml:开启属性注解支持

	<!--开启属性注解支持-->
    <context:annotation-config/>

    <bean id="car" class="entity.Car"/>
    <bean id="house" class="entity.House"/>
    <bean id="person" class="entity.Person"/>

④实体类:

public class Person {
    @Autowired
    private Car car;
    @Autowired
    private House house;

    private String name;
    private int age;
    private String like;

    public Car getCar() {
        return car;
    }

    public House getHouse() {
        return house;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getLike() {
        return like;
    }
}
public class Car {
    public void getName(){
        System.out.println("我是一辆车!");
    }
}
public class House {
    public void getName(){
        System.out.println("我是一栋房子!");
    }
}

⑤测试类:

public class TestAnonatation {
    public static void main(String[] args) {
        ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml");
        Person person = Context.getBean("person",Person.class);

        person.getCar().getName();
        person.getHouse().getName();
    }
}

⑥执行结果: 在这里插入图片描述 ⑦总结:

  • 使用了@Autowired之后,可以省略Person类中的set方法,简化了代码量
  • @Autowired(required = false) 默认是true,对象不允许为null,false表示对象可以为null
  • @Autowired 其实就相当于byType自动装配,是根据类型来自动装配的
二、@Qualifier
  • @Qualifier是组合注解,不可以单独使用
  • 配合@Autowired来指定byName()装配
	@Autowired
    @Qualifier(value = "car")
    private Car car;
    @Autowired
    @Qualifier(value = "house")
    private House house;
  • 注意这个,可以直接点到xml的指定位置上去! 在这里插入图片描述
  • 执行结果: 在这里插入图片描述
三、@Resource

①xml:

	@Resource(name = "car")
    private Car car;
    @Resource
    private House house;

②执行结果: 在这里插入图片描述

③总结:

  • 指定name时,以byName为准,同时,xml中id不能为空!
  • 不指定时,默认以byName为准,不成功以byType为准!
  • 都失败报错!
四、@Autowired与@Resource异同

@Autowired与@Resource异同:

  • @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。

  • @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

  • @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

  • 它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName


路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah