Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配),本文章将主要讲解着三种装配方式的使用。
条件:①Bean类必须有一个无参构造方法;②Bean类必须为属性提供setter方法。
在配置文件中,使用元素来为每个属性注入值
条件:Bean类必须提供有参构造方法
在配置文件中,使用元素来为参数注入值
package com.ssm.assemble;
import java.util.List;
public class User {
private String username;
private Integer password;
private List list;
/**
* 1.使用构造注入
* 1.1提供带所有参数的有参构造方法。
*/
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 + "]";
}
}
"constructorvalue1"
"constructorvalue2"
"setlistvalue1"
"setlistvalue2"
package com.ssm.assemble;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class XmlBeanAssembleTest {
public static void main(String[] args) {
// 定义配置文件路径
String xmlPath = "beans1.xml";
// 加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
// 构造方式输出结果
System.out.println(applicationContext.getBean("user1"));
// 设值方式输出结果
System.out.println(applicationContext.getBean("user2"));
}
}
由于基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。因此,Spring提供了对Annotation(注解)技术的全面支持。
package com.ssm.annotation;
public interface UserDao {
public void save();
}
package com.ssm.annotation;
import org.springframework.stereotype.Repository;
@Repository("userDao")
//@Repository("userDao")相当于配置文件中的:
public class UserDaoImpl implements UserDao{
@Override
public void save() {
System.out.println("userdao...save...");
}
}
package com.ssm.annotation;
public interface UserService {
public void save();
}
package com.ssm.annotation;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService")
//相当于配置文件中的:
public class UserServiceImpl implements UserService{
@Resource(name="userDao")
//当于配置文件中的:
private UserDao userDao;
public void save() {
//调用userDao中的save方法
this.userDao.save();
System.out.println("userservice....save...");
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
package com.ssm.annotation;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
@Controller("userController")
//相当于配置文件中的:
public class UserController {
@Resource(name="userService")
//当于配置文件中的:
private UserService userService;
public void save(){
this.userService.save();
System.out.println("userController...save...");
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
package com.ssm.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AnnotationAssembleTest {
public static void main(String[] args) {
// 定义配置文件路径
String xmlPath = "beans2.xml";
// 加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
// 获取UserController实例
UserController userController = (UserController) applicationContext.getBean("userController");
// 调用UserController中的save()方法
userController.save();
}
}
所谓自动装配,就是将一个Bean自动的注入到到其他Bean的Property中。 Spring的元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。autowire属性有5个值,其值及说明下表所示:
这里只需要在基于注解的装配配置文件(beans.xml)中把注解方式换成自动装配即可,具体代码如下:
运行效果和基于注解的装配一样
以上就是Spring中Bean的三种装配方式,其中我们需要重点掌握第二种基于注解的装配,它是我们日常工作最常用的一种装配。