装配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 ...
随机推荐
- fatal error U1087: cannot have : and :: dependents for same target Stop.
转自VC错误:http://www.vcerror.com/?p=72 问题描述: 完成后编译,发现有错误 D:\WinDDK\7600.16385.1\bin\makefile.new(7117) ...
- shiro real的理解,密码匹配等
1 .定义实体及关系 即用户-角色之间是多对多关系,角色-权限之间是多对多关系:且用户和权限之间通过角色建立关系:在系统中验证时通过权限验证,角色只是权限集合,即所谓的显示角色:其实权限应该对应到资源 ...
- Dubbo + Kryo 实现高速序列化
Dubbo 中的序列化 Dubbo RPC 是 Dubbo 体系中最核心的一种高性能.高吞吐量的远程调用方式,可以称之为多路复用的 TCP 长连接调用: 长连接:避免了每次调用新建 TCP 连接,提高 ...
- new linux setup, yum command
7 yum list 9 cd /etc/yum.repos.d/ 55 history | grep yum 56 yum -y list screen* 57 yum -y instal ...
- JS规则 给变量取个名字(变量命名) 必须以字母、下划线或美元符号开头;区分大小写;不允许使用JS关键字或保留字
给变量取个名字(变量命名) 我们为了区分盒子,可以用BOX1,BOX2等名称代表不同盒子,BOX1就是盒子的名字(也就是变量的名字). 我们赶快给变量取个好名字吧!变量名字可以任意取,只不过取名字要遵 ...
- Jquery实现图片瀑布流思路-简单版
目录 Jquery实现图片瀑布流思路-简单版 1.预备 2.开始 1.声明 2.主体 3.窗体大小改变事件 Jquery实现图片瀑布流思路-简单版 注意:本篇文章基于知道每张图片的实际尺寸的情况下 特 ...
- limit方法也是模型类的连贯操作方法之一
limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多.ThinkPHP的limit方法可以兼容所有的数据库驱动类的. 限制结果数量 例如获取满足要求的 ...
- 容斥原理——hdu1796
/* 遇到这种题一般用dfs,枚举起点来做 但是本题如何进行容斥? 比如以x为起点,第一步dfs到y,那么因子有lcm(x,y)的 所有数要被减掉(容斥中偶数是减法) 然后第二步dfs到z,那么因子有 ...
- LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
传送门 解题思路 学习了一下玄学算法--模拟退火,首先要求平衡处,也就是求势能最小的地方,就是求这个点到所有点的距离*重量最小.剩下的几乎是模拟退火的板子了. #include<iostream ...
- Composer环境混乱引起--Fatal error: Call to undefined method Fxp
Fatal error: Call to undefined method Fxp\Composer\AssetPlugin\Package\Version\V ersionParser::parse ...