Spring注入Bean的几种方式
2015-06-30 21:21
597 查看
首先,Bean的概念需要清晰:
Bean是一种符合一定要求的Java类
1 有默认的构造函数
2 对于私有属性,有setter和getter
满足了上述的条件,在工程中就可以在XML文件中定义类的实例。一开始我不是很理解,为什么要在XML中去定义实例,而不是正正常常的代码中创建。后来看了一些资料,敲了一些sample代码,看了一下《Spring实战》,或多或少有一点理解。在实际变成中,我们需要实现多态,主要用到继承和接口。一般开发中提倡“面向接口编程”,从而降低代码的藕合度。所以Spring的思想中,把类的实例化抽取出来,而代码中只需要做核心的逻辑实现。类的实例化在Spring里面称为wiring(装配)或者inject(注入)。咋一看,装配这个词十分唬人,实际上就是把类实例化,然后把一些参数“塞”到这个对象里面,同时把这个对象和别的对象的依赖关系一并搞清楚,如谁是谁的私有属性之类的。
通过学习,我个人归纳了一下Spring里面所谓的“依赖注入”的几种方式。
1 完全通过XML文件装配
2 用Annotation自动装配
3 用Java装配
4 还有一些不伦不类的,介于使用XML和使用Annotation之间的做法,不提倡
新建一个XML文件,样式如下
其中用来标写JavaBean的内容,id最好是工程内的唯一,或者至少是package里面的唯一。id就会去寻找class参数所示的类定义,然后实例化这个类。要使用这个对象,就需要在Java代码里面用getBean。
Annotation指的是Java代码里面,用@开头的一些关键词。
一般Spring是默认ban掉这个功能的。所以需要在XML文件里面添加一些东西。如下。
然后在Java代码里面,就可以用一些关键词去自动装配了。Spring里面使用@Autowired,例如:
这里,Autowired就自动把Instrument这个类实例化了。实际上有了这个Annotation都可以不需要下面那个setter函数。
假如Autowired写在属性上面,也是可行的做法,而且那样还可以省去setter,如
实际上这里的Autowired是有比较大的局限性的。实际使用的时候估计要对自动装配做一下限定。
除了这种方法, 还有一种更狠的自动装配,也叫自动监测。首先XML文件中写入这么一句
然后Spring会自动检测代码中含有关键字@Component的class,然后注册成为bean,id为类名,如
注意一点,这个类里面必须要用默认构造函数,否则会报错。JavaBean的要求正是有默认构造函数。
如果希望这个bean的名字是自己命名的,则可以写成
则bean注册id为charlie
不过,还是要在XML文件里面,加入这么一句话。
后面的base-package是所在的包名,
然后新建一个Java类,如下
其中@Bean意味着接下来是一个bean的定义
Performer是返回的类
duke相当于id
小结:
作为初学者,不好客观评价各种注入的方式,只能提一提个人的直觉。
第一种显式定义bean显然比较粗暴,实际开发中估计不建议这么做,因为显式定义将产生冗长的XML文件,根本不便于维护;第二种方式代码上看比较不错,代码简单,不过同时可读性相对弱一点,只有理解了bean注入的开发者才能体会代码,而且一旦不慎容易装配错误;第三种做法比较有意思,不过有点失去Spring精髓的味道,感觉Spring的开发还是有点尖括号比较有feel。。嗯。。走题了~然而现在有一个叫做SpringBoot的项目,基本上就不需要任何XML文件,变为需要记住不少Annotation。不过Annotation的确很有好处,起码编译器可以帮助我们报错,如果是XML文件,经常出错了还找不到出错的点,就比较麻烦。
Bean是一种符合一定要求的Java类
1 有默认的构造函数
2 对于私有属性,有setter和getter
满足了上述的条件,在工程中就可以在XML文件中定义类的实例。一开始我不是很理解,为什么要在XML中去定义实例,而不是正正常常的代码中创建。后来看了一些资料,敲了一些sample代码,看了一下《Spring实战》,或多或少有一点理解。在实际变成中,我们需要实现多态,主要用到继承和接口。一般开发中提倡“面向接口编程”,从而降低代码的藕合度。所以Spring的思想中,把类的实例化抽取出来,而代码中只需要做核心的逻辑实现。类的实例化在Spring里面称为wiring(装配)或者inject(注入)。咋一看,装配这个词十分唬人,实际上就是把类实例化,然后把一些参数“塞”到这个对象里面,同时把这个对象和别的对象的依赖关系一并搞清楚,如谁是谁的私有属性之类的。
通过学习,我个人归纳了一下Spring里面所谓的“依赖注入”的几种方式。
1 完全通过XML文件装配
2 用Annotation自动装配
3 用Java装配
4 还有一些不伦不类的,介于使用XML和使用Annotation之间的做法,不提倡
第一步,配置XML文件
首先,无论用何种方式装配,都至少需要一个XML文件,做一些基础的调起启动新建一个XML文件,样式如下
<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-3.0.xsd "> ... add bean here... using <bean></bean> </beans>
<完全通过XML文件装配>
新建一个XML文件,样式如下<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-3.0.xsd "> <bean id="charlie" class="com.hunter.PoeticJuggler"> <constructor-arg value = "25"/> <constructor-arg ref = "jingyesi"/> </bean> <bean id="jane" class = "com.hunter.Instrumentalist"> <property name = "song" value="Jingle Bells"/> </bean> </beans>
其中用来标写JavaBean的内容,id最好是工程内的唯一,或者至少是package里面的唯一。id就会去寻找class参数所示的类定义,然后实例化这个类。要使用这个对象,就需要在Java代码里面用getBean。
<用Annotation装配>
把XML文件里面的bean删掉。咱们开始用Annotation来实现自动装配。Annotation指的是Java代码里面,用@开头的一些关键词。
一般Spring是默认ban掉这个功能的。所以需要在XML文件里面添加一些东西。如下。
<context:annotation-config>
然后在Java代码里面,就可以用一些关键词去自动装配了。Spring里面使用@Autowired,例如:
public class Instrumentalist implements Performer{ private Instrument instrument; @Autowired public void setInstrument(Instrument instrument){ this.instrument = instrument; } }
这里,Autowired就自动把Instrument这个类实例化了。实际上有了这个Annotation都可以不需要下面那个setter函数。
假如Autowired写在属性上面,也是可行的做法,而且那样还可以省去setter,如
public class Instrumentalist implements Performer{ @Autowired private Instrument instrument; } }
实际上这里的Autowired是有比较大的局限性的。实际使用的时候估计要对自动装配做一下限定。
除了这种方法, 还有一种更狠的自动装配,也叫自动监测。首先XML文件中写入这么一句
<context:component-scan>
然后Spring会自动检测代码中含有关键字@Component的class,然后注册成为bean,id为类名,如
@Component public class Instrumentalist implements Performer{ public Instrumentalist(){ } public void perform(){ System.out.println("Playing "+song+" : "); instrument.play(); } }
注意一点,这个类里面必须要用默认构造函数,否则会报错。JavaBean的要求正是有默认构造函数。
如果希望这个bean的名字是自己命名的,则可以写成
@Component("Charlie")
则bean注册id为charlie
<基于Java的装配>
因为某些原因,有人很讨厌尖括号的XML配置。所以Spring也提供了基于Java的配置方法。不过,还是要在XML文件里面,加入这么一句话。
<context:component-scan base-package=“com.hunter">
后面的base-package是所在的包名,
然后新建一个Java类,如下
package com.hunter; import org.springframework.context.annotation.Configuration; @Configuration public class SpringConfig{ @Bean public Performer duke(){ return new Juggler(); } }
其中@Bean意味着接下来是一个bean的定义
Performer是返回的类
duke相当于id
小结:
作为初学者,不好客观评价各种注入的方式,只能提一提个人的直觉。
第一种显式定义bean显然比较粗暴,实际开发中估计不建议这么做,因为显式定义将产生冗长的XML文件,根本不便于维护;第二种方式代码上看比较不错,代码简单,不过同时可读性相对弱一点,只有理解了bean注入的开发者才能体会代码,而且一旦不慎容易装配错误;第三种做法比较有意思,不过有点失去Spring精髓的味道,感觉Spring的开发还是有点尖括号比较有feel。。嗯。。走题了~然而现在有一个叫做SpringBoot的项目,基本上就不需要任何XML文件,变为需要记住不少Annotation。不过Annotation的确很有好处,起码编译器可以帮助我们报错,如果是XML文件,经常出错了还找不到出错的点,就比较麻烦。
相关文章推荐
- Java struts2 上传2M大小限制错误
- 'tools.jar' seems to be not in Android Studio classpath. Please ensure JAVA_HOME points to JDK rathe
- 学习JAVA中(一) 一些简单的排序算法
- Spring - 如何实现IOC
- SSH-struts2入门实例
- java多线程之CyclicBarrier简单用法
- JAVA中的内部类--匿名内部类
- 命令行状态下编译Java程序
- 在MAC上查找和设置$JAVA_HOME
- SpringMVC基于浏览器国际化实现
- java 多线程之Semaphore互斥类的用法
- 深入理解JavaWeb技术内幕(一)
- Pydev for eclipse 安装及配置
- Java GC
- java张集合的继承结构图Map部分
- JAXB 实现JavaBean与xml互转(一)
- java中集合的继承结构图collection部分
- Java的反射
- 提高代码性能效率总结(一)--Java
- Activiti Spring集成Demo