概述
在spring中,不管是使用xml还是使用注解,实质上都是为spring容器提供bean的定义信息。而spring容器能够成功启动的三大重要因素是:Bean定义信息、Bean实现类、以及spring本身。如果采用XML配置Bean,那么Bean实现类和Bean定义信息是分离的,如果是用注解,那么Bean的定义信息和实现类都是在一起的,表现在Bean实现类的注解上。
下面是一个简单的dao层的bean注解配置:
- packagecn.qing.spring.dao;
- importorg.springframework.stereotype.Component;
- @Component("userDao")
- publicclassUserDao{
- }
- <beanid="userDao"class="cn.qing.spring.dao.UserDao"/>
@Repository:用于对dao实现类进行标注。
@Service:用于对service层实现类进行标注。
@Controller:用于对web的控制层实现类进行标注。
之所以在@Component注解之外又定义3个注解,是为了让注解类本身的用途清晰化。此外spring将赋予它们特殊的功能,所以推荐使用特别的注解标注特定的Bean.
只是在Bean的实现类上添加上以上注解还是不够的,spring并不会自动扫描出这些带注解的类并将其转换成Bean,所以需要在spring的配置文件中配置spring需要扫描的包,使用下面的<context:component-scan />标签进行配置:
- <!--在使用注解时,在此配置spring要扫描加载的bean的basepackage-->
- <context:component-scanbase-package="cn.qing.spring"/>
自动装配Bean:
- @Repository("userDao")
- publicclassUserDao{
- @Autowired
- privatePersonInfopersonInfo;
- publicvoidprintPersonInfo()
- {
- System.out.println("personInfo:"+personInfo.toString());
- }
上面的personInfo对象是使用 @Autowired注解进行注入。
使用@Autowired注解进行bean属性的自动注入,等同于下面的XML配置:
- <propertyname="personInfo"ref="personInfo"/>
- @Repository("userDao")
- publicclassUserDao{
- @Autowired
- @Qualifier("personInfo")
- privatePersonInfopersonInfo;
使用注解配置bean的作用范围:
通过注解配置的bean和通过<bean>标签配置的Bean一样,默认的作用范围都是singleton,在使用注解配置scope的时候,spring提供的注解是@Scope,它可以显示指定bean的作用范围。
- @Scope("prototype")
- @Repository("userDao")
- publicclassUserDao{
- @Autowired
- @Qualifier("personInfo")
- privatePersonInfopersonInfo;
上面的代码使用@Scope注解将bean的作用范围设置为prototype,这样每次spring容器都返回一个新的bean实例。在xml中配置bean时,可以设置bean的init-method属性和destroy-method属性来配置bean的初始化和销毁时执行的方法,spring支持java中提供的注解:@PostConstruct和@PreDestroy来设置初始化和销毁bean时的方法。
- <spanstyle="white-space:pre"></span>@PostConstruct
- publicvoidinitMethod()
- {
- System.out.println("thisisinitmethod!");
- }
- @PreDestroy
- publicvoiddestroyMethod()
- {
- System.out.println("thisisdestroymethod.");
- }