前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入:

信息注入注解

  • @Component注解:表明当前类为一个组件(bean)
  • @Value注解:为bean注入值
  • @Autowired注解 :为bean注入其他bean(byType方式)
  • @Qualifier注解:与Autowired注解联用实现byName方式注入
  • @Resource注解:这个不是Spring提供的注解,这个是jdk提供的注解,要求jdk版本1.6以上,这个注解可以实现Autowired和Resource的功能。当直接注解@Resource时起到Autowired功能(byType),当加上参数@Resource(name="")的时候,起到@Autowired和@Qualifier联合使用的功能(byName)
@Component("book")
public class Book {
@Value("Java技术")
private String bname;
@Value("20142055")
private int bnumber;
//这个注解默认的是使用byType方式注入,加上@Qualifier("pub")可以实现byName方式注入
@Autowired
private publisher bpub;
//省略了setter,toString方法
}
@Component("pub")
public class publisher {
@Value("清华大学出版社")
String name;
@Value("北京")
String address;
//省略了setter,toString方法
}
//测试类
@Test
public void Test01() {
String resource = "com/test/annoDi/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
Book book = (Book)ac.getBean("book");
System.out.println(book);
}

你以为这样就行了嘛?

no no no~ 既然我们再测试类中注册的是一个xml 文件,那么我们的容器又是怎么找到我们的注解的呢?

所以我们要在xml文件中加上这样一行代码:

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

如果你这样添加,那么你的xml文件肯定会报错的,因为我们还要添加相应的约束:具体的约束文件我们可以到我们下载的Spring jar包中找约束(https://repo.spring.io/下载地址):

spring-framework-4.2.1.BUILD-SNAPSHOT-dist/spring-framework-4.2.1.BUILD-SNAPSHOT/docs/spring-framework-reference/html/xsd-configuration.html

到这个页面下找到:

里面有相应的约束文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.test.annoDi"/>
</beans>

这样就就可以完成我们的基于注解的依赖注入了。

base-package里面的路径写法:

我们可以单独扫描一个包内的内容,但是在实际开发当中我们需要扫描很多的包,我们就可以使用com.test.* 这样的的格式扫描com.test下的所有子包。或者com.test扫描这个包和它的所有子包。

与@Component注解功能相同的注解还有三个:

  1. Controller:注解在处理器上,在SpringMVC上会用到
  2. Service:注解在Service实现类上
  3. Respository:注解在DAO实现类上

就功能而言(现在)这三个注解和Component注解的功能是一样的,现在这样分类只是用以区别这几个注解用到的场合。

除了信息注入的注解,还有:


初始化后方法和销毁前方法注解

  • @PostConstruct:被注解的方法为初始化完成方法
  • @PreDestroy:被注解的方法为销毁前方法
	@PostConstruct
public void afterinitial() {
System.out.println("初始化后"); } @PreDestroy
public void beforedestory() {
System.out.println("销毁前");
}

使用Java类进行信息注入

除了xml和一般注解配置,Spring还提供了Java配置,什么叫java配置,即创建一个类来进行信息的注入,它和注解配置相似,不同的是它不是在bean的实现类中进行注解,而是新创建一个类进行配置:

这里涉及到了两个注解:

  • @Configuration
  • @Bean
public class Book {
private String bname;
private int bnumber;
private publisher bpub;
//省略了构造函数,toString方法,setter方法。
}
public class publisher {
String name;
String address;
//省略了构造函数,toString方法,setter方法。
}
@Configuration//用来声明这个是由Java来配置
public class JavaConfig {
//声明这个是一个bean,并且通过byType自动注入
//这里也可以改为Autowire.BY_NAME,但是自动装配的bean的name需
//要和当前bean的命名一致
//例如使用byName,下面的@Bean(name="pub")应该改成
//@Bean(name="bpub")和Book类private publisher bpub;
//相同
@Bean(name="book",autowire=Autowire.BY_TYPE)
public Book createBook() {
return new Book("java基础",20141025);
} @Bean(name="pub")
public publisher createPublisher() {
return new publisher("清华大学出版社","北京");
} }

在Spring的主配置文件中我们采用和注解配置相同的方式:

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

使用Java类进行配置一定记住bean的实现类需要有构造函数。

Ioc总结:

这一节我们的IoC就说完了,xml配置和注解配置各有优点,xml在系统上线后,如果需要改动,直接改配置文件即可,不需要改动源码重新编译;注解在开发中更加便捷,更符合我们的开发习惯(注解不需要setter方法和构造函数)。

但是在实际开发中,这两种方法我们都会使用,因为xml配置的优先级比较高(高于注解),所以我们在开发中我们先用注解开发,如果在后期需要改动,就使用xml进行改动,所以在开发中我们应该保留setter方法和构造函数,以便我们后期的改动。

07 Spring框架 依赖注入(四)基于注解的依赖注入的更多相关文章

  1. 使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用

    一.简述 本文主要讲使用注解+xml配合使用的几种使用方式.基础课程请看前一节. 二.步骤 1.为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依 ...

  2. SSM框架之Spring(3)IOC及依赖注入(基于注解的实现)

    Spring(3)IOC及依赖注入(基于注解的实现) 学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样 的,都是要降低程序间的耦合.只是配置的形 ...

  3. SSM-Spring-07:Spring基于注解的di注入

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...

  4. Spring框架的第四天(整合ssh框架)

    ## Spring框架的第四天 ## ---------- **课程回顾:Spring框架第三天** 1. AOP注解方式 * 编写切面类(包含通知和切入点) * 开启自动代理 2. JDBC模板技术 ...

  5. Unit02: 参数值注入 、 基于注解的组件扫描

    Unit02: 参数值注入 . 基于注解的组件扫描 (4)IOC (Inversion Of Controll 控制反转) 什么是IOC? 对象之间的依赖关系由容器来建立. 什么是DI? (Depen ...

  6. Spring IoC 源码分析 (基于注解) 之 包扫描

    在上篇文章Spring IoC 源码分析 (基于注解) 一我们分析到,我们通过AnnotationConfigApplicationContext类传入一个包路径启动Spring之后,会首先初始化包扫 ...

  7. Spring框架入门之Spring4.0新特性——泛型注入

    Spring框架入门之Spring4.0新特性——泛型注入 一.为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入. ...

  8. spring框架学习(五)注解

    注解Annotation,是一种类似注释的机制,在代码中添加注解可以在之后某时间使用这些信息.跟注释不同的是,注释是给我们看的,Java虚拟机不会编译,注解也是不编译的,但是我们可以通过反射机制去读取 ...

  9. Spring框架第四篇之基于注解的DI注入

    一.说明 与@Component注解功能相同,但意义不同的注解还有三个: 1)@Repository:注解在Dao实现类上 2)@Service:注解在Service实现类上 3)@Controlle ...

随机推荐

  1. SQLServer 批量备份与还原

    备份与还原是数据库避不开的主题,而作为DBA,经常会面临将一台机器上的所有数据库重新构建到一台新机器上的要求: 在现在都讲究自动化管理的时代,传统的界面操作备份还原的做法不仅浪费时间和精力,而且还很容 ...

  2. CocosCreate 与 Netty 开发斗地主 (一步一步开发)

    CocosCreate 与  Netty 开发斗地主 开发此教程的目的是为了教会大家基本的使用Netty,通过一个小例子来教会大家制作斗地主游戏服务器,采用WebSocket方式! 目前正在制作阶段, ...

  3. SRM 719 Div 1 250 500

    250: 题目大意: 在一个N行无限大的网格图里,每经过一个格子都要付出一定的代价.同一行的每个格子代价相同. 给出起点和终点,求从起点到终点的付出的最少代价. 思路: 最优方案肯定是从起点沿竖直方向 ...

  4. Extjs5 app.js缓冲设置

    在6月2日Extjs5正式版公布后.粗略研究了一下,sencha推荐使用project编译来公布应用.开发过程中用sencha app watch命令就可以生成服务.每建立一个js类,就须要Ctrl+ ...

  5. mysql快速上手

    mysql简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅 ...

  6. vim 命令大全(写的非常全和好)http://blog.csdn.net/woshixiaosimao/article/details/54312738

    下文转自链接.由原作者陈皓译自<Learn ViM Progressively>,非常不错. ——————————正文开始—————————— 你想以最快的速度学习人类史上最好的文本编辑器 ...

  7. 【微信小游戏】文件系统,远程加载资源打破4M限制

    一.前提 微信小游戏,对游戏包体的大小有严格是限制,上传文件大小<4M,但是本地缓存文件有50M空间,也就是说我们可以将一些资源放到网上,然后缓存到本地. 二.官方概念 文件系统 文件系统是小程 ...

  8. Chem 3D中怎么创建立体模型

    ChemDraw作为一款很受大家欢迎的化学绘图软件,其在绘制平面化学方面的功能已经非常的强大了,其实它也可以绘制3D图形.Chem 3D就是绘制3D图形的重要组件.而且为了满足不同的用户绘图的需求,可 ...

  9. 在系统重装后为什么ChemDraw用不了

    作为一款非常受欢迎的化学绘图软件ChemDraw需要在满足运行条件的电脑上运行,但是一些用户发现自己在给自己的电脑重装系统之后,ChemDraw运行不了呢.导致ChemDraw用不了的原因比较多样,不 ...

  10. Python 个人常用汇总

    Python 常用文件操作总结: 导入库路径:sys.path.append('/usr/local/lib/python2.7/site-packages') from random import ...