Spring详解(四)------注解配置IOC、DI
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的更多相关文章
- 详解SSH注解配置,bean注解、事物注解等
		
使用过SSH注解的屌丝们都知道,要想使用注解需要在applicationContext.xml配置文件里面开启注解配置,开启方式如下:1.头部声明需加入xmlns:context="http ...
 - Spring详解(二)------IOC控制反转
		
我相信提到 Spring,很多人会脱口而出IOC(控制反转).DI(依赖注入).AOP等等概念,这些概念也是面试官经常问到的知识点.那么这篇博客我们就来详细的讲解 IOC控制反转. ps:本篇博客源码 ...
 - Spring(四)注解配置Ioc
		
原文链接:http://www.orlion.ga/216/ 一.@Autowired beans.xml配置成如下: <?xml version="1.0" encodin ...
 - Spring详解(一)------IOC控制反转
		
1.什么是 IOC? IOC-Inversion of Control,即控制反转.它不是什么技术,而是一种设计思想. 传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IO ...
 - spring框架学习(二)——注解方式IOC/DI
		
什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...
 - java框架之Spring(2)-注解配置IOC&AOP配置
		
注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...
 - logback -- 配置详解 -- 四 -- <filter>
		
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
 - Spring进阶案例之注解和IoC案例
		
Spring进阶案例之注解和IoC案例 一.常见的注解分类及其作用 从此前的基于xml的IoC开发案例和依赖注入案例中,我们可以将xml配置归纳为: <bean id="" ...
 - .NET DLL 保护措施详解(四)各操作系统运行情况
		
我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...
 - pika详解(四) channel 通道
		
pika详解(四) channel 通道 本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权  channel通道 通道 ...
 
随机推荐
- 修改User-Agent来伪装浏览器访问手机站点
			
有时候为了测试需要,可能需要使用测试手机wap这样的站点,如果用真正的手机去测试也可以实现,但是比较麻烦,我们可以通过设置chrome的user agent来伪装浏览器,达到我们的测试目的. 代码如下 ...
 - 史上最易懂——ReactNative分组列表SectionList使用详情及示例详解
			
React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...
 - 【基础网络】TCP与UDP 的区别
			
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
 - OpenCV探索之路(二十一)如何生成能在无opencv环境下运行的exe
			
我们经常遇到这样的需求:我们在VS写好的程序,需要在一个没有装opencv甚至没有装vs的电脑下运行,跑出效果.比如,你在你的电脑用opencv+vs2015写出一个程序,然后老师叫你把程序发给他,他 ...
 - Python初识(PyMysql实例)
			
为什么学习python呢,好吧,其实我也不知道,反正就是想学习了. 资料什么的全都low了,传值博客免费的就够.不要问我为什么,我基本上都是找的免费的视频.然后传值博客的最多,我真的不是打广告. py ...
 - 流畅python学习笔记:第十五章:上下文管理器
			
在开始本章之前,我们首先来谈谈try-excep..final模块.在Python中,进行异常保护的最多就是用try..except..final.首先来看下下面的代码.进行一个简单的除法运算.为了防 ...
 - 小白读iOS冗余资源扫描脚本
			
随着公司项目的不断功能迭代,项目的体积越来越大,各种瘦身策略迫在眉睫.由于平时使用Linux高级命令和 shell脚本的机会不多,之前学的知识一下子想起来很难.所有趁着这次看脚本,重新温习一下. 本文 ...
 - vim  配置插件
			
vim插件可以用bundle管理,我这里面用的是一个开源的Vundle工具,git上操作步骤说的很清楚https://github.com/VundleVim/Vundle.vim 之前PluginI ...
 - Linux学习-->linux系统在移动硬盘的安装
			
由于自己看了一些文章和linux的好奇,想来一窥Linux的奥秘,因此自己准备学习使用Linux系统,这里记录下自己的安装过程,方便以后自己重装系统时进行查阅. 参考的书籍是鸟哥的<Linux私 ...
 - SpringMVC+MyBatis 事务管理一
			
前言 spring事务管理包含两种情况,编程式事务.声明式事务.而声明式事务又包括基于注解@Transactional和tx+aop的方式.那么本文先分析编程式注解事务和基于注解的声明式事务. 编程式 ...