首先要明白,基于注解和XML两种方式的实现功能是一样的,只是两种不同的配置方式。

一、IoC配置

1、配置xml

在使用注解与xml结合的方式配置IoC之前,首先要引入context标签:

xmlns:context="http://www.springframework.org/schema/context" 

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

再配置包的扫描:

<?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" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 扫描com.luis包下所有使用注解的类型 -->
<context:component-scan base-package="com.luis" />
</beans>

此配置起的作用是扫描com.luis包下所有带@Component及其衍生注解的类

2、配置注解

2.1、@Component注解

@Component注解作用是将资源交给Spring进行管理,相当于xml中配置的bean。

通过属性value指定bean的id,若不指定则默认bean的名称为类的名称,首字母小写。

2.2、@Component衍生注解

@Component产生三个衍生注解-@Controller、@Service、@Repository。它们与@Component的作用及用法一致,习惯上表达更为清晰的意义:

  • @Controller:一般用于表现层(controller)的注解。
  • @Service:一般用于业务层(service)的注解。
  • @Repository:一般用于持久层(dao)的注解。

二、DI注解配置

DI的装配方式有两种:按类型装配,按名称装配。这里的装配相当于xml配置方式中的:

<property name="" ref="">

1、按类型装配

1.1、@Autowired

@Autowired默认按类型装配(byType),它是由AutowiredAnnotationBeanPostProcessor类实现。

@Autowired是spring自带的注解,它默认情况下要求依赖对象必须存在,如果需要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)。

1.2、@Inject

@Inject是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Named;

@Inject是JSR330中的规范,需要导入javax.inject.Inject;实现注入,它可以作用在变量、setter方法、构造函数上。

2、按名称装配

2.1、@Resource

@Resource默认按名称装配(byName),可以通过@Resource的name属性指定名称, @Resource属于J2EE JSR250规范的实现。

@Resource如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,当找不到与名称匹配的bean时才按照类型进行装配。如果name属性一旦指定,就只会按照名称进行装配。

推荐使用@Resource注解,这个注解属于J2EE的,减少了与spring的耦合。相当于xml中的<property name="" value="">

2.2、注解组合

其实我们的按名称装配与按类型装配两种方式之间并没有明显的分界线,如@Resource也可以通过类型进行装配,而我们的按照类型装配也可以和其他注解结合的方式实现按照名策划那个装配。

@Autowired可以与@Qualifier结合实现按名称装配。在自动按照类型注入的基础之上,再按照 Bean 的 id 注入,@Qualifier在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。

注意,@Autowired、@Resource、@Inject区别

  • @Autowired是spring自带的,@Inject是JSR330规范实现的,@Resource是JSR250规范实现的,需要导入不同的包
  • @Autowired、@Inject用法基本一样,不同的是@Autowired有一个request属性
  • @Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的
  • @Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用

2.3、其他注解

常用的注解如@Value,用于给基本类型和String类型注入值、使用占位符获取属性文件中的值

@Value(“${name}”)//name是properties文件中的key
private String name;

bean作用范围注解@Scope,用于指定 bean 的作用范围,通过value进行取值,其值可取:singleton、prototype、request、session、globalsession

生命周期注解@PostConstruct、@PreDestroy,作用相当于xml中的<bean id="" class="" init-method="" destroy-method=""/>

另外还有一大批注解,将会在下一篇中进行说明。

三、注解和xml两种配置方式对比

两种配置方式各有优点:注解配置简单,维护方便(找到类,就相当于找到了对应的配置);xml修改时,不用改源码,不涉及重新编译和部署。因而具体的配置方式由个人进行选择。

Spring管理bean方式对比:

基于xml 基于注解
Bean定义 <bean id="" calss=""/> @Component及其衍生注解
Bean名称 通过id或name指定 @Component("person")
Bean注入 <property>或p命名空间 @Autowired、@Resource
Bean作用范围、生命周期 init-method、destory-method、scope属性 @PostConstruct初始化,@PreDestroy销毁,@Scope作用范围设置

Spring基于注解和XML混合方式的使用的更多相关文章

  1. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

  2. 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

    复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置 ...

  3. Spring基于注解的Cache支持

    Spring为我们提供了几个注解来支持Spring Cache.其核心主要是@Cacheable和@CacheEvict.使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回 ...

  4. spring自带的定时任务功能,基于注解和xml配置

    1.spring的配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&quo ...

  5. Spring - 基于注解的组件扫描

    关于Spring的书籍都会花很大篇幅来讲解Spring如何注入各种bean的问题,非常令人头疼,自己在工作中还从来没有用到过. 所以就要跳过那些篇章,直接学习基于注解的组件扫描. 发现spring2是 ...

  6. Spring基于注解及SpringMVC

    1.使用注解 (1)组件扫描 指定一个包路径,Spring会自动扫描该包 及其子包所有组件类,当发现组件类定义前有 特定的注解标记时,就将该组件纳入到Spring 容器.等价于原有XML配置中的< ...

  7. (spring-第4回【IoC基础篇】)spring基于注解的配置

    基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样 ...

  8. spring基于注解进行注入(个人记录)

    spring的Bean基于注解进行配置,再结合自动装配属性,也就DI,其实说白了就相当于初始化的时候给对象赋初值. 配置文件的过程有些麻烦,记录一下. 基于注解进行配置: 1.在application ...

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

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

随机推荐

  1. bash编程-条件测试

    Shell脚本中经常需要判断某情况或者数据是否满足,需要由测试机制来实现. 测试方式 echo $?查看命令执行状态返回值 bash脚本中可以自定义返回值exit n(n为自己指定的状态码),shel ...

  2. Java 数组的创建

    与C.C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度. 定义一个数组有两种方式: int[] array; int array[]; 对于如上定 ...

  3. JavaScript使用浏览器内置XML解析器解析DOM对象

    所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器.解析器把 XML 转换为 XML DOM 对象 (可通过 JavaScript 操作的对象). 一.获取DOM对象 XMLHttpReq ...

  4. 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别一览

    平时,不管在pc端页面还是移动端页面,因为我们一般很少会设置某个块的的高度,但是呢,我有时候有需要取到这些高度以便于我们方便进行判断和下一步的编写.一般这个时候我都是直接的获取一个块的高度.heigh ...

  5. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  6. [译]ElasticSearch vs. Solr

    在Gen2产品的早期阶段, 我们事实上是失败的, 这促使我们重新审视我们现有的技术栈. 我们仔细分析系统中的每个独立的组件,并记录下来, 当然其中也包括构成我们核心功能的搜索引擎技术. 在我们的通用日 ...

  7. 认识不一定熟悉的opencv

    对很多人来说,opencv就像在旅行路上遇到的某个人,很有可能,这个只是你生命中的匆匆过客.可是,对于一个立志要做熟悉图像处理的人来说,你不能绕过他. 他是什么? OpenCV是一个基于BSD许可(开 ...

  8. 详谈再论JAVA获取本机IP地址

    首先,你如果搜索“JAVA获取本机IP地址”,基本上搜到的资料全是无用的.比如这篇:http://www.cnblogs.com/zrui-xyu/p/5039551.html实际上的代码在复杂环境下 ...

  9. C# 对密码等数据进行对称性加密解密

    类: /// <summary> /// DESEncrypt加密解密算法. /// </summary> public class DESEncrypt { private ...

  10. 【sping揭秘】14、@before @AfterThrowing

    @before 基础模式,我们先直接看一下就可以了,比较简单,网上一堆... 不是我装逼哈,我学了那么久spring,aop的皮毛也就是网上的那些blog内容,稍微高级点的我也不会,这里跳过基础部分 ...