在使用beans.xml文件配置容器管理的bean时,即使使用了注解方式来对bean属性进行装配的情况下,如果容器需要管理的bean太多,也会造成beans.xml文件的臃肿,所以spring提供了自动扫描及管理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"
<!-- 引入 context 命名空间 -->
xmlns:context = "http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
<!-- 加入 context scheme文件 -->
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 打开自动扫描功能 自动扫描功能已经提供了注解功能所需要的处理器,所以不再需要配置打开注解功能(<context:annotation-config/>) -->
<context:component-scan base-package="com.risetek"/>
......
</beans>
经过上述配置后,在spring容器实例化的时候,容器会自动扫描“com.risetek”包下的所有类,我们只要在需要被容器管理的类上加上一个注解,容器就会将该类纳入容器进行管理了,而表示该类需要被容器管理的注解有以下几种:
@Component :表示该类是一个通用的Bean
@Service :表示该类是一个服务层的Bean
@Controller :表示该类是一个控制层的Bean
@Repository :表示该类是一个数据访问层的Bean
以上四种形式的注解都将会告诉spring容器,该类需要被容器管理,目前版本的spring对四种注解类型并没有做特殊的处理,四种注解的使用效果都是一样
下面以@Componet为例,如何使用注解标识需要被管理的类:
PersonDaoImpl.java
//括号中的字符串表明该类在容器中的名称,如果不指定名称,则容器中的名称则为该类的简单名称(类名第一个字母小写)
@Component(“personDao”)
public class PersonDaoImpl implements PersonDao {
....
}
PersonServiceBean.java
@Component
public class PersonServiceBean implements PersonService {
//为属性按名称进行装配
@Resource(name="personDao")
private PersonDao personDao;
}
经过配置@Component注解,就将PersonServiceBean和PersonDaoImpl类交给了spring容器管理,在从容器中获取PersonServiceBean实例的时候,容器也会自动将PersonServiceBean中的属性按照@Resource注解方式进行装配。
同样也可以通过注解方式设置Bean类的作用域以及初始化、销毁方法
@Component
@Scope("prototype")
public class PersonServiceBean implements PersonService {
@Resource
private PersonDao personDao;
public PersonServiceBean(){
System.out.println("PersonServiceBean....");
}
//此方法会在构造方法执行之后执行
@PostConstruct
public void init() {
System.out.println("init...");
}
//此方法会在对象销毁之前执行
@PreDestroy
public void destory(){
System.out.println("destory...");
}
}