《spring注解介绍》由会员分享,可在线阅读,更多相关《spring注解介绍(6页珍藏版)》请在金锄头文库上搜索。
1、一、各种注解方式1.Autowired 注解(不推荐使用,建议使用Resource)Autowired 可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。Autowired 的标注位置不同,它们都会在 Spring 在初始化这个 bean 时,自动装配这个属性。要使Autowired 能够工作,还需要在配置文件中加入以下Xml 代码1. 2. Qualifier 注解Autowired 是根据类型进行自动装配的。例如,如果当 Spring 上下文中存在不止一个 UserDao 类型的 bean 时,就会抛出 BeanCreationException 异常;如果 Spring 上下
2、文中不存在 UserDao 类型的 bean,也会抛出 BeanCreationException 异常。我们可以使用Qualifier 配合Autowired 来解决这些问题。如下:1). 可能存在多个 UserDao 实例Java 代码1. Autowired 2. Qualifier(“userServiceImpl“) 3. public IUserService userService; 或者Java 代码1. Autowired 2. public void setUserDao(Qualifier(“userDao“) UserDao userDao) 3. this.userD
3、ao = userDao; 4. 这样,Spring 会找到 id 为 userServiceImpl 和 userDao 的 bean 进行装配。2). 可能不存在 UserDao 实例Java 代码1. Autowired(required = false) 2. public IUserService userService; 3. Resource 注解JSR-250 标准注解,推荐使用它来代替 Spring 专有的Autowired 注解。Resource 的作用相当于Autowired,只不过Autowired 按 byType 自动注入,而Resource 默认按byName 自
4、动注入罢了。Resource 有两个属性是比较重要的,分别是 name 和type,Spring 将 Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。要使Autowired 能够工作,还需要在配置文件中加入以下:Xml 代码1. Resource 装配顺序:a.如果同时指定了 name 和 type,则从
5、Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常b.如果指定了 name,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常c.如果指定了 type,则从上下文中找到类型匹配的唯一 bean 进行装配,找不到或者找到多个,都会抛出异常d.如果既没有指定 name,又没有指定 type,则自动按照 byName 方式进行装配(见 2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;4. PostConstruct(JSR-250)注解在方法上加上注解PostConstruct,这个方法就会在 Bean 初始化之后
6、被 Spring 容器执行(注:Bean 初始化包括,实例化 Bean,并装配 Bean 的属性(依赖注入)。它的一个典型的应用场景是,当你需要往 Bean 里注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的 setter 方法时,如:Java 代码1. public class UserDaoImpl extends HibernateDaoSupport implements UserDao 2. 3. private SessionFactory mySessionFacotry; 4. 5. Resource 6. public void setMySessionFacot
7、ry(SessionFactory sessionFacotry) 7. 8. this.mySessionFacotry = sessionFacotry; 9. 10. 11. PostConstruct 12. public void injectSessionFactory() 13. 14. super.setSessionFactory(mySessionFacotry); 15. 16. 这里通过PostConstruct,为 UserDaoImpl 的父类里定义的一个 sessionFactory 私有属性,注入了我们自己定义的 sessionFactory(父类的 setSe
8、ssionFactory 方法为final,不可复写),之后我们就可以通过调用 super.getSessionFactory()来访问该属性了。5. PreDestroy(JSR-250)注解在方法上加上注解PreDestroy,这个方法就会在 Bean 初始化之后被 Spring 容器执行。其用法同PostConstruct。和PostConstruct 区别在于:PostConstruct 注释的方法将在类实例化后调用,而标注了 PreDestroy 的方法将在类销毁之前调用。6. Component 注解 (不推荐使用)只需要在对应的类上加上一个Component 注解,就将该类定义为
9、一个 Bean 了。Spring 还提供了更加细化的注解形式:Repository、Service、Controller,它们分别对应存储层 Bean,业务层 Bean,和展示层 Bean。目前版本(2.5)中,这些注解与Component 的语义是一样的,完全通用,在 Spring 以后的版本中可能会给它们追加更多的语义。所以,我们推荐使用Repository、Service、Controller 来替代Component。7.Scope 注解在使用 XML 定义 Bean 时,我们可能还需要通过 bean 的 scope 属性来定义一个 Bean 的作用范围,我们同样可以通过Scope 注
10、解来完成这项工作:Java 代码1. Scope(“session“) 2. Component() 3. public class UserSessionBean implements Serializable 4. . . 5. 二、配置启用注解(注意以下配置需要使用 spring2.5 的头文件,在 spring3.0 中不适用)1.使用简化配置Spring2.1 添加了一个新的 context 的 Schema 命名空间,该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。我们知道注释本身是不会做任何事情的,它仅提供元数据信息。要使元数据信息真正起作用,必须让负责处理
11、这些元数据的处理器工作起来。AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor 就是处理这些注释元数据的处理器。但是直接在 Spring 配置文件中定义这些 Bean 显得比较笨拙。Spring 为我们提供了一种方便的注册这些 BeanPostProcessor 的方式,这就是,以下是 spring 的配置。Xml 代码1. 6. 7. beans 将隐式地向 Spring 容器注册了AutowiredAnnotationBeanPostProcessor 、CommonAnnotationBeanP
12、ostProcessor 、PersistenceAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor这 4 个 BeanPostProcessor。2.使用让 Bean 定义注解工作起来Xml 代码1. 6. 7. beans 这里,所有通过元素定义 Bean 的配置内容已经被移除,仅需要添加一行配置就解决所有问题了Spring XML 配置文件得到了极致的简化(当然配置元数据还是需要的,只不过以注释形式存在罢了)。的 base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。还允许定义过
13、滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式:过滤器类型 | 表达式范例 | 说明注解 | org.example.SomeAnnotation | 将所有使用 SomeAnnotation 注解的类过滤出来类名指定 | org.example.SomeClass | 过滤指定的类正则表达式 | com.kedacom.spring.annotation.web.* | 通过正则表达式过滤一些类AspectJ 表达式 | org.example.*Service+ | 通过 AspectJ 表达式过滤一些类以正则表达式为例,我列举一个应用实例:Xml 代码1.
14、2. 3. context:component-scan 值得注意的是配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用后,就可以将移除了。3. 是不支持 spring 的Transcation 和 EJB 的 Springs Transactional or EJB3s TransactionAttribute annotation。用此配置可以达到目的。4. 使用Scope 来定义 Bean 的作用范围在使用 XML 定义 Bean 时,我们可能还需要通过 bean 的 scope 属性来定义一个 Bean 的作用范围,我们同样可以通过Scope 注解来完成这项工作:Java 代码1. Scope(“session“) 2. Component() 3. public class UserSessionBean implements Serializable 4. . 5.