Java Spring框架 II

Java Spring框架 II

自动装配

1.自动装配机制

● Spring的自动装配机制表现为:当某个量需要被赋值时,可以使用特定的
语法,使得Spring尝试从容器找到合适的值,并自动完成赋值
● 最典型的表现就是在类的属性上添加**@Autowired注解**,Spring就会尝试
从容器中找到合适的值为这个属性赋值
● 示例代码(1/4):

package cn.tedu.spring;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("cn.tedu.spring")
public class SpringConfig {
}

在这里插入图片描述
● 示例代码(2/4):

package cn.tedu.spring;
import org.springframework.stereotype.Repository;
@Repository
public class UserMapper {
public void insert() {
System.out.println("UserMapper.insert() >> 将用户数据写入到数据库
中……");
}
}

在这里插入图片描述
● 示例代码(3/4)

package cn.tedu.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Autowired // 注意:此处使用了自动装配的注解
private UserMapper userMapper;
public void reg() {
System.out.println("UserController.reg() >> 控制器即将执行用户注册……");
userMapper.insert(); // 注意:此处调用了userMapper属性的方法
}
}

在这里插入图片描述
● 示例代码(4/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();
}
}

● 代码解析:
– 在main()方法中,由于加载了SpringConfig类,根据SpringConfig上配置的
@ComponentScan,将执行组件扫描
– 由于UserMapper和UserController都在组件扫描的包范围内,所以Spring框架会自动调用它们的构造方法以创建对象,并把对象保管在Spring容器中
– 由于UserController中的userMapper属性添加了@Autowired注解,所以Spring框架会尝试为此属性注入值,且由于在Spring容器中存在UserMapper对象,则可以成功注入,使得userMapper属性是有值的
– 最终userController调用reg()方法时,实现过程中还通过userMapper调用了
insert()方法,整个执行过程中不会出错,在控制台可以看到对应的输出文本

● 除了对属性装配以外,Spring的自动装配机制还可以表现为:如果某个方
法是由Spring框架自动调用的(通常是构造方法,或@Bean方法),当
这个方法被声明了参数时,Spring框架也会自动的尝试从容器找到匹配的
对象,用于调用此方法

● 对方法的参数自动装配时,如果方法有多个参数,各参数的先后顺序是不
重要的

● 示例代码:
在这里插入图片描述

2.@Autowired的装配机制

● 关于@Autowired的装配机制,首先,会根据需要装配的数据的类型在
Spring容器中统计匹配的Bean(对象)的数量
● 当匹配的Bean数量为0个时,判断@Autowired注解的required属性值
– true(默认):装配失败,启动项目时即抛出NoSuchBeanDefinitionException – false:放弃自动装配,不会报告异常,后续直接使用此属性时,会出现NP

● 当匹配的Bean数量为1个时,将直接装配,且装配成功
● 当匹配的Bean数量为多个时:自动尝试按照名称实现装配(即:要求属
性名称与beanName相同)
– 存在与属性名称匹配的Spring Bean:装配成功
– 不存在与属性名称匹配的Spring Bean:装配失败,启动项目时即抛出
NoUniqueBeanDefinitionException

3.自动装配的小结

● [★★★★★] 当某个属性需要被注入值,且你肯定此值存在于Spring容器
中,你可以在属性上添加@Autowired注解,则Spring框架会自动为此属
性注入值

● [★★★★★] 如果某个方法是由Spring调用的,当方法体中需要某个值,
且你肯定此值存在于Spring容器中,你可以将其声明为方法的参数,则
Spring框架会自动从容器中找到此值并且于调用此方法,如果声明了多个
这样的参数,各参数的先后顺序是不重要的

● [★★★★★] 自动装配的前提是Spring会自动创建此类的对象,否则,
Spring不可能为属性赋值,也不可能调用类中的方法

● [★★★★★] @Autowired的装配机制的表现是可以根据类型实现装配,
并且,当匹配类型的Bean有多个时,还可以根据名称进行匹配,从而实
现装配,你需要熟记具体装配机制(由于篇幅较长,请参见前序说明)

4.其它

● 仍有一些与Spring框架相关的内容并未在本章节提及,主要包括:
Spring Bean的生命周期
读取properties配置文件
@Value注解
Spring AOP
● 以上未提及的内容将在后续需要使用时再补充讲解

我是将军;我一直都在,。!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值