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

举报
zstar 发表于 2022/08/05 23:42:33 2022/08/05
【摘要】 自动装配 手动装配 为了说明如何使用自动装配,先用手动装配构建一个例子。 例子说明:创建一个User来控制一个Cat,使用Cat的shout方法。(一个人让自己的猫叫) 1.新建cat类 publ...

自动装配

手动装配

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

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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;
    }
    
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5.运行结果:
在这里插入图片描述
在这个例子里面,用xml对对象进行装配,bean标签的ref代表装配beans中已经注册过的对象。

byName按名称自动装配

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

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

  
 
  • 1
  • 2
  • 3

通过property标签进行装配。

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

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

  
 
  • 1

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

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

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

  
 
  • 1

将这个对象的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;
   }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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>

  
 
  • 1
  • 2

现在发现,即使把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"

  
 
  • 1
  • 2
  • 3

并开启注解支持:

<context:annotation-config/>

  
 
  • 1

完整文件头:

<?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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

  
 
  • 1
  • 2

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

@Autowired
private Cat cat;

  
 
  • 1
  • 2

完整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;
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

与@Qualifier配合使用

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

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

  
 
  • 1
  • 2

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

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

  
 
  • 1
  • 2
  • 3

拓展总结

除了@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";
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.成功输出结果
在这里插入图片描述

文章来源: zstar.blog.csdn.net,作者:zstar-_,版权归原作者所有,如需转载,请联系作者。

原文链接:zstar.blog.csdn.net/article/details/119516415

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。