Spring学习笔记(三)使用xml方式及注解方式进行自动装配

本文详细介绍了Spring中的自动装配机制,包括XML方式的byName、byType和constructor三种方式,以及注解@Autowired和@Resource的使用方法和异同。通过实例解析了如何在Spring配置文件中进行自动装配设置,并强调了注解使用前的准备工作和复杂环境下的装配策略。
摘要由CSDN通过智能技术生成

概念

Spring中有三种装配方式:

1.xml中显式配置

2.java中显式配置

3.隐式自动装配。自动装配是Spring满足bean依赖的一种方式,Spring会在上下文中自动寻找并自动给bean装配属性

自动装配方式

  • no(default):不自动装配,需使用ref参数注

  • byName:根据名称自动装配

  • byType:根据类型自动装配

  • constructor:根据构造函数自动装配

示例

①使用xml方式装配

1.新建两个实体类Bond和User,Bond被User依赖引用

public class Bond {
    public void price() {
        System.out.println("rise");
    }
}
public class User {
    private Bond bond;
    private String name;
    
    //自动生成set、get、toString方法
}

2.编写Spring配置文件ApplicationContext.xml,使用参数ref注入bean

 <bean id="bond" class="com.xia.pojo.Bond"/>
 <bean id="user" class="com.xia.pojo.User">
     <property name="bond" ref="bond"/>
     <property name="name" value="张三"/>
 </bean>

3.测试

public class Test1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        User user = (User) context.getBean("user");
        user.getBond().price();
    }
}

1.使用byName方式自动装配

修改配置文件ApplicationContext.xml,添加参数autowire=“byName”,省去ref参数注入bean,自动注入对象必须要有set 方法

使用byName方式后,会自动在容器上下文查找和自己bean对象类中set方法里的值所对应的bean id,若配置文件中注册的bean id相同,则自动配置,保证bean的id唯一且bean和自动注入的属性的set方法中的值一致即可

 <bean id="bond" class="com.xia.pojo.Bond"/>

 <bean id="user" class="com.xia.pojo.User" autowire="byName">
     <property name="name" value="张三"/>
 </bean>

2.使用byType方式自动装配

修改配置文件ApplicationContext.xml,添加参数autowire=“byType”自动注入对象必须要有set 方法

使用byName方式后,会自动在容器上下文查找和自己bean对象属性类型相对应的bean,若bean类型相同,则自动配置。不需要保证bean id相对应,bean id甚至可以省略,但必须保证该类型全局唯一,否则报错

 <bean id="bond" class="com.xia.pojo.Bond"/>

 <bean id="user" class="com.xia.pojo.User" autowire="byType">
     <property name="name" value="张三"/>
 </bean>

3.使用constructor自动装配

修改配置文件ApplicationContext.xml,添加参数autowire=“constructor”,需要自动注入的Bean对象类中可以省去set方法

 <bean id="bond" class="com.xia.pojo.Bond"/>

 <bean id="user" class="com.xia.pojo.User" autowire="constructor">
     <property name="name" value="张三"/>
 </bean>

②使用注解自动装配

注解使用前提

1.在Spring配置文件的命名空间中导入context约束

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

2.开启注解支持【重点!易忘】

<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"
    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自动装配

修改配置文件,bean中的依赖等属性不需再进行配置

 <bean id="bond" class="com.xia.pojo.Bond"/>
 <bean id="user" class="com.xia.pojo.User"/>

在需要自动注入的对象类属性或者set方法上添加注解@Autowired,也可以省去set方法,前提是该自动装配的属性在IoC容器中存在,注意配置文件中id要和对象类属性名称相同,规则类似于byName,根据名称查询

public class User {
    @Autowired
    private Bond bond;
    
    private String name;
    
    //自动生成set、get、toString方法
}

@Autowired存在一个属性required,若配置**@Autowired(required=false)** ,则说明该对象可以为null;默认required为true,即必须存在对象,不可为空值。使用注解@Nullable同样可以标记该方法/字段/参数允许为null

public class User {
    @Autowired(required=false)
    private Bond bond;
    
    private String name;
    
    //自动生成set、get、toString方法
}

若@Autowired自动装配环境较为复杂,单独一个注解@Autowired不可正常自动装配,即同时注册了多个相同类型bean,不再满足byName规则时,可以配合使用注解@Qualifier来指定一个bean id进行注入

public class User {
    @Autowired
    @Qualifier(value = "bond")
    private Bond bond;
    
    private String name;
    
    //自动生成set、get、toString方法
}

使用注解@Resource自动装配

java的注解实现Bean注入。与注解@Autowired使用方法类似,在对象属性上添加注解@Resource即可使用,同样配置中不需手动写入值

 <bean id="bond" class="com.xia.pojo.Bond"/>
 <bean id="user" class="com.xia.pojo.User"/>
public class User {
    @Resource
    private Bond bond;
    
    private String name;
    
    //自动生成set、get、toString方法
}

注解@Resource默认先通过byName的方式查找,若找不到则通过byType的方式实现。两个都找不到就会报错。

与注解@Autowired搭配@Qualifier类似,在自动装配环境复杂导致难以满足byName或byType的规则时,可以通过设置@Resource的属性name来指定一个bean id来进行自动装配

public class User {
    @Resource(name = "bond")
    private Bond bond;
    
    private String name;
    
    //自动生成set、get、toString方法
}

@Autowired与@Resource的异同

  • 都可通过在对象属性上添加注解进行自动装配
  • @Autowired默认通过byType的规则装配,要求该对象必须存在不为空(但可以设置required属性为false使之允许为空),若想使用名称装配可以结合@Qualifier注解进行使用
  • @Resource先通过byName的规则查找,找不到名称相对应的就通过byType的规则实现,都找不到就报错(但可以通过设置name属性指定bean id实现)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值