要想使用Annotation必须在XML配置文件头中,加入如下代码:
<?xml version="1.0" encoding="UTF-8"?> <!-- spring配置文件固定写法 --> <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:annotation-config /> </beans>
代码解释:
必须在beans标签中加入xmlns:context="http://www.springframework.org/schema/context"属性、和http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd属性。
<context:annotation-config /> 标签意思是引入下面四个类,用来解析都哪些代码使用了Annotation。
四个类分别为:AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor, as well as the aforementioned RequiredAnnotationBeanPostProcessor.
在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。@Autowired自动注入的策略默认是byType的,如果Spring容器中匹配出两个以上的Bean时,会抛出异常。Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常。
@Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。
@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
如果@Autowired写在set方法上,那么@Qualifier需要写在参数上。
主要代码段如下(如果想查看具体实现,请下载附件):
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- spring2.5配置文件固定写法 --> <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:annotation-config /> <!-- 使用@Autowired注解方式实现时,注入所需要的bean必须事先定义 --> <bean id="udi" class="com.yusj.dao.impl.UserDAOImpl"/> <!-- 使用@Autowired进行自动注入时,其注入策略(bean的autowire属性)是byType的, 所以不能出现有两个以上的Class,如果必须要存放那么需要用@Qualifier("name")来解决, 具体见UserServiceImpl类setUserDAO方法 --> <bean id="udis" class="com.yusj.dao.impl.UserDAOImpl"/> <bean id="usi" class="com.yusj.service.impl.UserServiceImpl" > <!-- 注意,在此处没有使用property进行注入,而是在UserServiceImpl类中的setUserDAO方法上用@Autowired注解实现 --> </bean> </beans>
UserServiceImpl.java
package com.yusj.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import com.yusj.dao.IUserDAO; import com.yusj.model.User; import com.yusj.service.IUserService; public class UserServiceImpl implements IUserService { // 为此属性提供setter,getter方法.是为了让Spring容器管理 private IUserDAO userDAO ; public IUserDAO getUserDAO() { return userDAO; } /** * 用Annotation的Autowired方法自动装载 * 用Annotation的Qualifier方法将Autowired的装载策略从byType变成byName * @param userDAO */ @Autowired public void setUserDAO(@Qualifier("udis") IUserDAO userDAO) { this.userDAO = userDAO; } @Override public void add(User user) { userDAO.save(user); } }
Test.java
package com.yusj.spring; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.yusj.model.User; import com.yusj.service.IUserService; public class Test { public static void main(String[] args) { /** * Spring提供的读取配置文件方法,此处推荐使用ApplicationContext而非BeanFactory. * beans配置文件默认读取src根目录文件名相同的XML文件 * 如果需要放在特殊的位置,那么需要指定具体路径,比如:com/yusj/xml/beans.xml * */ ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); /** * 获取beans.xml中id="usi"的bean标签所对应的实体类,通过反射机制将其实例化 * 具体实例化过程请见beans.xml文件的详细说明 * */ IUserService service = (IUserService) ctx.getBean("usi"); // 初始化用户并赋值 User u = new User(); u.setUsername("张三"); u.setPassword("zhangsan"); // 添加用户测试 service.add(u); /** * 输出结果: * user save success... * User [username=张三, password=zhangsan] */ } }
导出项目见附件,包含Jar包(Export -> General -> File System)