装配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 ...
随机推荐
- django中写form表单时csrf_token的作用
之前在学习django的时候,在template中写form时,出现错误.百度,google后要加{% csrf_token %}才可以,之前一直也没研究,只是知道要加个这个东西,具体是什么也不明白. ...
- 记录一次idea因为修改子模块名称而引申的一大堆问题(未完全解决)
文章目录 背景 看图说话 解决 因为这个案例引申出来的错误 修改了之后莫名出现在java 和resource文件后面出现sources root字样 修改了之后java和resource后面出现了[c ...
- day 67 Django基础三之视图函数
Django基础三之视图函数 本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...
- Spring - 框架入门
认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP( ...
- shell脚本,循环的记录
######################################################################### # File Name: showlogged.sh ...
- JS规则 确定你的存在(变量声明) 声明变量语法: var 变量名; 一次声明多个,中间用逗号隔开var num1,mun2 ;
确定你的存在(变量声明) 我们要使用盒子装东西,是不是先要找到盒子,那在编程中,这个过程叫声明变量,找盒子的动作,如何表示: 声明变量语法: var 变量名; var就相当于找盒子的动作,在JavaS ...
- uoj33 树上GCD
题意:给你一棵树,根节点为1,每条边长度为1.定义f(u,v)=gcd(u-lca(u,v),lca(u,v)-v),求有多少个无序点对f(u,v)=i.对每个i输出答案. n<=20W. 标程 ...
- 高斯消元+期望dp——light1151
高斯消元弄了半天没弄对.. #include<bits/stdc++.h> using namespace std; #define maxn 205 #define eps 1e-8 d ...
- 模板——二分图匹配KM
具体方法就不介绍了,详见 https://blog.csdn.net/sixdaycoder/article/details/47720471 主要讲一些注意点: 1:不直接将未匹配的y减小是因为要保 ...
- 版本控制git之二 分支 切换分支 创建分支 合并 删除
版本控制git之二 分支 有人把 Git 的分支模型称为它的`‘必杀技特性’',也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出. 为何 Git 的分支模型如此出众呢? Git 处 ...