一.表现机制
当某个变量需要被赋值时,可以使用特定的语法,让Spring尝试从容器中找到合适的值,并自动完成赋值
最典型的表现就是添加@Autowired注解,Spring就会尝试从容器中找到合适的值为这个属性赋值
二.属性装配示例代码
1.先创建一个Spring组件扫描类
@Configuration
@ComponentScan("包名")
public class SpringConfig {
}
/*
*此类是配置类,将在启动时被加载
*此类配置了组件扫描,在被加载时将执行扫描
*/
2.创建另一个组件类(用于数据的交互类)
@Repository
public class UserMapper {
public void insert() {
System.out.println("UserMapper.insert() >> 将用户数据写入到数据库 中……");
}
}
/*
*此类是一个组件类
*在组件扫描的包找那个,且添加了组件注解@Repository
*这个注解表示该组件是操作数据的组件
*/
3.创建控制器类
@Controller
public class UserController {
@Autowired // 注意:此处使用了自动装配的注解
private UserMapper userMapper;
public void reg() {
System.out.println("UserController.reg() >> 控制器即将执行用户注册……");
userMapper.insert();
}
}
/*
*userMapper属性并未赋值,但是使用了@Autowired注解
*Spring框架会通过自动装配机制为此属性注入值
*如果注入成功,调用此属性的方法时将成功运行
*否则,就出现NPE
*/
4.创建测试类
public class SpringRunner {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
UserController userController = ac.getBean("userController",UserController.class);
userController.reg(); ac.close();
}
}
三.方法自动装配
Spring的自动装配机制还可以用在方法上:
如果一个方法是由Spring框架自动调用的(通常是构造方法或@Bean注解的方法),当这个方法被声明了参数时,Spring框架也会自动的尝试从容器中找到匹配的对象用于调用此方法
对方法的参数自动装配时,如果方法有多个参数,各个参数的先后顺序是不重要的
示例:
1.创建一个配置类
@Configuration
public class SpringConfig {
@Bean
public UserMapper userMapper() {
return new UserMapper();
}
@Bean
public UserController userController(UserMapper userMapper) {
UserController userController = new UserController();
userController.userMapper = userMapper; return userController;
}
}
首先,会根据需要装配的数据类型在Spring容器中统计匹配的Bean(对象)的数量
当匹配的Bean数量为0时,判断@Autowired注解的required属性值,这个属性默认值为true,即装配失败,项目启动时即抛出NoSuchBeanDefinitionException
我们需要将required的属性值设置为false,表示放弃自动装配,不会报告异常,后续直接使用此属性时,会报NPE
当匹配的Bean数量为1个,直接装配,且装配成功
当匹配的Bean数量超过1个,自动尝试按照名称进行装配(属性名要与beanName相同)
四.小结
1.当某个属性需要被注入值,且此值肯定存在于Spring容器中时,可以使用@Autowired注解,那么Spring框架就会自动为此属性注入值
2.如果某个方法是Spring调用的,当方法体中需要某个值,其次值存在于Spring容器中,可以将其声明为方法的参数,那么Spring框架会自动从容器中找到此值并且调用此方法
如果声明了多个参数,那么各参数的先后顺序是不重要的
3.自动装配的前提是Spring会自动创建此类的对象,否则Spring不可能为属性注入值,也不可能调用类中的方法
4.@Autowired的装配机制的表现是可以根据类型实现装配,并且,当匹配类型的Bean有多个时,还可以根据名称匹配,从而实现装配