springMVC学习(注解实现依赖注入)
原文:http://blog.csdn.net/mockingbirds/article/details/45399691
上一篇博客,学习了spring的依赖注入,即利用spring容器来为类中的属性赋值,分为两种赋值方法,利用set和利用构造方法,我们都知道,如果我需要为某一个属性赋值的话,必须为该属性写上set方法,那么大家有没有想过一个问题,如果我们一个类中有很多个属性,我们会生成大量的set方法,如果用构造方法来赋值,即<constructor-arg index="" type="" ref="" value=""></constructor-arg>,这样也会存在很多个这样的标签,因为一个<constructor-arg index="" type="" ref="" value=""></constructor-arg>只能为一个属性赋值,为了解决这些难题,我们可以利用注解来为属性进行赋值。
同样,我们新建两个类ClassInfo.Java和Teacher.java
- package com.test.spring.di;
- public class ClassInfo {
- public void printClassInfo() {
- System.out.println("this is classInfo....");
- }
- }
- package com.test.spring.di;
- import javax.annotation.Resource;
- public class Teacher {
- private String teacherName;
- @Resource
- private ClassInfo classInfo;
- public void printClassInfo() {
- this.classInfo.printClassInfo();
- }
- }
注意,这里我们给需要被赋值的属性上添加了@Resource的注解。其中包含了基本的String类型以及ClassInfo的引用类型。接下来我们来写一个applicationContext.xml文件:
注意:因为我们使用注解来为属性赋值的,所以我们需要导入命名空间,如下:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
其次需要导入依赖注入的注解解析器:
<context:annotation-config></context:annotation-config>
3.导入需要被spring容器来管理的类。
经过上面散步操作之后呢,applicationContext.xml是这个样子:
- <?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-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- ">
- <context:annotation-config></context:annotation-config>
- <bean id="classInfo" class="com.test.spring.di.ClassInfo"></bean>
- <bean id="teacher" class="com.test.spring.di.Teacher"></bean>
- </beans>
此时,编写我们的测试类TestAnotation.java
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/test/spring/di/applicationContext.xml");
- Teacher teacher = (Teacher) applicationContext.getBean("teacher");
- teacher.printClassInfo();
此时打印如下:
this is classInfo....
这充分说明了利用注解为Teacher类中的classInfo对象赋值成功了。在这里需要注意:如果我么你的@Resource的注解的值为"",那么spring将会将容器中id为该属性的类注入给该属性。什么意思呢??我举个栗子:
我将上面的@Resource的值修改为这样:@Resource(name="test")此时由于name的值不是"",所以spring容器将不会试图匹配与该属性相同的id对应的类,而是将id为test的类注入给该属性,然而,此时并没有id为test的类,所以会抛出如下异常:
No bean named 'test' is defined
此时我将classInfo对应的id改为test,再次运行发现程序是ok的。
其实spring有自己定义的注解的,细心的程序员可能发现了@Resource是java官方提供的一个注解,并不是spring的,我们可以将@Resource替换成@Autowired,这个@Autowired是根据类型进行匹配的。那我如果非要按照id来进行匹配怎么办呢?别急,spring为我们提供了一个@Qualifier,我们如果要匹配spring容器中id为classInfo的类,可以这样写:@Qualifier("classInfo"),注意:这里还需要加上@Autowired,如下:
@Autowired
@Qualifier("classInfo")
private ClassInfo classInfo;
大家有没有想过,既然spring是用来管理bean的,难道就没有生命周期的管理???是有的。我们为ClassInfo类添加如下初始化和销毁方法:
- @PostConstruct
- public void init() {
- System.out.println("classInfo init....");
- }
- @PreDestroy
- public void destroy() {
- System.out.println("classInfo destroy.....");
- }
顾名思义,@PostConstruct表示紧接着在构造方法之后执行的,@PreDestroy表示在销毁前执行的,然后编写测试代码如下:
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/test/spring/di/applicationContext.xml");
- ClassPathXmlApplicationContext classContext = (ClassPathXmlApplicationContext) applicationContext;
- Teacher teacher = (Teacher) classContext.getBean("teacher");
- teacher.printClassInfo();
- classContext.close();
此时运行工程,会打印如下信息:
classInfo init....
this is classInfo....
classInfo destroy.....
我们发现确实执行了初始化和销毁的方法,说明利用注解来实现声明周期的管理也是可以的。
但是,注意spring的注解只能用于引用类型。
那我能不能在applicationContext.xml中对于bean的声明也不写呢??是可以的,怎么做的,同样分为以下三步:
1.导入命名空间:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
2.启动扫描类的注解解析器
<context:annotation-config></context:annotation-config>
3.启动依赖注入的注解解析器
<context:component-scan base-package="com.test.spring.di"></context:component-scan>
这里是扫描"com.test.spring.di"包和该包下的所有的类。
4.在需要被spring来管理的类上加上@Component的注解
注意:和@Resource比较相似,@Component是默认匹配类名的第一个字母小写的,比如我在Teacher类上加了@Component这个注解,那么可以这样得到该类对象:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/test/spring/di/applicationContext.xml");
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
如果Teacher类上写了这样一个@Component("teacherId"),那么此时就需要通过
Teacher teacher = (Teacher) applicationContext.getBean("teacherId");
才可以得到Teacher对象。这里的@Component是一个比较宽泛的泛型,spring为我们提供了更详细的注解配置:
@Controller 配置控制器的,控制视图的跳转
@Service 配置service的,不是Android中的service
@Repository 配置dao的,控制操作数据库的
我们发现这三个注解是对web开发中的MVC编程很好的一个支持。
恩,今天spring注解,就到这里吧,希望大家看了都能理解。
springMVC学习(注解实现依赖注入)的更多相关文章
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- 07 Spring框架 依赖注入(四)基于注解的依赖注入
前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入: 信息注入注解 @ ...
- Spring-Context的注解实现依赖注入功能
使用Spring-Context的注解实现依赖注入功能. Demo要点: 本例子中主要使用Annotation功能来实现对MoviceService的注入.我们将Cinema.java的头部标注为@C ...
- Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)
什么是依赖注入 在以前的java开发中,某个类中需要依赖其它类的方法时,通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,spring提出了依赖注入的思想,即依赖类不由程序员 ...
- AngularJS学习笔记之依赖注入
最近在看AngularJS权威指南,由于各种各样的原因(主要是因为我没有money,好讨厌的有木有......),于是我选择了网上下载电子版的(因为它不要钱,哈哈...),字体也蛮清晰的,总体效果还不 ...
- 再学习之Spring(依赖注入)
一.概述 Spring框架是以 简化Java EE应用程序的开发 为目标而创建的.Spring可以实现很多功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入和面向切面编程.几乎Sprin ...
- spring4——IOC之基于注解的依赖注入(DI )
spring容器对于Bean的创建和对象属性的依赖注入提供了注解的支持,让我们在开发中能够更加便捷的实现对象的创建和对象属性的依赖注入.一,对于Bean的创建spring容器提供了以下四个注解的支持: ...
- 《Android进阶之光》--注解与依赖注入框架
No1: 标准注解: 1)@Override:覆写 2)@Deprecated:过时 3)@SuppressWarnings:取消警告 4)@SafeVarargs:申明使用了可变长度参数的方法 No ...
- Spring.NET学习笔记6——依赖注入(应用篇)
1. 谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny I ...
随机推荐
- python内置函数 eval()、exec()以及complie()函数
1.eval函数 eval() 函数用来执行一个字符串表达式,并返回表达式的值. eval(expression[, globals[, locals]]) 参数 expression -- 表达式. ...
- WP8.1 发送邮件
Method 1: Windows.System.Launcher.LaunchUriAsync(new Uri("abc@outlook.com?subject=hello world&a ...
- windows phone, 应用最大内存
windows phone应用最大内存为150M,当app运行时所占内存超过150M时app会自动退出(VS debug时不容易捕捉到这个内存超出异常). [注]可通过配置增大最大内存
- ECLIPSE修改xml配置文件TOMCAT不生效的解决
昨天和今天一直想研究一下SSH的项目,但把项目导入ECLIPSE后配置数据库时发现无论如何修改配置文件,TOMCAT上的文件还是旧文件,从未变过. 感觉很神奇也很崩溃,重启ECLIPSE,CLEAN, ...
- 控制html元素的隐藏问题
控制元素隐藏的方式,有display:none.visibility:hidden以及不透明度设置. 一.display:none 被隐藏的元素,在页面中不占位,空出的位置会被相邻的元素占用. < ...
- 机房servlet过滤器
1.源代码 loginform.html <html> <head> <title>使用过滤器改变请求编码</title> <meta http- ...
- 如何打开Windows Server 2008 R2的域安全策略
今天安装了Windows Server 2008 R2系统,并且建了域环境,在添加新用户的时候,发现用简单的密码时域安全策略提示密码复杂度不够,于是我就想在域安全策略里面把密码复杂度降低一点,但是很快 ...
- TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架
TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架 http://blog.sina.com.cn/s/blog_4b0020f30102wv4l.html
- Python repr() 函数
Python repr() 函数 Python 内置函数 描述 repr() 函数将对象转化为供解释器读取的形式. 语法 以下是 repr() 方法的语法: repr(object) 参数 obje ...
- preset
preset - 必应词典 美[.pri'set]英[.priː'set] v.预置:事先安排:预调:给…预定时间 网络预设:预先装置:预置位