Spring学习3:自动装配与注解开发

Posted Z|Star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习3:自动装配与注解开发相关的知识,希望对你有一定的参考价值。

自动装配

手动装配

为了说明如何使用自动装配,先用手动装配构建一个例子。

例子说明:创建一个User来控制一个Cat,使用Cat的shout方法。(一个人让自己的猫叫)
1.新建cat类

public class Cat {
    public void shout() {
        System.out.println("miao~");
    }
}

2.新建User类

public class User {
    private Cat cat;
    private Dog dog;
    private String str;

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public Cat getCat() {
        return cat;
    }
    
}

3.编写beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="user" class="com.kuang.pojo.User">
        <property name="cat" ref="cat"/>
    </bean>
</beans>

4.编写测试程序

import com.kuang.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = context.getBean("user",User.class);
        user.getCat().shout();
    }
}

5.运行结果:

在这个例子里面,用xml对对象进行装配,bean标签的ref代表装配beans中已经注册过的对象。

byName按名称自动装配

具体使用:
为了对比,先把上个例子中手动装配的部分筛选出来:

    <bean id="user" class="com.kuang.pojo.User">
        <property name="cat" ref="cat"/>
    </bean>

通过property标签进行装配。

现在,删除这一个标签,新增一个autowire。

    <bean id="user" class="com.kuang.pojo.User" autowire="byName"></bean>

这样,会实现和上面同样的效果。

原理分析:
byName是按照名称进行自动装配。
在beans.xml中,之前已经对cat进行创建。

 <bean id="cat" class="com.kuang.pojo.Cat"/>

将这个对象的id取名为cat,而在User类中,同样有这个cat。

//User.java
public class User {
   private Cat cat;
   private String str;

   public void setCat(Cat cat) {
       this.cat = cat;
   }

   public void setStr(String str) {
       this.str = str;
   }

   public Cat getCat() {
       return cat;
   }

}

Spring会自动将两者联系,进行装配。
也就是说,在这种模式下,如果修改其id为cat2,那么就会报错。

byType按类型自动装配

具体使用:
现在,把autowire的属性改为byType。

    <bean id="cat2" class="com.kuang.pojo.Cat"/>
    <bean id="user" class="com.kuang.pojo.User" autowire="byType"></bean>

现在发现,即使把cat对象的id改成cat2,依旧能正常运行。

原理分析:
byType是按类型自动装配,也就是通过class进行匹配。
在使用时需注意:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

使用注解进行自动装配

上面介绍了如何通过autowire属性值来实现自动装配,下面将记录如何用注解来实现自动装配。

简单使用

1.首先需要修改beans.xml文件,引入context文件头。

xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"

并开启注解支持:

<context:annotation-config/>

完整文件头:

<?xml version="1.0" encoding="UTF-8"?>
<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
http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd"
       xmlns:context="http://www.springframework.org/schema/context">

    <context:annotation-config/>
</beans>

2.在配置文件中创建cat和User两个对象。

    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="user" class="com.kuang.pojo.User"></bean>

3.给cat对象添加@Autowired注解,删除setCat()方法。

@Autowired
private Cat cat;

完整User.java:

package com.kuang.pojo;

import org.springframework.beans.factory.annotation.Autowired;

public class User {
    @Autowired
    private Cat cat;
    private String str;


    public void setStr(String str) {
        this.str = str;
    }

    public Cat getCat() {
        return cat;
    }

}

4.运行测试程序,效果一样。

与@Qualifier配合使用

遇到相同类,但不同id的多个对象,需要和@Qualifier配合使用。
例如

<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>

如果需要装配到cat2,可以这样注解。

@Autowired
@Qualifier(value = "cat2")
private Cat cat;

拓展总结

除了@Autowired注解可以实现自动装配外,@Resource也可以实现相同的效果。

两者的不同之处:
@Autowired先byType,后byName。
@Resource先byName,后byType。

注解开发

之前的例子均是在beans.xml文件中进行配置,现在不使用xml配置,采用纯Java的方式,即JavaConfig。

1.编写一个实体类,Dog

import org.springframework.stereotype.Component;

@Component //将这个类标注为Spring的一个组件,放到容器中!
public class Dog {
    public String name = "dog";
}

2.新建一个config配置包,编写一个MyConfig配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //代表这是一个配置类
public class MyConfig {
    @Bean //通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
    public Dog dog(){
        return new Dog();
    }
}

3.进行测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
        Dog dog = (Dog) applicationContext.getBean("dog");
        System.out.println(dog.name);
    }
}

4.成功输出结果

以上是关于Spring学习3:自动装配与注解开发的主要内容,如果未能解决你的问题,请参考以下文章

Spring 框架学习---- bean自动装配注解开发

Spring的自动装配及注解开发(“最易懂得Spring学习”)

Spring注解驱动开发 属性赋值与自动装配

Spring@Autowired注解与自动装配

Spring大略学习

Spring大略学习