IoC容器,注解的方式加载bean之包扫描(scan)、自动装配
2018-02-25 本文已影响239人
在路上phper
上节课我们学习了使用注解的方式加载bean对象
如上面的代码 创建一个ApplicationContext上下文对象 并且传入配置类 我们在实际开发中配置类会有多个,如果手工去填写配置类,不是很方便 所以我们介绍一下第一种方法扫描包的方式
下面我们来到官方文档https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/core.html#beans-java-bean-annotation
根据文档我们写下代码
我们假设相关的bean以及自己写的一些业务类库放在com.jtthink.SpringLean下面 我们对这个包进行扫描
在MySpring中
image.png
运行结果
image.png
可以看见我们没有传入配置类文件,自动对我们包下面的类文件进行了扫描
我们还可以通过xml的方式加载 这里先不演示 官方文档里面有
接下来我们在SpringBean包下面创建一个newsService.java文件
目录如下
image.png
里面写入代码
image.png
下面我们将NewsService这个service集成到IoC容器中
所以我们创建在SpringBean里面创建一个NewsConfig配置类
目录如下
image.png
里面代码如下
image.png
接下来在MySpring里面做下调用
image.png
运行结果
image.png
以上代码即通过IoC容器进行调用
下面我们想一个问题 如果在NewsService里面想调用UserService里面内容怎么办?
我们要用到下面的内容
image.png
@AutoWired自动装配注解 可以非常方便的帮我们直接从IoC容器里面把相关的类装配进去
下面看下代码
NewsService里
image.png
在UserService里面加入一段测试代码
image.png
运行结果
image.png
以上就是@AutoWired自动装配的基本功能
接下来我们学习注解另一种写法
在NewsService里面讲自动装配代码去掉
image.png
运行结果
image.png
报错了 因为UserService类没有被加载进去
image.png
上面一张图片 在@AutoWired上面alt+enter会对代码进行优化 将自动装配注解打在了构造函数上
下面我们修改下代码
image.png
新增一个abc方法 并打入自动装配注解
运行结果
image.png
依然报错 以为注解打在了我们的方法上面
image.png
我们加入参数如上面 abc方法被自动执行了
运行结果
image.png
下面我们添加几行代码
image.png
运行结果
image.png
上面是在方法上打入@AutoWired注解产生的效果
上面就是使用注解的两种方式,在学习后面的spring mvc时候,经常会用到自动装配,我们在外部定义好类之后,都要通过上面的方式进行自动装配,而不是通过实例化new的方式到处创建我们无法控制的对象
接下来我们在学习一个知识点
在MyConfig中在写一个UserService方法
image.png
运行代码
image.png
可以看见报错了
是因为我们写入了@AutoWired 使其找不到到底要加载哪个bean
实际上@AutoWired在装配的时候是按照类型进行装配的
为了解决上面问题 我们学习下面的内容
image.png
@Qualifier注解 对我们多个同类型的bean进行区分
下面代码演示下
在MyConfig里面
image.png
在NewsService里面
image.png
运行结果
image.png
还有另外一种办法 如果不打入@Qualifier注解 返回的是一个UserService类型的数组
下面看下代码 首先我们将MyConfig中的@Qualifier注解注释掉
代码如下
image.png
修改下NewsService里面代码
image.png
运行结果
image.png
上面的这种方法官网中也有介绍 我们可以查看