1.使用spring annotation之前,必须先在spring的配置文件中加入<context:component-scan/>
<beans … >
<!--Spring在容器初始化时将自动扫描base-package指定的包及其子包下的所有class文件-->
<context:component-scan base-package=”bookstore.dao” />
……
</beans>
2.@Repository 注解用于将数据访问层(DAO层)的类标识为Spring Bean。具体只需将该注解标注在DAO类上即可。
package bookstore.dao;
@Repository
public class UserDaoImpl implements UserDao{ …… }
3.@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:
@Component是一个泛化的概念,仅仅表示一个组件 (Bean),可以作用在任何层次。
@Service通常作用在业务层,但是目前该功能与@Component 相同。
@Constroller通常作用在控制层,但是目前该功能与@Component 相同。
当一个Bean被自动检测到时,会根据那个扫描器的BeanNameGenerator策略生成它的 bean 名称。
默认情况下,对于包含name属性的@Component、@Repository、@Service和@Controller,会把name取值作为 Bean 的名字。
如果这个注解不包含name值或是其他被自定义过滤器发现的组件,默认Bean名称会是小写开头的非限定类名。
4.使用@Required进行Bean的依赖检查
@Required
public void setProduct(Product product) {
this.product = product;
}
依赖检查的作用是,判断给定Bean的相应Setter方法是否都在实例化的时候被调用了。而不是判断字段是否已经存在值了。
Spring进行依赖检查时,只会判断属性是否使用了Setter注入。如果某个属性没有使用Setter注入,即使是通过构造函数已经为该属性注入了值,
Spring仍然认为它没有执行注入,从而抛出异常。另外,Spring只管是否通过Setter执行了注入,而对注入的值却没有任何要求,即使注入的 <null/>,
Spring也认为是执行了依赖注入。如果将该注解标注在非setXxxx()类型的方法则被忽略。
5.使用@Resource、@Autowired和@Qualifier指定Bean的自动装配策略
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
在下面的例子中,Spring会向加了注解的setter方法传递bean名为“dataSource”的Spring管理对象的引用。
@Resource(name="dataSource")
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
直接使用@Resource注解一个域(field)同样是可能的。通过不暴露setter方法,代码愈发紧凑并且还提供了域不可修改的额外益处。正如下面将要证明的,
@Resource注解甚至不需要一个显式的字符串值,在没有提供任何值的情况下,域名将被当作默认值。使用@Resource注解,相当于是使用setter方法进行依赖注入。
@Resource
private DataSource dataSource; // inject the bean named 'dataSource'
6.使用@Autowired和@Qualifier注解执行自动装配
使用@Autowired注解进行装配,只能是根据类型进行匹配。@Autowired注解可以用于Setter方法、构造函数、字段,甚至普通方法,前提是方法必须有至少一个参数。
@Autowired可以用于数组和使用泛型的集合类型。然后Spring会将容器中所有类型符合的Bean注入进来。@Autowired标注作用于Map类型时,如果Map的key为String类型,
则Spring会将容器中所有类型符合Map的value对应的类型的Bean增加进来,用Bean的id或name作为Map的key.
当容器中存在多个Bean的类型与需要注入的相同时,注入将不能执行,我们可以给@Autowired增加一个候选值,做法是在@Autowired后面增加一个@Qualifier标注,
提供一个String类型的值作为候选的Bean的名字。举例如下:
@Autowired(required=false)
@Qualifier("ppp") //将name为ppp的bean注入
public void setPerson(person p){}
@Qualifier甚至可以作用于方法的参数 ( 对于方法只有一个参数的情况,我们可以将@Qualifer标注放置在方法声明上面,但是推荐放置在参数前面),举例如下:
@Autowired(required=false)
public void sayHello(@Qualifier("ppp")Person p,String name){}
7.@Resource和@Qualifier注解
@Resource使用byName的方式执行自动封装。@Resource标注可以作用于带一个参数的Setter方法、字段,以及带一个参数的普通方法上。@Resource注解有一个name属性,
用于指定Bean在配置文件中对应的名字。如果没有指定name属性,那么默认值就是字段或者属性的名字。@Resource和@Qualifier的配合虽然仍然成立,
但是@Qualifier对于@Resource而言,几乎与name属性等效。
8.使用@Configuration和@Bean进行Bean的声明
以上是我个人总结,如果想看具体的内容,请查看http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-iocannt/