`

学习Spring笔记_Annotation(注解)_Autowired_Qualifier

阅读更多

要想使用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)

 

1
1
分享到:
评论

相关推荐

    学习Spring笔记_Annotation(注解)_Component

    本篇笔记主要关注Spring中的注解(Annotation)和@Component,这两大概念是Spring框架的重要组成部分,也是理解SpringIoC(控制反转)和AOP(面向切面编程)的基础。 首先,注解(Annotation)是Java提供的一种元...

    Spring注解 - 52注解 - 原稿笔记

    注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before , @Component , @ComponentScan , @ComponentScans , @...

    Spring笔记整理.zip

    在Spring中,注解被广泛用于配置bean,如`@Component`、`@Service`、`@Repository`和`@Controller`用于定义bean,`@Autowired`用于自动装配依赖,`@Qualifier`用于指定特定的bean。这些注解使得XML配置变得多余,...

    spring笔记

    Spring 笔记 Spring 是 Java 企业版(Java EE)应用程序的框架,提供了结构化的配置文件,实现了控制反转(IoC)和面向切面编程(AOP),支持表现层、业务逻辑层和持久层。Spring 的核心是 IoC 和 AOP,能够与主流...

    spring_Annoation:学习Spring注解的笔记

    这篇学习笔记将围绕Spring注解进行深入探讨。 1. **Spring核心注解** - `@Component`:这是所有Spring组件注解的基础,用于标记一个类为Spring管理的bean。其他的注解如`@Service`、`@Repository`和`@Controller`...

    spring学习笔记(六)

    在本篇"spring学习笔记(六)"中,我们将深入探讨Spring框架的核心特性——自动装配(Autowired)。自动装配是Spring框架提供的一种方便的依赖注入方式,它能够自动为bean找到并设置其所需的依赖,极大地简化了应用的...

    学习spring时的笔记 二

    以上内容涵盖了Spring框架的基础配置、依赖管理和高级特性等方面的知识点,希望对你学习Spring有所帮助。通过深入理解这些概念和技术,可以更好地掌握Spring框架的核心能力,并能灵活应用于实际项目中。

    Spring学习笔记

    Spring通过注解如@Autowired、@Qualifier、@Resource等简化了配置过程。 10. 什么是AOP: AOP即面向切面编程,它允许将横切关注点(如日志、事务管理等)从业务逻辑中分离出来,通过声明式的方式动态地添加到程序中...

    孙哥说Spring5代码.zip

    2. **注解驱动开发(Annotation-based Development)**:Spring5支持大量注解,如@Service、@Repository、@Controller等,这些注解使得代码更加简洁,减少了XML配置。@Autowired用于自动装配依赖,@Qualifier用于...

    spring2.5 学习笔记

    ### Spring 2.5 学习笔记知识点梳理 #### 第一课:面向抽象编程 - **定义**:面向抽象编程是一种编程范式,强调通过抽象类或接口来设计程序结构,减少对具体实现的依赖。 - **优势**: - 提高了系统的可维护性与...

Global site tag (gtag.js) - Google Analytics