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,其写法相当于配置文件中