Spring注入:配置与注解

Posted E-HERO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring注入:配置与注解相关的知识,希望对你有一定的参考价值。

之前在某电商公司的时候也接触过一点Spring,不过了解不深,只是大概知道这个东西的存在。现在在一家公司实习的时候,才系统的看了一下Spring,这个框架网上的解释都很多,但主要都会介绍一下关于spring注入这一点,其实spring还有拦截的功能,而spring本身又是可以通过注解来使用,也可以通过配置文件使用,比较复杂,这里粗略介绍spring的注入层面,后面也许会写一篇关于spring MVC的博客。同时本文也会附上本人在自学过程中的一些好资料~~

注入简介

Spring注入可以理解为是对一个对象进行初始化,也就是省去new的这个步骤,类似于工厂模式一样,通过一个工厂制造出这个对象,如果遇到修改,只需要改一处就行了。实现spring注入一般有两种方法,配置文件,或者用注解。各有不同的作用。

注意:本文中涉及到所以例子均默认加入了spring的包,如果没有加入spring包可以自己百度一下用maven或者手动下载spring的依赖包(这里就不给博客了,还是应该自己动动手吧)


配置注入:

不重复造轮子,这里已经说明得很清楚了,介绍了两种方式,set注入和构造注入,并且都很详细。至于这篇文中提及到的第三种:接口注入,本人小白观点,应该用interface来注入,在用mybatis框架时一般会接触到,注入这里本人也不介绍这个了,因为涉及到mybatis另一个框架,比较复杂。

PS:这位作者写的spring系列文章的确可以参考一下,本人也从中获益良多。

http://blog.csdn.net/lishuangzhe7047/article/details/20740835 

 

注解注入:

自动装配

在了解注解注入之前,需要先了解一下自动装配这个概念,这篇博客也说得比较详细,可以先参考这个知道一些概念,由于这篇博客没有给出很详细的例子,所以这里本人会给个例子。

http://blog.csdn.net/lishuangzhe7047/article/details/20742427 

首先介绍一下文件结构,Main主要来调试运行,Bean其中一个对象,TestBean所依赖的一个对象(也就是Bean成员里有Test对象),如图:

Main.class

 

Bean.class

 

Test.class

 

这里是配置文件

 

从这里可以看出,在bean那里有一个autowrite,这个字段就是用来自动装配的。可以看见在<property>这个标签中我没有写test的引用,这就是自动装配,可以根据名字(byName),也可以根据类型(byType)。所以这里的输出如下

 

如果这里我去掉了autowirte这个字段,由于我也没有在<property>里面引用test,所以这里的test会是空,并且会报错,因为Bean里面的test没有被初始化,所以test里面的getN调用不了,会NullPointer,如下图所示。

 

 这里,基于去掉autowrite的基础上,我加一个<property>test引用,这样又变成了手动装配了,就和上面给的第一篇博客的做法一样了。配置文件如下

 

 所以其实自动装配其实就是类A中有对类B的依赖关系(即A类的成员中B类的成员,记得这概念啊),然后可以通过自动注解初始化B类(但还是需要在配置文件中写B类的<bean>标签的)


注解注入

了解了自动装配,就可以了解一下注解注入,因为就是基于自动装配这一概念的,不同的是注解注入不用在配置文件中配置这么多,只需要配置一点点就可以了,剩下的全部用注解来实现。

还是刚刚那个例子,把配置文件改一下,去掉那些<bean>标签,加一个这个标签

 

其中base-package是自己的包名,如果有多个包名可以用分号隔开(分号在引号中)

然后再在目标类上面增加一些注解,如图

Bean.class

 

仅仅在类上面加了个注解,这里的注解其实也可以写@Controller或者@Service,这些个注释从注入效果来说没有什么区别,只是一些逻辑的不同,可以理解为一个变量可以这样声明int number,也可以这样声明int n,只是名字不同而已。然后在Test那个地方加了一个@Resource,其实也可以写@Autowirte,不过官方貌似比较推荐些@Resource,其实两个作用也是一样的。这里的@Resource就可以理解为是配置文件中autowirte字段,这里的@Repository可以理解为配置文件里面的<bean>标签。

 

Test.class

 

Main.class不变

然后这样运行一下,如图

 

发现Bean中的String 对象是nullint值是0,而testint 也是0。这里其实就是没有给这些字段初始化。但是Bean对象和Test是初始化了的(要追究到jvm的话就是BeanTest都申请了一块内存)。这里也可以理解为调用了BeanTest的默认构造函数,以为默认构造函数是空的,所以就是什么都没有初始化。这里也可以自己重写默认构造函数,例如把Test.class里面的默认构造函数那段注释去掉,然后运行结果如下:

 

这就是注解注入


配置注入VS注解注入

其实可以看出来,这两种的本质其实就是调用了构造函数,不过配置注入中的set注入是在调用构造函数后从配置文件里面读值然后set进去,构造注入是选择了特定的构造函数进行构造。注解注入就是调用了默认构造函数。如果要在注解注入中初始化对象成员中的值(例如本例中BeanString 对象的值),那就需要在默认构造函数中进行初始化。

选择配置注入的好处

配置注入其实和工厂模式差不多,但选择配置注入的好处在于可以把值和代码分开,方便管理,可以在配置文件中赋值

选择注解注入的好处

虽然注解注入又把注解和代码混在一起了,但是也可以方便把配置和类对应起来,而且配置比较简单,写个注解就行了。但是如果你要用注解配置初始化值,就只能在默认构造函数中写。

所以一般常用的是,如果需要值的注入,一般用配置注入,例如数据库连接类,就也可以在那里初始化用户名和密码;如果是无具体值的类,例如只用方法的类,像那些controller和那些service,虽然里面有一些对象,但这些对象不需要给什么值,只要new一个对象就行了,这种一般就用注解注入。

 

因为前人,才能更高

1、Spring 系列学习 第一篇 (文中提及的博客分别是该系列第二篇和第四篇)

http://blog.csdn.net/lishuangzhe7047/article/details/20740209   

2、Servlet下的spring注入,并且提及了作者踩的坑,以及一些需要的依赖包

http://hafuokas.iteye.com/blog/2229869    

以上是关于Spring注入:配置与注解的主要内容,如果未能解决你的问题,请参考以下文章

Spring(注解+依赖注入+无配置注解)适合回顾♥♥

Spring(注解+依赖注入+无配置注解+AOP)适合回顾♥♥

Spring管理Bean(XML与注解方式)

Spring注解注入

动手实现AOP

Spring使用注解配置依赖注入