多选择是好事嘛?
Spring 经过十多年的快速发展和更新,以其独特的创新带来了大量的拥趸者,在选择方面还带来了更多选择!譬如spring bean的装配(在XML中进行显式配置、在Java中进行显式配置、隐式的bean发现机制和自动装配),注解的多元化(基本注解、jsr250、jsr330)等等!
而这么多重复的选择难道真的是好事吗?这是否也以为学习与成本提高,掌握的难度加大?
打个比喻:同样可以救国,某个叫spring的神经病告诉你可以从医救国(xml显式配置),当你学医正酣的时候,它又告诉你还可以从军救国(Java显示配置),当你练习擒拿射击快要成功的时候,它来告诉你,其实有更简单的方法可以教育救国(bean的自动装配)!
作为一个初学者,个人认为,从学 servlet 到 jsp 再到 struts 到现在的 spring ,坑是越挖越大越挖越多啊!
废话不多说了,下面来介绍几个简单的注解:
@Autowired注解:实现自动装配。
1.在 spring xml 配置文件中需要注入如下两个类:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
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 配置文件中配置代码如下:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testB" class="..../TestB" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
如果想将 TestA 注入到 TestUtil 中,代码如下:
public class TestUtil{ @Autowired @Qualifier("testA") private Test testA; private Test testB; ....... }
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Resource(name=“”)注解:实现对 bean 的注入。它的作用与@Autowired注解类似。
1.由于该注解是由JSR250引入的,故而在使用它之前需要导入jsr250相关jar包的支持,在pom.xml文件中加入以下内容:
<!-- jsr250注解包的引入 --> <dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version> </dependency>
2.在spring配置文件中注入相关类:
假如 testUtil 类中需要引入 testA 类,在 spring 配置文件中配置代码如下:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans> 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 元素。
<context:annotation-config /> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
备注:JSR250注解有 @PostConstruct,@PreDestroy 。
JSR330注解有 @Inject (代替 @AutoWired)、@Named (代替 @Component)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ComponentScan(basePackages=“×××××”)注解:启用组件扫描基础包。
1.在 spring 配置文件中加入
配置完成后,
备注:加入该元素后,就不需要再向 spring 配置文件中注入相关的类,即不需要再使用如下配置:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
2.
@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为标记。