注入
转自:http://blog.csdn.net/u011579138/article/details/51379066
注入简介
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其中一个对象,Test,Bean所依赖的一个对象(也就是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 对象是null,int值是0,而test的int 也是0。这里其实就是没有给这些字段初始化。但是Bean对象和Test是初始化了的(要追究到jvm的话就是Bean和Test都申请了一块内存)。这里也可以理解为调用了Bean和Test的默认构造函数,以为默认构造函数是空的,所以就是什么都没有初始化。这里也可以自己重写默认构造函数,例如把Test.class里面的默认构造函数那段注释去掉,然后运行结果如下:
这就是注解注入
配置注入VS注解注入
其实可以看出来,这两种的本质其实就是调用了构造函数,不过配置注入中的set注入是在调用构造函数后从配置文件里面读值然后set进去,构造注入是选择了特定的构造函数进行构造。注解注入就是调用了默认构造函数。如果要在注解注入中初始化对象成员中的值(例如本例中Bean的String 对象的值),那就需要在默认构造函数中进行初始化。
选择配置注入的好处
配置注入其实和工厂模式差不多,但选择配置注入的好处在于可以把值和代码分开,方便管理,可以在配置文件中赋值
选择注解注入的好处
虽然注解注入又把注解和代码混在一起了,但是也可以方便把配置和类对应起来,而且配置比较简单,写个注解就行了。但是如果你要用注解配置初始化值,就只能在默认构造函数中写。
所以一般常用的是,如果需要值的注入,一般用配置注入,例如数据库连接类,就也可以在那里初始化用户名和密码;如果是无具体值的类,例如只用方法的类,像那些controller和那些service,虽然里面有一些对象,但这些对象不需要给什么值,只要new一个对象就行了,这种一般就用注解注入。
相关阅读
clientHeight、offsetHeight、scrollHeight、clientWi
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid
HttpURLConnection方法之setRequestProperty()浅谈
前言:申请CSDN账号大概是四年前的事情了,想想的确的有点历史久远的感觉,只不过这段历史中,我的博客却是历史空白的,主要原因是,当时只是
offsetTop,offsetHeight,clientHeight图解
动态的计算弹框距离外部元素的位置,即获取元素的offsetLeft、offsetTop、offsetWidth、offsetHeight,如果弹框的宽度(offsetWidth)+距
小问题: JSP1代码 String [] test=new String[2]; test[0]="1"; test[1]="2"; request.setAttribute("test",test) ; response.sen
今天写页面的时候,发生了离奇的错误,明明语句在数据库中执行能查出6个字段,但是返回数据时只剩5个了,检查了好多遍代码,终于发现Result