前两篇文章我总结了通过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(四)--注解装配之组件扫描的更多相关文章

  1. 装配SpringBean(五)--注解装配之自动装配

    在spring ioc容器中,spring要先完成bean的定义和生成,然后需要需要注入的资源,在上一篇的扫描组件中就是这样实现的.而自动装配中我们只需要定义和生成一个bean,发现bean的过程将由 ...

  2. IoC容器-Bean管理注解方式(组件扫描配置)

    4,开启组件扫描细节配置

  3. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配

    一.依赖注入的三种方式      在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...

  4. Spring IOC基础回顾 — 组件扫描和装配

    目录 注解形式配置应用IOC 1. 组件自动扫描 2. 组件依赖:为bean添加注解,实现自动注入 3. Spring IOC应用小结 注解形式配置应用IOC 在类定义.方法定义.成员变量定义前使用, ...

  5. java之Spring(IOC)装配Bean(手动装配、自动装配、注解装配)

    在上一篇控制反转中我们看到了依靠一个Bean文件来实现对代码的控制,可谓十分便捷,再也不用去实例化对象了,2333~~~ 1.手动装配 <bean id="todo" cla ...

  6. Spring装配Bean之组件扫描和自动装配

    Spring从两个角度来实现自动化装配: 组件扫描:Spring会自动发现应用上下文中所创建的bean. 自动装配:Spring自动满足bean之间的依赖. 案例:音响系统的组件.首先为CD创建Com ...

  7. Spring装配bean--01组件扫描和自动装配

    Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系 Spring提供了三种主要的装配机制: 在XML中进行显式配置 在Java中进行显式配置 隐式的bean发现机制和自动装 ...

  8. 【Spring】装配Bean 组件扫描

    实现自动装配需要用注解:注解分为 spring规范和java规范 ,java规范需要引入javax.inject 包 ,使用maven,直接引入. 从中可以看到 @Named @Inject属于jav ...

  9. 1 spring如何通过组件扫描和自动装配实现自动化的配置

    1 首先将spring依赖的包全部导入 2 建立测试接口 public interface CompactDisc { void play(); } 3 具体的类实现接口 import org.spr ...

随机推荐

  1. JavaScript的函数进阶

    函数进阶 1立即执行函数表达式 立即执行的函数表达式的英文全称为Immediately Invoked Function Expression,简称就为IIFE.这是一个如它名字所示的那样,在定义后就 ...

  2. Linux课程---15、域名相关

    Linux课程---15.域名相关 一.总结 一句话总结: 先购买域名,再备案,再解析,域名即可使用 1.域名备案是怎么回事(比如二级域名,三级域名)? 每个二级域名需要备案一次,三级域名不需要备案, ...

  3. redis可视化客户端工具TreeNMS

    TreeNMS是一款redis,Memcache可视化客户端工具,采用JAVA开发,实现基于WEB方式对Redis, Memcached数据库进行管理.维护. 功能包括:状态参数监控,NoSQL数据库 ...

  4. error LNK2001: unresolved external symbol _main解决办法(zz)

    error LNK2001: unresolved external symbol _main解决办法   解决外部符号错误:_main,_WinMain@16,__beginthreadex -!t ...

  5. MR 原理

    MapReduce的执行步骤: 1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数.                <0,h ...

  6. django2 连接mysql实现第一个rest framework

    1.安装pymysql,mysqlclient,创建项目django-admin startproject django2 2.settings中把DataBase配置换掉 DATABASES = { ...

  7. iOS开发之SceneKit框架--SCNScene.h

    1.SCNScene SCNScene是一个场景图——具有附加几何形状.光照.摄像机和其他属性的节点的层次结构,共同形成可显示的3D场景. 2.相关API简介 初始化方法 //懒加载 + (insta ...

  8. 海量数据解决思路之Hash算法

    海量数据解决思路之Hash算法   一.概述 本文将粗略讲述一下Hash算法的概念特性,里边会结合 分布式系统负载均衡 实例对Hash的一致性做深入探讨.另外,探讨一下Hash算法在海量数据处理方案中 ...

  9. Django之ORM查询优化

    目录 only 和 defer select_related 和 prefetch_related ORM字段参数 choices res = models.Book.objects.all() # ...

  10. 「BZOJ2300」[HAOI2011] 防线修建

    传送门 操作离线之后倒着做,只有加点操作. 用set动态维护凸包即可. //Achen #include<algorithm> #include<iostream> #incl ...