【Spring— Spring中Bean的装配方式

2023年 7月 25日 65.3k 0

Bean的装配方式

    Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean装配方式,如基于XML的装配、基于Annotation(注解)的装配和自动装配等。

1.基于XML的装配

    Spring提供了两种基于XML的装配方式:设值注入(Setter Injection)和构造注入(Constructor Injection)。下面讲解如何在XML配置文件中使用这两种注入方式来实现基于XML的装配。在Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter()方法来注入属性值。因此,设值注入要求一个Bean必须满足以下两点要求: 

  • Bean类必须提供一个默认的无参构造方法。 
  • Bean类必须为需要注入的属性提供对应的setter()方法。

    使用设值注入时,在Spring配置文件中需要使用bean元素的子元素property来为每个属性注入值;

    使用构造注入时,在配置文件中需要使用bean元素的子元素constructor-arg来定义构造方法的参数,可以使用其value属性(或子元素)来设置该参数的值。

    【示例2-2】下面通过一个案例来演示基于XML方式的Bean的装配。

    (1)在项目chapter02的src目录下创建一个com.ssm.assemble包,在该包中创建User类,并在类中定义userName、password和list集合3个属性及对应的setter()方法。

User.java

package com.ssm.assemble;

import java.util.List;

/**
 * 功能描述
 *
 * @author: 衍生星球
 * @date: 2023年04月14日 8:24
 */

public class User {
    private String userName;
    private String password;
    private List list;

    /**
     * 1.使用构造注入
     * 1.1提供带所有参数的构造方法
     */
    public User(String userName,String password,List list) {
        super();
        this.userName = userName;
        this.password = password1;
        this.list = list;
    }
    @Override
    public String toString () {
        return "User[userName = " +userName+ ", password1 = "+password1+", list = "+list+"]";
    }
    /**
     * 2.使用设值注入
     * 2.1提供默认空参构造方法
     * 2.2为所有属性提供setter()方法
     */
    public User() {
        super();
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setList(List list) {
        this.list = list;
    }
}

    由于要使用构造注入,因此需要编写有参和无参的构造方法。

    (2)在Spring的配置文件application.xml中,增加通过构造注入和设值注入的方法装配User实例的两个Bean。

 	
        
        
        
            
                "constructorValue1"
                "constructorValue2"
            
        
    
    
        
        
        
            
                listValue1
                listValue2
            
        
    

     在上述代码中,constructor-arg元素用于定义构造方法的参数,其属性index表示其索引(从0开始),value属性用于设置注入的值,其子元素list为User类中对应的list集合属性注入值。

     然后又使用设值注入方法装配User类的实例,其中property元素用于调用Bean实例中的setter()方法完成属性赋值,从而完成依赖注入,而其子元素list同样为User类中对应的list集合属性注入值。

     (3)在com.ssm.assemble包中创建测试类XmlAssembleTest,在类中分别获取并输出配置文件中的user1和user2实例。

XmlAssembleTest.java

package com.ssm.assemble;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author: 衍生星球
 * @date: 2023年04月14日 9:08
 */

public class XmlAssembleTest {
    public static void main(String[] args) {
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.输出获得的实例
        System.out.println(applicationContext.getBean("user1"));
        System.out.println(applicationContext.getBean("user2"));
    }
}

     执行程序后,控制台输出结果如下。可以看出,已经成功地使用基于XML装配的构造注入和设值注入两种方式装配了User实例。

在这里插入图片描述

2.基于Annotation的装配

     在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中有很多Bean,就会导致XML配置文件过于臃肿,给以后的维护和升级工作带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。Spring中定义了一系列的注解,常用的注解如表所示。

在这里插入图片描述

     注意:虽然@Repository、@Service和@Controller的功能与@Component注解的功能相同,但为了使标注类本身用途更加清晰,建议在实际开发中使用@Repository、@Service和@Controller分别对实现类进行标注。

     【示例2-3】接下来,通过一个案例来演示如何通过这些注解来装配Bean。
     (1)在chapter02项目的src目录下创建一个com.ssm.annotation包,在该包中创建接口UserDao,并在接口中定义一个save()方法。

UserDao.java

package com.ssm.annotation;

public interface UserDao {
    public void save();
}

     (2)在com.ssm.annotation包中创建UserDao接口的实现类UserDaoImpl,该类需要实现接口中的save()方法。

UserDaoImpl.java

package com.ssm.annotation;

import org.springframework.stereotype.Repository;

/**
 * 功能描述
 *
 * @author: 衍生星球
 * @date: 2023年04月14日 9:43
 */
 //使用 @Repository 注解将 UserDaoImpl 类标识为 Spring 中的 Bean
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("userDao,save");
    }
}

     首先使用@Repository注解将UserDaoImpl类标识为Spring中的Bean,其写法相当于配置文件中

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论