装配SpringBean(四)--注解装配之组件扫描
前两篇文章我总结了通过XML方式装配bean的实现方式,虽然比较简单,但是需要配置很多,很多时候我们都会使用注解进行装配。使用注解的方式可以减少XML的配置,既能实现XML的功能,还提供了自动装配功能,更加有利于开发,这就是传说中的“约定优于配置”原则,简称CoC(Convention over Configuration).spring提供了两种方式让spring ioc容器发现bean:
- 组件扫描:通过定义资源的方式,让spring ioc容器扫描资源所在的包,从而装配bean;
- 自动装配:通过注解自动找到依赖关系中所需要的bean
本章先来总结一下组件扫描方式,下一篇文章总结自动装配。
组件扫描的实现步骤有三步:定义资源->扫描资源->获取资源,下面分这三步举例:
一、定义资源(使用@Component注解)
定义资源时需要用到注解@Component,component本意是组件的意思,当我们给一个类加上这个注解之后,就相当于定义了一个组件,供我们的项目所使用。下面来定义一个类,并用@Component进行装配。
@Component(value="coder")
public class Coder {
@Value("1")
private String id; @Value("张三")
private String coderName; @Value("23")
private Integer coderAge; @Value("30000")
private Integer coderSalary; public String getId() {
return id;
} public void setId(String id) {
this.id = id == null ? null : id.trim();
} public String getCoderName() {
return coderName;
} public void setCoderName(String coderName) {
this.coderName = coderName == null ? null : coderName.trim();
} public Integer getCoderAge() {
return coderAge;
} public void setCoderAge(Integer coderAge) {
this.coderAge = coderAge;
} public Integer getCoderSalary() {
return coderSalary;
} public void setCoderSalary(Integer coderSalary) {
this.coderSalary = coderSalary;
}
}
上面代码中红色加粗的部分:
1⃣️注解@Component:用@Component注解类,代表spring ioc在扫描的时候会生成这个类的bean实例,其中的value属性代表这个类在容器中的id,类似于XML方式的bean元素中定义的id属性。可以简写成@Component("coder")或者不写,不写的时候spring会使用自己的规则生成ID配置到容器中,规则是将类名首字母小写;
2⃣️注解@value:给成员变量注入值,类型会自动转换;
到这里,就完成了定义并将这个资源注入到spring ioc容器中了,那么容器怎么能获取这个资源呢,这就是需要我们进行配置的第二步,扫描资源。
二、扫描资源(使用@ComonentScan注解)
spring在扫描之前,我们是不是需要告诉它去哪里扫描?对的,我们需要定义一个配置类告诉它扫描的路径
@ComponentScan
public class PojoConfig { }
如同上面的代码,只需要定义一个配置类并加上注解@ComponentScan即可,这个注解表示spring会在当前包进行扫描,所以要想使我们定义的资源被扫描到,资源类和这个配置类就必须在同一个包下面才可以,这就有个弊端,一般来说我们的资源不会全部放在同一个包下,意味着要进行全局扫描,这可怎么办呢?还好这个注解它有两个配置项basePackages和basePackageClasses,前者代表扫描的包路径,可以是多个,后者代表扫描的类,也可以配置多个,这样我们就并用关心配置类是否和被扫描资源在同一个包下的问题了。
举个例子:
/**
* 注解@ComponentScan代表扫描当前包的路径,所以此类必须和pojo在用一个包下面
* 加上basePackageClasses和basePackages两个注解之后,可在整个项目中进行扫描找到所需的bean
*
*/
@ComponentScan(basePackageClasses = { Coder.class, CoderCard.class, CoderCardController.class, CoderCardService.class },basePackages= {"com.hyc.pojo","com.hyc.controller","com.hyc.service","com.hyc.tools"})
public class PojoConfig { }
通过这一步,spring容器就能将一个类装配成bean了,接下来就是我们怎么使用的问题,也就是第三步:获取资源。
第三步:获取资源(使用AnnotationConfigApplicationContext类)
获取资源的时候我们通过AnnotationConfigApplicationContext这个类实现,通过这个类将bean注册到spring容器当中。
public class SpringBeanTest {
public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext context = new AnnotationConfigApplicationContext(PojoConfig.class);
Coder coder = (Coder) context.getBean("coder");
System.out.println(coder.getCoderName());
}
}
上面加粗的代码就是获取bean的方式,下面来看一下结果,按理说输出的coderName应该就是上面配置的张三。

和预期结果一致,说明通过组件方式装配成功。
装配SpringBean(四)--注解装配之组件扫描的更多相关文章
- 装配SpringBean(五)--注解装配之自动装配
在spring ioc容器中,spring要先完成bean的定义和生成,然后需要需要注入的资源,在上一篇的扫描组件中就是这样实现的.而自动装配中我们只需要定义和生成一个bean,发现bean的过程将由 ...
- IoC容器-Bean管理注解方式(组件扫描配置)
4,开启组件扫描细节配置
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配
一.依赖注入的三种方式 在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...
- Spring IOC基础回顾 — 组件扫描和装配
目录 注解形式配置应用IOC 1. 组件自动扫描 2. 组件依赖:为bean添加注解,实现自动注入 3. Spring IOC应用小结 注解形式配置应用IOC 在类定义.方法定义.成员变量定义前使用, ...
- java之Spring(IOC)装配Bean(手动装配、自动装配、注解装配)
在上一篇控制反转中我们看到了依靠一个Bean文件来实现对代码的控制,可谓十分便捷,再也不用去实例化对象了,2333~~~ 1.手动装配 <bean id="todo" cla ...
- Spring装配Bean之组件扫描和自动装配
Spring从两个角度来实现自动化装配: 组件扫描:Spring会自动发现应用上下文中所创建的bean. 自动装配:Spring自动满足bean之间的依赖. 案例:音响系统的组件.首先为CD创建Com ...
- Spring装配bean--01组件扫描和自动装配
Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系 Spring提供了三种主要的装配机制: 在XML中进行显式配置 在Java中进行显式配置 隐式的bean发现机制和自动装 ...
- 【Spring】装配Bean 组件扫描
实现自动装配需要用注解:注解分为 spring规范和java规范 ,java规范需要引入javax.inject 包 ,使用maven,直接引入. 从中可以看到 @Named @Inject属于jav ...
- 1 spring如何通过组件扫描和自动装配实现自动化的配置
1 首先将spring依赖的包全部导入 2 建立测试接口 public interface CompactDisc { void play(); } 3 具体的类实现接口 import org.spr ...
随机推荐
- [SNOI 2017] 炸弹
题目描述: 给定炸弹和爆炸范围,求对于每个炸弹连锁爆炸的炸弹总和对\(1e9+7\)取膜 思路: 为啥都是线段树+TS+tarjan呢? 实在是搞不懂~~ 线性\(O(n)\)递推即可. #inclu ...
- day 54 Django基础四之模板系统
Django基础四之模板系统 本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关于模 ...
- “fixed+relative≈≈absolute”——对BFC的再次思考
好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...
- vue通过修改element-ui相关类的样式修改element-ui组件的样式
可以在App.vue中的style中修改element-ui的样式. .el-menu{ width:160px !important; } 注意:一定要在属性值后面加上 !important 使自己 ...
- 初识OpenCV-Python - 010: 精致边缘探测
本节主要介绍使用Canny函数达到边缘探测的结果. Code: import cv2from matplotlib import pyplot as plt img = cv2.imread('bal ...
- AWS云管理平台
- Leetcode143. Reorder List重排链表
给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例 1: ...
- Error:Execution failed for task ':app:validateSigningDebug'.
今天出差回来 第一天 把项目重新移植到新的电脑上 一运行 给我报错了 ! 这个是签名的路径错误 我们需要重新导一下路径就可以了 点击左上角 File -> project structu ...
- JavaWeb中请求转发和请求重定向的区别
针对于JavaWeb中请求与重定向的一个cheatsheep: 1.转发 1)完成一次转发,用户浏览器发送一次请求 2)转发之后,浏览器URL地址栏不改变(服务器帮忙完成) 3)请求域中数据不丢失 4 ...
- 【转载】linux文件系统简介
文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储结构.软链接 ...