多选择是好事嘛?
spring 经过十多年的快速发展和更新,以其独特的创新带来了大量的拥趸者,在选择方面还带来了更多选择!譬如spring bean的装配(在xml中进行显式配置、在java中进行显式配置、隐式的bean发现机制和自动装配),注解的多元化(基本注解、jsr250、jsr330)等等!
而这么多重复的选择难道真的是好事吗?这是否也以为学习与成本提高,掌握的难度加大?
打个比喻:同样可以救国,某个叫spring的神经病告诉你可以从医救国(xml显式配置),当你学医正酣的时候,它又告诉你还可以从军救国(java显示配置),当你练习擒拿射击快要成功的时候,它来告诉你,其实有更简单的方法可以教育救国(bean的自动装配)!
作为一个初学者,个人认为,从学 servlet 到 jsp 再到 struts 到现在的 spring ,坑是越挖越大越挖越多啊!
废话不多说了,下面来介绍几个简单的注解:
@autowired注解:实现自动装配。
1.在 spring xml 配置文件中需要注入如下两个类:
2.若想要在 testutil 类中装配 testa 类,则可以在 testutil 类中使用@autowired注解;
如果想将 testa 注入到 testutil 中,代码如下:
public class testutil{
@autowired
private test testa;
.......
}
简单来说,自动装配就是让spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在spring应用上下文中寻找匹配某个bean需求的其他bean。
@autowired注解不仅能够用在构造器上,还能用在方法上,和属性上。如果没有匹配的bean,那么在应用上下文创建的时候,spring会抛出一个异常。为了避免异常的出现,你可以将@autowired的required属性设置为false:但是,把required属性设置为false时,你需要谨慎对待。如果在你的代码中没有进行null检查的话,这个处于未装配状态的属性有可能会出现nullpointerexception。
@autowired他是spring特有的注解,如果你不愿意在代码中到处使用spring的特定注解来完成自动装配任务的话,那么你可以考虑将其替换为@inject。
在自动装配中,spring同时支持@inject(jsr330注解)和@autowired。尽管@inject和@autowired之间有着一些细微的差别,但是在大多数场景下,它们都是可以互相替换的。
注意:1.它只是提供自动装配,并不提供注入;而注入是前提。
2. 若要实现自动装配还需要导入支持
或者也可以使用
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@qualifier注解:对依赖注入的条件进行限制。
如果@autowired标注的依赖在容器中只能找到一个实例与之对应,则万事ok,但是如果存在多个同意类型的对象实例,则 @qualifier 注解将其作用。
假如 test 类有两个实现,testa 和 testb,在 spring 配置文件中配置代码如下:
如果想将 testa 注入到 testutil 中,代码如下:
public class testutil{
@autowired
@qualifier(testa)
private test testa;
private test testb;
.......
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@resource(name=“”)注解:实现对 bean 的注入。它的作用与@autowired注解类似。
1.由于该注解是由jsr250引入的,故而在使用它之前需要导入jsr250相关jar包的支持,在pom.xml文件中加入以下内容:
javax.annotation
jsr250-api
1.0
2.在spring配置文件中注入相关类:
假如 testutil 类中需要引入 testa 类,在 spring 配置文件中配置代码如下:
3.在 testutil 中加入
@resource(name=“”)注解:
如果想将 testa 注入到 testutil 中,代码如下:
public class testutil{
@resource(name=“testa”)
private test testa;
private test testb;
.......
}
注意:@resource(name=“”) 中的name 为指定要注入的对象,testa 为 spring 配置文件中所定义 bean 的id。
4.以下两个解释注解的包至少要引入一个到 spring 配置文件,本着偷懒的原则,个人喜欢 context 元素。
备注:jsr250注解有 @postconstruct,@predestroy 。
jsr330注解有 @inject (代替 @autowired)、@named (代替 @component)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@componentscan(basepackages=“×××××”)注解:启用组件扫描基础包。
1.在 spring 配置文件中加入 实现。
配置完成后,会扫描 com.lh 路径下的所有标注了的相应注解的类,并添加到ioc容器中,实现依赖注入。
备注:加入该元素后,就不需要再向 spring 配置文件中注入相关的类,即不需要再使用如下配置:
2. 默认扫描的注解类型是 @component ,所以需要在相应的类中应用这个注解进行标注。
@component
public class testutil{
@autowired
private test testa;
.......
}
@component
public class testa{
private int a;
private string ss;
...
}
备注:(1)需要在两个类中都标注 @component 注解。
(2)该注解是类级别的,它添加在类之上。
(3)@component(id号)注解:表明该类会作为组件类,并告知spring要为这个类创建bean。若id号为空,则默认使用以小写开头的类名!若使用自定义id号,则在后续的引用中需要引入以该id为标记。
