Spring的注解是在Spring2.5的版本中引入的,目的简化XML配置。在企业开发过程中使用注解的频率非常高,但是学习注解的前提是大家一定要对Spring基于XML配置要熟悉,这是我个人建议,因为在Spring2.0的版本时候是没有出现注解的使用。
- Spring常用注解如下
- @Component
- @Autowired
- @Qualifier
- @Scope
- @Controller
- @Service
- @Repository
- 使用Spring注解的时候一定关注Spring框架需要加入的包【很重要】,我们这里以spring4.0.3版本为例来介绍
- common-logging.jar
- spring-core-4.0.3.jar
- spring-context-4.0.3.jar
- spring-beans-4.0.3.jar
- spring-expression-4.0.3.jar
- spring-aop-4.0.3.jar,【此jar包在使用<context:component-scan/>需要导入此包】
- @Component注解
- @Component主要用于将一个Java类注入到Spring框架中,它相当于XML配置文件中的<bean id=”xxx” class=”xxx”/>
- 当使用了Spring注解后,我们需要在配置文件中添加<context:component-scan/>来扫描添加了注解的类,这样子声明注解的类才能起作用
- Bean实例的名称默认是Bean类的首字母小写,其他部分不变。
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.gxa.spring.day02"></context:component-scan>
</beans>
package com.gxa.spring.day02;
import org.springframework.stereotype.Component;
@Component
public class StudentAnnotation {
}
package com.gxa.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.gxa.spring.day02.StudentAnnotation;
public class Test02 {
@Test
public void m06() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentAnnotation studentAnnotation = context.getBean("studentAnnotation", StudentAnnotation.class);
System.out.println(studentAnnotation.hashCode());
}
}
- 除了@Component注解,Spring容器提供了3个功能和@Component注解等同。它们分别是用于对Dao,Service及Web层的Controller进行注解
- @Repository:用于对Dao实现类注解
- @Service:用于对Service实现类注解
- @Controller:用于对Controller实现类注解
- @Autowired注解
- Spring2.5引入了@Autowired注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作(DI依赖注入工作)
- Spring通过@Autowired注解实现Bean之间的依赖关系
package com.gxa.spring.day02;
import org.springframework.stereotype.Component;
@Component
public class TeacherAnnotation {
public void getTeacherName() {
System.out.println("===吴老师好===");
}
}
package com.gxa.spring.day02;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class StudentAnnotation {
/**
* 通过Autowired来自动装备Student所依赖的对象
* 无需创建setter方法
* 无需编写XML配置文件中<property/>
*/
@Autowired
private TeacherAnnotation teacherAnnotation;
public void showTeacher() {
teacherAnnotation.getTeacherName();
}
}
- @Autowired(required = false),告诉 Spring:在找不到匹配 Bean 时也不报错
package com.gxa.spring.day02;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class StudentAnnotation {
/**
* 注意TeamAnnotation没有加入@Component
* 当StudentAnnotation依赖TeamAnnotation会报错
* 但是如果加入@Autowired(required=false)就不会报错
*/
@Autowired(required=false)
private TeamAnnotation teamAnnotation;
public void showTeacher() {
teacherAnnotation.getTeacherName();
}
}
- @Qualifier指定注入Bean的名称
- 如果容器中有一个以上匹配的Bean时,则可以通过@Qualifier注解限定注入的Bean名称
package com.gxaedu.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class Computer {
@Autowired
@Qualifier("storage01")
private Storage storage;
public void m01() {
storage.show();
}
}
package com.gxaedu.bean;
import org.springframework.stereotype.Component;
@Component("storage01")
public class Storage { //此类是在com.gxaedu.bean下的Storage
public void show() {
System.out.println("东芝硬盘");
}
}
package com.gxaedu.test;
import org.springframework.stereotype.Component;
@Component
public class Storage { //此类是在com.gxaedu.test下的Storage
}
- @Qualifier为方法指定注入Bean名称
package com.gxa.spring.day02;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class StudentAnnotation {
private CourseAnnotation courseAnnotation;
/**
* @Autowired来自动装备构造方法里面的对象
* @Qualifier来指定依赖对象的bean
* @paramcourseAnnotation
*/
@Autowired
public StudentAnnotation(@Qualifier("course") CourseAnnotation courseAnnotation) {
this.courseAnnotation = courseAnnotation;
}
public void showCourse() {
System.out.println(courseAnnotation.hashCode());
}
}
- @Scope注解来显式指定Bean作用范围
@Scope("prototype")
@Component
public class Car {
}