2深入使用Spring

来源:互联网 发布:php开发管理系统 编辑:程序博客网 时间:2024/05/22 13:35
1Spring的零配置支持
既然我们不再使用Spring配置文件来配置任何Bean实例,那么我们指定Spring自动搜做某些路径下的java类,并将这些java类注册成Bean实例。这就需要使用Annotation了,Spring通过使用一些特殊的Annotation来标注Bean类,Spring提供了如下几个Annotation来标注Spring Bean:
@Component,标注一个普通的Spring Bean类。
@Controller,标注一个控制器组件类。
@Service,标注一个业务逻辑组件类。
@Repository,标注一个DAO组件类。
如果我们需要定义一个普通的Spring Bean,则直接使用@Component标注即可,但如果用@Repository,@Service或@Controller来标注这些Bean类,这些Bean类将被作为特殊的java EE组件对待,也许能更好的被工具处理,或切面进行管理。如果需要在java EE应用中使用这些标注时,尽量考虑使用@Controller,@Service和@Repository来代替通用的@Component来标注。被它们标注的类在Spring中对应的<bean>元素的id为类名的第一个字母小写。
例如:
import .....
@Component
public class StoneAxe implements Axe{
...
}
该java类与其它Bean类没有太大区别,只是每个java类都使用@Component标注。这表明该java类将作为Spring的Bean类。@Component("axe")//表示该类作为Spring Bean,Bean实例名为axe。
默认情况下,Spring会自动搜索所有以@Component,@Constroller,@Service和@Repository标注的java类,并将它们当成Spring Bean来处理。


@Component,@Controller,@Service,@Repository在启用了spring包自动扫描默认以类名的第一个字母小写作为bean的名字(id),也可以自己指定value属性的值来制定bean的名字。如:
@Repository("menuDao11")或者@Repository(value="menuDao11")


指定Bean的作用域
当只用XML配置方式来配置Bean实例时,可以通过scope来指定Bean实例的作用域,没有指定scope属性的Bean实例的作用域默认是singleton。当我们采用零配置方式管理Bean实例时,可以使用@Scope Annotation,只要在该Annotation中提供了作用域的名称即可。例如:
//指定该Bean实例的作用域为prototype
@Scope("prototype")
//指定该类作为Spring Bean ,Bean的实例名为axe
@Component("axe")
public class SteelAxe implements Axe
{
...
}


使用@Resource配置依赖
@Resource是来自java里的一个Annotation,Spring直接借鉴了该Annotation,通过该Annotation为目标Bean指定协作者Bean。
@Resource有一个name属性,在默认情况下,Spring将这个值解释为需要被注入的Bean实例的名字。使用@Resource与<property.../>元素的ref属性有相同的效果。例如:
@Component
public class Chinese {
private Axe axe;
public Chinese(){
}
//设值注入所需的setter方法
//指定将stoneAxe注入该方法
@Resource(name="stoneAxe"){
public void setAxe(Axe axe){
this.axe=axe;
}
}
上面的@Resource(name="stoneAxe"),该Annotation指定将stoneAxe注入该setAxe()方法,也就是将容器中的stoneAxe Bean作为setAxe()方法的参数传入。
使用@Resource时还可以省略name属性,当直接用@Resource修饰setter方法时,name属性默认是该setter方法去掉前面的set子串,首字母小写后得到的子串。例如,使用@Resource标注setName()方法,则Spring默认会注入容器中名为name的组件。
当直接用@Resource修饰Field时,则name属性默认与该Field同名。例如使用@Resource标注name Field,则Spring默认会注入容器中名为name的组件。


2自动装配与精确装配
Spring提供了@Autowired Annotation来指定自动装配。使用@Autowired可以标注setter方法,普通方法和构造器等。例如:
@Component
public class Chinese implements Person{
//自动装配Field
@Autowired
private Axe axe;
//设值注入所需的setter方法
@Autowired
public void setAxe(Axe axe){
this.axe=axe;
}
..
//自动装配构造方法
@Autowired
public Chinese(Axe axe,Dog dog){
...
}
}
上面的代码使用了@Autowired指定对setAxe()方法进行自动装配,Spring将会自动搜索容器中类型为Axe的bean实例,并将该Bean实例作为setAxe()方法的参数传入。当使用@Autowired标注setter方法时,默认采用byType的自动装配策略。@Autowired也可以用于标注构造器可Field。
@Autowired甚至可以用来修饰数组类型的Field,例如:
@Autowired
private Axe[] axes;
被@Autowired修饰的axes属性是Axe[]数组,这种情况下,Spring会自动搜索容器中所有的Axe实例,并以这些axe作为数组元素来创建数组。与此类似,@Autowired也可以标注集合Field或标注形参类型是集合的方法。如:
@Component
public class Chinese {
private Set<Axe> axes;
@Autowired
public void setAxes(set<Axe axes){
this.axes=axes;
}
...
}
对于这种集合类型的参数而言,程序代码必须使用泛型,如果程序没有使用泛型来指明集合元素的类型,则Spring将会不知所措。
@Autowired总是采用byType的自动装配策略,在这种策略下,在这种下,如何自动装配类型的候选Bean常常有几个,这个时候会引起异常。为了实现精确的自动装配,Spring提供了@Qualifier Annotation,通过使用@Qualifier允许根据Bean表示来指定自动装配。例如:
@Component
public class Chinese implements Person{
@Autowired
@Qualifier("steelAxe")
private Axe axe;
public Chinese(){
}
...
}
上面的axe Field将使用自动装配,且精确指定了被装配的Bean实例名称是steelAxe,这意味着Spring将会搜索容器中名为steelAxe的Axe实例,并将其注入到axe Field。此外,Spring还允许使用@Qualifier标注方法的形参。如:
@Autowired
public vid setAxe(@Qualifier("steelAxe") Axe axe){
//Spring将搜索容器中名为steelAxe的Axe实例,并将该实例作为setAxe()方法的参数传入。
...
}

0 0
原创粉丝点击