Spring和注入相关的注解主要有Autowired\Resource\Qualifier\Service\Controller\Repository\Component。
Autowired是自动注入,自动从Spring的上下文找到合适的bean来注入。
Resource用来指定名称注入。
Qualifier和Autowired配合来使用,指定bean的名称。
Service,Controller,Repository分别来标记类是Service层类,Controller层类,数据存储层的类,Spring扫描注解配置时,会标记这些类要生成的bean。
Component是一种泛型,标记类是组件,Spring扫描注解配置时,会标记这些类要生成bean。
Autowired和Resource是用来修饰字段,构造函数,或者设置方法,并做注入的。而Service,Controller,Repository,Component则是来修饰类的,标记这些类要生成的bean。
例子:
新建一个Maven项目,并在pom中添加Spring相关的依赖。
然后新建CarDao类,给它添加@Repository注解,代码如下:
package cn.outofmemory.helloannotation;
import org.springframework.stereotype.Repository;
@Repository
public class CarDao{
public void insertCar(String car){
String insertMsg = String.format("inserting car %s",car);
System.out.println(insertMsg);
}
}
新建CarService类,并给该类标注@Service注解,在这个类中定义了CarDao的字段,并通过Autowired来修饰此字段,这样上面定义的CarDao类的实例就会自动的注入到CarService的实例中去的。
package cn.outofmemory.helloannotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CarService{
@Autowired
private CarDao carDao;
public void addCar(String car){
this.carDao.insert(car);
}
}
注意,Autowired注解有一个可以为空的属性required,可以用来指定字段是否是必须的,如果是必须的,则在找不到合适的实例注入时会抛出异常。
在App.java中使用上面的测试下注解注入:
package cn.outofmemory.helloannotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App{
public static void main(String[] args){
ApplicationContext appContext = new AnnotationConfigApplicationContext("cn.outofmemory.helloannotation");
CarService service = appContext.getBean(CarService.class);
service.addCar("BMW");
}
}
配置Spring文件,在Spring配置文件中也可以使用下面的配置让Spring自动扫描注解配置
<context:annotation-config/>
<context:component-scan base-package="cn.outofmemory.helloannotation">
</context:component-scan>