一、引言

最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会有错的。

上一篇Spring的配置博客评论中有园友指出现在很少用xml类配置SpringBean了,都是用注解的方式来进行配置,那么这篇就来讲注解配置。

使用.xml文件来对bean进行注入的缺点很明显:文件会十分庞大,如果分多模块去配置,文件又特别的多,这些会导致可读性和可维护性变差。

为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

二、将对象注册到容器

注解如何使用呢,分为三步

第一步:在 applicationContext.xml 中引入命名空间

第二步:在 applicationContext.xml 文件中引入注解扫描器

  1. <context:component-scan base-package="com.yuanqinnan.test" ></context:component-scan>

base-package:表示含有注解类的包名

如果扫描多个包,则上面的代码书写多行,改变 base-package 里面的内容即可!

如果使用Idea引入注解扫描器,就会直接引入命名空间

第三步:在 Car 类中添加注解@Component

  1. @Component
  2. public class Car {
  3.  
  4. private String Color;
  5.  
  6. public String getColor() {
  7. return Color;
  8. }
  9.  
  10. public void setColor(String color) {
  11. Color = color;
  12. }
  13.  
  14. @Override
  15. public String toString() {
  16. return "Car{" +
  17. "Color='" + Color + '\'' +
  18. '}';
  19. }
  20. }

第四步:测试

  1. ApplicationContext ctx=new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
  2. //获取bean的实例
  3. Car car=(Car) ctx.getBean("car");
  4. System.out.println(car.toString());

结果:Car{Color='null'}

三、值类型注入

  1. @Value("yellow")
  2. public void setColor(String color) {
  3. Color = color;
  4. }

结果:Car{Color='yellow'}

四、引用类型注入

引用类型分为自动装配@Autowired和手动注入@Resource

4.1 @Autowired

顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

创建一个新类Boss

  1. @Component
  2. public class Boss {
  3. //自动装配
  4. @Autowired
  5. private Car car;
  6.  
  7. private String name;
  8. @Value("袁帅")
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12.  
  13. public String getName() {
  14.  
  15. return name;
  16. }
  17.  
  18. @Override
  19. public String toString() {
  20. return "Boss{" +
  21. "car=" + car.getColor() +
  22. ", name='" + name + '\'' +
  23. '}';
  24. }
  25. }

测试:

  1. Boss boss=(Boss)ctx.getBean("boss");
  2. System.out.println(boss.toString());

结果:Boss{car=yellow, name='袁帅'}

这种方式存在匹配到多个类型一致的的情况,这种情况需要Qualifier来解决

定义一个Car接口:

  1. public interface ICar {
  2. String getCarName();
  3. }

两个实现类BMWCar和BenzCar:

  1. @Component("benzCar")
  2. public class BenzCar implements ICar {
  3.  
  4. @Override
  5. public String getCarName() {
  6. return "奔驰";
  7. }
  8. }
  9. @Component("bmwCar")
  10. public class BMWCar implements ICar {
  11. @Override
  12. public String getCarName() {
  13. return "宝马";
  14. }
  15. }

工厂类:

  1. @Component("cf")
  2. public class CarFactory {
  3. @Autowired
  4. private ICar iCar;
  5.  
  6. public String toString(){
  7. return iCar.getCarName();
  8. }
  9. }

很明显这种写法会报错,

  1. No unique bean of type [com.spring.service.ICar] is defined: expected single matching bean but found 2: [bmwCar, benz]

很明显这种写法会报错,因为Spring并不知道应当引用哪个实现类,这个时候使用@Qualifie

  1. @Autowired
  2. @Qualifier("bmwCar")
  3. private ICar iCar;

结果:宝马

4.2 @Resource

@Resource注解与@Autowired注解作用非常相似,这个就简单说了,看例子:

  1. @Resource(type = BenzCar.class)
  2. private ICar iCar2;
  3.  
  4. @Resource(name = "benzCar")
  5. private ICar iCar3;

五、常用注解总结

最后介绍常用的注解

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了

@Bean,就会作为这个Spring容器中的Bean。

@Scope注解 作用域 @Lazy(true) 表示延迟初始化

@Service用于标注业务层组件、

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件。

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Scope用于指定scope作用域的(用在类上)

@PostConstruct用于指定初始化方法(用在方法上)

@PreDestory用于指定销毁方法(用在方法上)

@DependsOn:定义Bean初始化及销毁时的顺序

@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 @Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: @Autowired @Qualifier("personDaoBean") 存在多个实例配合使用 @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@PostConstruct 初始化注解

@PreDestroy 摧毁注解 默认 单例 启动就加载

@Async异步方法调用

Spring之旅第四篇-注解配置详解的更多相关文章

  1. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  2. Spring MVC配置文件的三个常用配置详解

    转自:http://www.cnblogs.com/benwu/articles/5162614.html Spring MVC项目中通常会有二个配置文件,sprng-servlet.xml和appl ...

  3. spring框架中AOP思想与各种配置详解

    Spring中提供两种AOP支持:   1.基于代理的经典AOP   2.Aspectj注解配置AOP    首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...

  4. DAX 第四篇:CALCULATE详解

    CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式. CALCULATE(<expression>,<filter1>,<fil ...

  5. Spring Boot中使用MyBatis注解配置详解(1)

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  6. Spring Boot教程(三十八)使用MyBatis注解配置详解(1)

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  7. Spring Boot中使用MyBatis注解配置详解

    传参方式 下面通过几种不同传参方式来实现前文中实现的插入操作. 使用@Param 在之前的整合示例中我们已经使用了这种最简单的传参方式,如下: @Insert("INSERT INTO US ...

  8. Spring Boot教程(三十九)使用MyBatis注解配置详解(2)

    增删改查 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例: public interface U ...

  9. 从Spring到SpringBoot构建WEB MVC核心配置详解

    目录 理解Spring WEB MVC架构的演变 认识Spring WEB MVC 传统时代的Spring WEB MVC 新时代Spring WEB MVC SpringBoot简化WEB MVC开 ...

随机推荐

  1. IE8中marquee不显示出滚动效果的解决办法

    随着各种软件的升级,我们系统中的IE6也渐渐被淘汰了,目前主流的浏览器一半的用户已经从IE6直接升级到了IE8,虽然给用户更好的体验,上网更快更方便了,但是对网站制作来说,又是个比较麻烦的问题,因为很 ...

  2. uuid.go

    package uuid import "time" func GenerateUUID() uint64 {     return uint64(time.Now().UnixN ...

  3. version.go

    package blog4go const ( // 版本号 VERSION = "0.5.6" )

  4. [Poi2014]FarmCraft 树状dp

    对于每个点,处理出走完其子树所需要的时间和其子树完全下载完软件的时间 易证,对于每个点的所有子节点,一定优先选择差值大的来给后面的时间 树规+贪心. #include<cstdio> #i ...

  5. 网络流解线性规划问题 BZOJ1061: [Noi2008]志愿者招募

    线性规划定义: 在给定有限的资源和竞争约束情况下,很多问题都可以表述为最大化或最小化某个目标.如果可以把目标指定为某些变量的线性函数,而且如果可以将资源约束指定为这些变量的等式或不等式,则得到了一个线 ...

  6. BZOJ_2594_[Wc2006]水管局长数据加强版_LCT

    BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...

  7. FTRL(Follow The Regularized Leader)学习总结

    摘要: 1.算法概述 2.算法要点与推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 FTRL是一种适用于处理超大规模数据的,含大量稀疏特征的在线学习的 ...

  8. TIMO后台管理系统-基于SpringBoot开发

    项目介绍 TIMO后台管理系统,基于SpringBoot2.0 + Spring Data Jpa + Thymeleaf + Shiro 开发的后台管理系统,采用分模块的方式便于开发和维护,支持前后 ...

  9. Hyperledger Fabric、Corda和以太坊对比

     Hyperledger Fabric . Corda 和以太坊的对比 三种不同的框架 我们从 Hyperledger Fabric.R3 Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领 ...

  10. 通过JDK常用工具监控Java进程的内存占用情况

    目录 1 JDK 工具的使用 2 查看 GC 日志信息 3 添加 JMS 远程监控 Tomcat是一款常用的Web容器, 它是运行在 JVM(Java Virtual Machine) 中的一个Jav ...