概述
在spring中,不管是使用xml还是使用注解,实质上都是为spring容器提供bean的定义信息。而spring容器能够成功启动的三大重要因素是:Bean定义信息、Bean实现类、以及spring本身。如果采用XML配置Bean,那么Bean实现类和Bean定义信息是分离的,如果是用注解,那么Bean的定义信息和实现类都是在一起的,表现在Bean实现类的注解上。
下面是一个简单的dao层的bean注解配置:
package cn.qing.spring.dao;
import org.springframework.stereotype.Component;
@Component("userDao")
public class UserDao {
}
在UserDao中使用@Component注解对其进行标注,它会被Spring容器识别,然后自动转换成能被容器管理的Bean。它等效于一下的XML配置:
<bean id="userDao" class="cn.qing.spring.dao.UserDao"/>
除了
@Component注解外,Spring还提供了3个功能和@Component基本等效的注解,它们分别用于对DAO、service、及web层的controller进行注解,也称这些注解为Bean的泛型注解。
@Repository:用于对dao实现类进行标注。
@Service:用于对service层实现类进行标注。
@Controller:用于对web的控制层实现类进行标注。
之所以在@Component注解之外又定义3个注解,是为了让注解类本身的用途清晰化。此外spring将赋予它们特殊的功能,所以推荐使用特别的注解标注特定的Bean.
只是在Bean的实现类上添加上以上注解还是不够的,spring并不会自动扫描出这些带注解的类并将其转换成Bean,所以需要在spring的配置文件中配置spring需要扫描的包,使用下面的<context:component-scan />标签进行配置:
<!-- 在使用注解时,在此配置spring要扫描加载的bean的base package -->
<context:component-scan base-package="cn.qing.spring"/>
自动装配Bean:
@Repository("userDao")
public class UserDao {
@Autowired
private PersonInfo personInfo;
public void printPersonInfo()
{
System.out.println("personInfo:"+personInfo.toString());
}
上面的personInfo对象是使用 @Autowired注解进行注入。
使用@Autowired注解进行bean属性的自动注入,等同于下面的XML配置:
<property name="personInfo" ref="personInfo"/>
而且使用@Autowired注解不需要为要注入的属性对象提供setter和getter方法,
@Autowired注解是按照类型进行装配的,在运行时spring查找容器中匹配的bean,当有且只有一个匹配的bean时,spring将其注入到由@Autowired配置的变量中。在使用@Autowired注解是可以结合@Qualifier注解一起使用,
@Qualifier注解是用来指定注入Bean的名称,如果指定的名称在spring中不存在,spring容器会报错。
@Repository("userDao")
public class UserDao {
@Autowired
@Qualifier("personInfo")
private PersonInfo personInfo;
使用注解配置bean的作用范围:
通过注解配置的bean和通过<bean>标签配置的Bean一样,默认的作用范围都是singleton,在使用注解配置scope的时候,spring提供的注解是@Scope,它可以显示指定bean的作用范围。
@Scope("prototype")
@Repository("userDao")
public class UserDao {
@Autowired
@Qualifier("personInfo")
private PersonInfo personInfo;
上面的代码使用@Scope注解将bean的作用范围设置为prototype,这样每次spring容器都返回一个新的bean实例。在xml中配置bean时,可以设置bean的init-method属性和destroy-method属性来配置bean的初始化和销毁时执行的方法,spring支持java中提供的注解:@PostConstruct和@PreDestroy来设置初始化和销毁bean时的方法。
<span style="white-space:pre"> </span>@PostConstruct
public void initMethod()
{
System.out.println("this is init method!");
}
@PreDestroy
public void destroyMethod()
{
System.out.println("this is destroy method.");
}
值得说明的是,当使用@PostConstruct和
@PreDestroy注解配置Bean时,可以有多个对应的方法,spring在执行的时候也会把设置过这两个注解的所有方法都执行。