Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的。

  前面讲解 IOC 和 DI 都是通过 xml 文件来进行配置的,我们发现 xml 配置还是比较麻烦的,那么如何简化配置呢?答案就是使用注解!

  PS:本篇博客源码下载链接:http://pan.baidu.com/s/1geBMPrX 密码:z7ku

1、注解 @Component

  我们这里有个类 Person

package com.ys.annotation;

public class Person {
private int pid;
private String pname;
private String psex;
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPsex() {
return psex;
}
public void setPsex(String psex) {
this.psex = psex;
}
}

  如果我们不使用注解,通过前面讲解的,要想让 Spring 容器帮我们产生 Person 对象,我们要进行如下配置:

  applicationContext.xml 配置:

<bean id="person" class="com.ys.annotation.Person"></bean>

  如果使用注解呢?

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

  

  

  这里我们简单讲解一下这里引入的命名空间,简单来说就是用来约束xml文件格式的。第一个 xmlns:context ,这表示标签格式应该是 <context:标签名>

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

<!-- 组件扫描,扫描含有注解的类 -->
<context:component-scan base-package="com.ys.annotation"></context:component-scan>

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

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

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

  

  第四步:测试

@Test
public void testAnnotation(){
//1、启动 spring 容器
//2、从 spring 容器中取出数据
//3、通过对象调用方法
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person");
System.out.println(person.getPname());
}

  

  如果看完上面的注解配置,你一脸懵逼,那没关系,我们下面来详细讲解。

  @Component

  如果一个类上加了@Component注解,就会进行如下的法则

      如果其value属性的值为""

       @Component

       public class Person {}

        等价于

      <bean id="person" class="..Person">

       如果其value属性的值不为""

       @Component("p")

      public class Person {}

        等价于
 
                   <bean id="p" class="..Person">

  那么这就很好理解测试程序中,我们直接  context.getBean("person") 这样写。

2、@Repository    @Service   @Controller

  此外:下面三个注解是 @Component 注解的衍生注解,功能一样

@Repository :dao层
@Service:service层
@Controller:web层

  

3、注解 @Resource

  @Resource 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Resource 的使用来消除 set ,get方法。

  首先创建一个 学生类 Student.java

  

  然后在 Person 类中添加一个属性 Student

  

  那么我们如何获取 Person 对象,并调用 showStudent()方法呢?这个问题简化就是如何给属性 Student 实例化,也就是依赖注入

  不使用注解:

<property name="students">
<ref bean="student"/>
</property>
<bean id="student" class="com.ys.annotation_di.Student"></bean>

  使用注解:

  

  

  @Resource注解以后,判断该注解name的属性是否为""(name没有写)

    ①、如果没有写name属性,则会让属性的名称的值和spring配置文件bean中ID的值做匹配(如果没有进行配置,也和注解@Component进行匹配),如果匹配成功则赋值,如果匹配不成功,则会按照spring配置文件class类型进行匹配,如果匹配不成功,则报错

    ②、如果有name属性,则会按照name属性的值和spring的bean中ID进行匹配,匹配成功,则赋值,不成功则报错

  

4、注解 @Autowired

  功能和注解 @Resource 一样,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。只不过注解@Resource 是按照名称来进行装配,而@Autowired 则是按照类型来进行装配。

  第一步:创建接口 PersonDao

package com.ys.autowired;

public interface PersonDao {

	public void savePerson();

}

  第二步:创建一个接口实现类 PersonDaoImplOne

package com.ys.autowired;

import org.springframework.stereotype.Component;

@Component("personDaoImplOne")
public class PersonDaoImplOne implements PersonDao{ @Override
public void savePerson() {
System.out.println("save Person One"); } }

  第三步:创建PersonService

package com.ys.autowired;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service("personService")
public class PersonService{
@Autowired
private PersonDao personDao; public void savePerson() {
this.personDao.savePerson();
} }

  注意:这里我们在 private PesronDao personDao 上面添加了注解 @Autowired,它首先会根据类型去匹配,PersonDao 是一个接口,它的实现类是 PesronDaoImpOne,那么这里的意思就是:

  PersonDao personDao = new PersonDaoImpOne();

  那么问题来了,如果 PersonDao 的实现类有多个呢?我们创建第一个实现类 PersonDaoImpTwo

package com.ys.autowired;

import org.springframework.stereotype.Component;

@Component("personDaoImplTwo")
public class PersonDaoImplTwo implements PersonDao{ @Override
public void savePerson() {
System.out.println("save Person Two"); } }

  如果还是向上面那样写,那么测试就会报错。怎么解决呢?

  第一种方法:更改名称

  

  第二种方法:@Autowired 和 @Qualifier("名称") 配合使用

  

  

  在使用@Autowired时,首先在容器中查询对应类型的bean

    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据

    如果查询的结果不止一个,那么@Autowired会根据名称来查找。

    如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false

Spring详解(四)------注解配置IOC、DI的更多相关文章

  1. 详解SSH注解配置,bean注解、事物注解等

    使用过SSH注解的屌丝们都知道,要想使用注解需要在applicationContext.xml配置文件里面开启注解配置,开启方式如下:1.头部声明需加入xmlns:context="http ...

  2. Spring详解(二)------IOC控制反转

    我相信提到 Spring,很多人会脱口而出IOC(控制反转).DI(依赖注入).AOP等等概念,这些概念也是面试官经常问到的知识点.那么这篇博客我们就来详细的讲解 IOC控制反转. ps:本篇博客源码 ...

  3. Spring(四)注解配置Ioc

    原文链接:http://www.orlion.ga/216/ 一.@Autowired beans.xml配置成如下: <?xml version="1.0" encodin ...

  4. Spring详解(一)------IOC控制反转

    1.什么是 IOC? IOC-Inversion of Control,即控制反转.它不是什么技术,而是一种设计思想. 传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IO ...

  5. spring框架学习(二)——注解方式IOC/DI

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

  6. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...

  7. logback -- 配置详解 -- 四 -- <filter>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  8. Spring进阶案例之注解和IoC案例

    Spring进阶案例之注解和IoC案例 一.常见的注解分类及其作用 从此前的基于xml的IoC开发案例和依赖注入案例中,我们可以将xml配置归纳为: <bean id="" ...

  9. .NET DLL 保护措施详解(四)各操作系统运行情况

    我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...

  10. pika详解(四) channel 通道

    pika详解(四) channel 通道   本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 ​ channel通道 通道 ...

随机推荐

  1. js校验身份证

    1 <%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> &l ...

  2. HDOJ-2006求奇数的乘积

    Problem Description 给你n个整数,求他们中所有奇数的乘积.   Input 输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数 ...

  3. HDOJ2003-求绝对值

    Problem Description 求实数的绝对值.   Input 输入数据有多组,每组占一行,每行包含一个实数.   Output 对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果 ...

  4. javascript中typeof和instanceof用法的总结

    今天在看相应的javascript书籍时,遇到了typeof和instanceof的问题,一直不太懂,特地查资料总结如下: JavaScript 中 typeof 和 instanceof 常用来判断 ...

  5. global,$GLOBALS[' '] 全局, 浮动float跟margin的注意事项

    $a; global只能声明变量为全局,不能赋值,否则报错未定义:global $a; 相对于$GLOBALS['a'],写法是这样的,所有定义过的变量都存在这里: //浮动float跟margin的 ...

  6. 强连通分量tarjan缩点——POJ2186 Popular Cows

    这里的Tarjan是基于DFS,用于求有向图的强联通分量. 运用了一个点dfn时间戳和low的关系巧妙地判断出一个强联通分量,从而实现一次DFS即可求出所有的强联通分量. §有向图中, u可达v不一定 ...

  7. 【bzoj2819】Nim

    Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游 ...

  8. 用u盘启动计算机

    上次只是做好了u盘启动盘,但是并没有说怎么安装系统.接下来说一下怎么装系统.链接:怎么把系统装进u盘(ultraiso) 电脑经常要用到u盘启动.设置u盘启动在bios设置里面进行设置.下面就来讲解一 ...

  9. 在html中使用javascript

    使用script元素,script6个元素 1.async:应该立即下载 2.charset:通过src属性指定代码的字符集 3.defer:表示脚本可以延迟到文档完全解析和显示后运行 4.langu ...

  10. JVM学习笔记五:虚拟机类加载机制

    类加载生命周期 类加载生命周期:加载.验证.准备.解析.初始化.使用.卸载 类加载或初始化过程什么时候开始? 遇到new.getstatic.putstatic或invokestatic这4条字节码指 ...