Spring2.5开始引入了@Component注解来管理Bean组件,在2.5以前管理Bean都是使用XML配置文件:<Bean name=”xxx” class=””>,这样在一个稍微大一点的系统中就需要配置很多的bean,对程序员来说是一件麻烦事,@Component的出现改变了这一事实,一个注解就可以免去XML配置,如下
@Component
public class User {
private String userName="erikchang";
public String toString() {
return this.userName;
}
}
这样的一个User类就表示他已经成为Spring管理中的一个Bean,写一个Spring的配置文件bean.xml:
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="spring.ioc" />
<!-- 配置文件中仅仅这一行,component-scan表示要求Spring扫描base-package指定的路径下所有文件,有@Component注解的将自动加入Spring的Bean管理中 -->
</beans>
使用这样一个简单的配置文件就可以任意的使用Bean了,写一个测试类,看看是否真的纳入的Spring的Bean管理:
public class TestComponent {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context = new ClassPathXmlApplicationContext(
"bean.xml");
User user = (User) context.getBean("user");
System.out.println(user.toString());
}
}
运行一下,可以看到确实如此,User类已经成为一个Spring管理中的Bean。
使用@Component注解一个Class,不指定Bean名称时Spring会自动生成一个和class同名且首字母小写的bean,如上则生成一个名为user的Bean,使用ApplicationContext就可以获取一个名为user的bean,在使用@Component注解的时候也可以指定Bean名称:
@Component(value=”user1”)、@Component(“user1”)
这两种方式都将生成一个名为user1的Bean,这个时候如果context.getBean(“user”)就会出错,因为名为user的bean已经不存在了。
@Component注解是一个通用形式,也可以说一个顶级注解,Spring2.5中引入了多个具体类型的注解,如@Service、@Repository、@Controller,其中@Service用来注解服务层的类,@Repository用来注解持久化层的类,@Controller用来注解控制器类。建议不同用途的class中不要都用@Component来注解,这样会带来一些麻烦。
@Component等注解后的类Spring都会在ApplicationContext中注册相应的Bean,如果在某些时候不希望@Repository注解的class注册成Bean,则可以如下配置:
<context:component-scan base-package="spring.ioc">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
使用exclude-filter来过滤不需要注册Bean的注解,同时也可以使用use-default-filters="false" 属性来禁止Spring的自动注册Bean,如下:
<context:component-scan base-package="spring.ioc" use-default-filters="false"/>
这样的配置所有注解后的class都不会自动在ApplicationContext中注册的。
使用@Component注解会自动注册Bean,Bean的引用,就是2.5以前XML配置中的
<bean …><property ref=”xxx”></bean>,2.5中提供了@Autowired注解,使用这个注解就解决了Bean的相互注入,比如有2个类,分别如下:
User类:
@Component("user1")
public class User {
private String userName="erikchang";
public String toString() {
return this.userName;
}
}
Family类:
@Repository
public class Family {
@Autowired
private User user;
public String toString() {
return "家庭成员:"+user.toString();
}
}
在Family类中将要使用User类,这个时候就需要将User注入Family中,在2.5以前需要使用set注入或者构造子注入结合XML文件配置来完成,2.5中仍然可以使用set注入和构造子注入,同时也可以直接注解实体来完成注入过程,如上类中,直接在User实体添加@Autowired注解就完成了全部注入,当然也可以使用set方法、构造函数,同样使用@Autowired注解对应的set方法、构造函数,注入的效果都是一样。使用@Autowired注解Family类中的User后,在Family类中就可以自由的使用User类了。
--------------今天太忙了,写了这一点,待续.....