施用annotation减少xml文件配置
使用annotation减少xml文件配置从错误信息中我们可以看到现在MovieFinder有两个bean实现了,一个是jpaMovie
使用annotation减少xml文件配置
从错误信息中我们可以看到现在MovieFinder有两个bean实现了,一个是jpaMovieFinder,另一个是ibatisMovieFinder,spring容器不知道应该使用哪一个bean。这时可以使用注解@Qualifier指定具体的bean。
//...- @Servicepublic?class?SimpleMovieLister?{
- ????@Autowired
- ????@Qualifier("ibatisMovieFinder")????private?MovieFinder?movieFinder;
- //...
这里我们指定注入的是ibatisMovieFinder这个bean。
运行Main, 控制台上会打印 Hi Arthur! This is IbatisMovieFinder implementation!
Java6提供的注入注解
spring也可以使用java6提供的@Resource注解来指定注入哪一个bean。
//...- @Servicepublic?class?SimpleMovieLister?{
- ????@Resource(name="ibatisMovieFinder")
- ????private?MovieFinder?movieFinder;//...
这和@Autowired功能是一致的。
使用注解还是xml
使用注解很方便,但从上面的例子我们也可以看出注解的问题,MovieFinder有两个实现,SimpleMovieLister是在程序中用注解指定了使用哪一个实现,如果要修改,需要修改源程序。所以,注解只适用于固定依赖的情况。如果依赖需要在部署的时候做调整,那还是使用xml的配置方式方便,毕竟只需要修改一下xml文件即可。
实际使用时,我们可以xml和注解两种方式混合使用。
<?xml?version="1.0"?encoding="UTF-8"?>- <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-2.5.xsd">???????????????
- ????<context:component-scan?base-package="test1"/>????
- ????<bean?id="simpleMovieLister1"?class="test1.SimpleMovieLister">????????<property?name="movieFinder"?ref="jpaMovieFinder"?/>
- ????</bean>????
- </beans>
使用xml配置方式定义了另外一bean,注入了jpaMovieFinder这个实现。
package?test1;- import?org.springframework.context.ApplicationContext;
- import?org.springframework.context.support.ClassPathXmlApplicationContext;
- public?class?Main?{
- ????public?static?void?main(String[]?args)?{????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("test1/beans.xml");
- ????????SimpleMovieLister?m?=?(SimpleMovieLister)context.getBean("simpleMovieLister");????????System.out.println(m.getData("Arthur"));
- ????????SimpleMovieLister?m1?=?(SimpleMovieLister)context.getBean("simpleMovieLister1");????????System.out.println(m1.getData("Arthur"));
- ????}
- }
simpleMovieLister是从注解来的,simpleMovieLister1是从xml配置来的。运行结果:
Hi Arthur! This is IbatisMovieFinder implementation!
Hi Arthur! This is JpaMovieFinder implementation!
证明混合使用是可行的,你可以继续测试,用xml重新配置simpleMovieLister。
因此,即使我一开始使用了注解,之后我后悔了,没有关系,不用修改源程序,以前用xml怎么配置现在还是怎么配置。