Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配),本节将主要讲解这三种装配方式的使用.
基于XML的装配有两种:设值注入(Setter Injection)和构造注入(Constructor Injection)
在Spring实例化Bean的过程中,Spring首先会使用Bean的默认构造方法来实例 化Bean对象,然后通过反射的方式调用setter方法来注入属性值。因此,设值注入要求一个Bean必须满足以下两点要求。
Bean类必须提供一个默认的无参构造方法。
Bean类必须为需要注入的属性提供对应的setter方法。
在配置文件中,使用
元素来为每个属性注入值;而使用构造注入时,要配置文件里,需要使用元素的子元素来定义构造 方法的参数,可以使用其value属性(或子元素)来设置该参数的值。
案例
创建cn.ssm.assemble包
创建User.java
public class User {
private String username;
private Integer password;
private List list;
/**
* 1.使用构造注入
* 1.1提供带所有参数 的有参构造 方法
* @param username
* @param password
* @param list
*/
public User(String username,Integer password,List list){
super();
this.username=username;
this.password=password;
this.list=list;
}
/**
* 2.使用设值注入
* 2.1 提供默认空参构造方法;
* 2.2为所有属性提供setter方法
*
* */
public User(){
super();
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(Integer password) {
this.password = password;
}
public void setList(List list) {
this.list = list;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password=" + password +
", list=" + list +
'}';
}
}
创建beans5.xml
"constructorvalue1"
"constrctorvalue2"
"setlistvalue1"
"setlistvalue2"
创建测试类XmlBeanAssembleTest
public class XmlBeanAssembleTest {
public static void main(String[] args){
String xmlpath="cn/ssm/assemble/beans5.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlpath);
//构造方式输出结果
System.out.println(applicationContext.getBean("user1"));
//设值方式输出结果
System.out.println(applicationContext.getBean("user2"));
}
}
运行测试
基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。
@Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。
@Repository:用于将数据访问层(DAO)的类标识为Spring中的Bean 。其作用与@Component相同
@Service:用于将业务层(Service)的类标识为Spring中的Bean。
@Controller:用于将控制层(Controller)的类标识为Spring中的Bean
@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作
@Resource:其作用与Autowired一样。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型
@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。
案例
创建cn.ssm.annotation包,在该包中创建接口UserDao,并在接口中定义一个save方法。
UserDao接口
public interface UserDao {
public void save();
}
UserDao的实现类 UserDaoImpl
//使用@Repository注解将UserDaoImpl类标识为Spring中的Bean
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("userdao...save....");
}
}
使用@Repository注解将UserDaoImpl类标识为Spring中的Bean,其写法相当于配置文件中
创建UserService接口
public interface UserService {
public void save();
}
创建UserService实现类
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name="userDao")
private UserDao userDao;
@Override
public void save() {
//调用 userDao中的save方法
this.userDao.save();
System.out.println("userservice...save....");
}
}
使用@Service注解将UserServiceImpl类标识为Spring中的Bean
使用@Resource注解标注在属性userDao上,这相当于配置文件中
创建控制器类UserController
@Controller("userController")
public class UserController {
@Resource(name="userService")
private UserService userService;
public void save(){
this.userService.save();
System.out.println("userController...save...");
}
}
创建beans6.xml
通过配置context:annotation-config开启注解处理器
通过
创建测试类 AnnotationAssembleTest.java
public class AnnotationAssembleTest {
public static void main(String[] args){
String xmlpath="cn/ssm/annotation/beans6.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlpath);
//获取UserController实例
UserController userController=(UserController)
applicationContext.getBean("userController");
userController.save();
}
}
输出结果:
userdao…save…
userservice…save…
userController…save…
所谓自动装配,就是将一个Bean自动的注入到到其他Bean的Property中。 Spring的元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。autowire属性有5个值,其值及说明下表所示:
测试案例
1.修改UserServiceImpl和UserController,分别在文件中增加类属性的setter方法
2.修改配置文件beans6.xml,在该配置文件中取消了注解的配置。userService和userController中的<bean>
元素中除了id和class属性外,还增加了autowire属性,并将其属性值设置为byName。
在默认情况下,配置文件中需要通过ref来装配Bean,但设置了autowire=“byName"后,Spring会自动寻找userService Bean中的属性,并将其属性名称与配置文件中定义的Bean做匹配。由于UserServiceImpl中定义了userDao属性及其setter方法,这与配置文件中id为userDao的Bean相匹配,所以Spring会自动地将id为userDao的Bean装配到id为userService的Bean中。