《Spring注解入门15502.pdf》由会员分享,可在线阅读,更多相关《Spring注解入门15502.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Spring 注解入门 1.使用 Spring注解来注入属性 1.1.使用注解以前我们是怎样注入属性的 类的实现:Java代码 1.public class UserManagerImpl implements UserManager 2.private UserDao userDao;3.public void setUserDao(UserDao userDao)4.this.userDao=userDao;5.6.7.配置文件:Java代码 1.2.3.4.5.6.1.2.引入Autowired注解(不推荐使用,建议使用Resource)类的实现(对成员变量进行标注)Java代码 1.p
2、ublic class UserManagerImpl implements UserManager 2.Autowired 3.private UserDao userDao;4.5.或者(对方法进行标注)Java代码 1.public class UserManagerImpl implements UserManager 2.private UserDao userDao;3.Autowired 4.public void setUserDao(UserDao userDao)5.this.userDao=userDao;6.7.8.配置文件 Java代码 1.2.3.4.Autowir
3、ed可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。以上两种不同实现方式中,Autowired的标注位置 不同,它们都会在 Spring在初始化userManagerImpl这个 bean时,自动装配 userDao这个属性,区别是:第一种实现 中,Spring会直接将 UserDao类型的唯一一个 bean赋值给 userDao这个成员变量;第二种实现中,Spring会调用 setUserDao方法来将 UserDao类型的唯一一个 bean装配到 userDao这个属性。1.3.让Autowired工作起来 要使Autowired能够工作,还需要在配置文件中加入以下代码 Ja
4、va代码 1.1.4.Qualifier Autowired是根据类型进行自动装配的。在上面的例子中,如果当 Spring上下文中存在不止一个 UserDao类型的 bean时,就会 抛出 BeanCreationException异常;如果 Spring上下文中不存在 UserDao类型的 bean,也会抛出 BeanCreationException异常。我们可以使用Qualifier配合Autowired来解决这些问题。1.可能存在多个 UserDao实例 Java代码 1.Autowired 2.public void setUserDao(Qualifier(userDao)User
5、Dao userDao)3.this.userDao=userDao;4.这样,Spring会找到 id 为 userDao的 bean进行装配。2.可能不存在 UserDao实例 Java代码 1.Autowired(required=false)2.public void setUserDao(UserDao userDao)3.this.userDao=userDao;4.1.5.Resource(JSR-250标准注解,推荐使用它来代替 Spring专有的Autowired注解)Spring 不但支持自己定义的Autowired注解,还支持几个由 JSR-250规范定义的注解,它们分别
6、是Resource、PostConstruct以及PreDestroy。Resource的作用相当于Autowired,只不过Autowired按 byType自动注入,而Resource默认按 byName自动注入罢了。Resource有两个属性是比较重要的,分别是 name和 type,Spring将Resource注解的 name属性 解析为 bean的名字,而 type属性则解析为 bean的类型。所以如果使用 name属性,则使用 byName的自动注入策略,而使用 type属性时则使 用byType自动注入策略。如果既不指定 name也不指定 type属性,这时将通过反射机制使用b
7、yName自动注入策略。Resource装配顺序 1.如果同时指定了 name和 type,则从 Spring上下文中找到唯一匹配的 bean进行装配,找不到则抛出异常 2.如果指定了 name,则从上下文中查找名称(id)匹配的 bean进行装配,找不到则抛出异常 3.如果指定了 type,则从上下文中找到类型匹配的唯一 bean进行装配,找不到或者找到多个,都会抛出异常 4.如果既没有指定 name,又没有指定 type,则自动按照 byName方式进行装配(见 2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;1.6.PostConstruct(JS
8、R-250)在方法上加上注解PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化 Bean,并装配 Bean的属性(依赖注入)。它的一个典型的应用场景是,当你需要往 Bean里注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的 setter方法时,如:Java代码 1.public class UserDaoImpl extends HibernateDaoSupport implements UserDao 2.private SessionFactory mySessionFacotry;3.Resource 4.pu
9、blic void setMySessionFacotry(SessionFactory sessionFacotry)5.this.mySessionFacotry=sessionFacotry;6.7.PostConstruct 8.public void injectSessionFactory()9.super.setSessionFactory(mySessionFacotry);10.11.12.这里通过PostConstruct,为UserDaoImpl的父类里定义的一个sessionFactory私有属性,注入了我们自己定义 的 sessionFactory(父类的 setSe
10、ssionFactory方法为 final,不可复写),之后我们就可以通过调用 super.getSessionFactory()来访问该属性了。1.7.PreDestroy(JSR-250)在方法上加上注解PreDestroy,这个方法就会在 Bean初始化之后被 Spring容器执行。由于我们当前还没有需要用到它的场景,这里不不去演示。其用法同PostConstruct。1.8.使用简化配置 Spring2.1添加了一个新的 context的 Schema命名空间,该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配 置。我们知道注释本身是不会做任何事情的,它仅提供元数据信息
11、。要使元数据信息真正起作用,必须让负责处理这些元数据的处理器工作起来。AutowiredAnnotationBeanPostProcessor和 CommonAnnotationBeanPostProcessor就是处理这些注释元数据的处理器。但是直接在Spring配置文件中定义这些 Bean显得比较笨拙。Spring为我们提供了一种方便的注册这些 BeanPostProcessor的方式,这就 是:Java代码 1.6.7.将隐式地向 Spring容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcesso
12、r、PersistenceAnnotationBeanPostProcessor以及 RequiredAnnotationBeanPostProcessor这 4 个 BeanPostProcessor。2.使用 Spring注解完成 Bean的定义 以上我们介绍了通过Autowired或Resource来实现在 Bean中自动注入的功能,下面我们将介绍如何注解 Bean,从而从 XML配置文件中完全移除 Bean定义的配置。2.1.Component(不推荐使用)、Repository、Service、Controller 只需要在对应的类上加上一个Component注解,就将该类定义为一个
13、 Bean了:Java代码 1.Component 2.public class UserDaoImpl extends HibernateDaoSupport implements UserDao 3.4.使用Component注解定义的 Bean,默认的名称(id)是小写开头的非限定类名。如这里定义的 Bean名称就是 userDaoImpl。你也可以指定 Bean的名称:Component(userDao)Component是所有受 Spring管理组件的通用形式,Spring还提供了更加细化的注解形式:Repository、Service、Controller,它们分别对应存储层 Be
14、an,业务层 Bean,和展示层 Bean。目前版本(2.5)中,这些注解与 Component的语义是一样的,完全通用,在 Spring以后的版本中可能会给它们追加更多的语义。所以,我们推荐使用Repository、Service、Controller来替代Component。2.2.使用让 Bean定义注解工作起来 Java代码 1.6.7.这里,所有通过元素定义 Bean的配置内容已经被移除,仅需要添加一行配置就解决所有问题了Spring XML配置文件得到了极致的简化(当然配置元数据还是需要的,只不过以注释形式存在罢了)。的 base-package属性指定了需要扫描的类包,类包及其递
15、归子包中所有的类都会被处理。还允许定义过滤器将基包下的某些类纳入或排除。Spring支持以下 4 种类型的过滤方式:过滤器类型 表达式范例 说明 注解 org.example.SomeAnnotation 将所有使用 SomeAnnotation注解的类过滤出来 类名指定 org.example.SomeClass 过滤指定的类 正则表达式 com.kedacom.spring.annotation.web.*通过正则表达式过滤一些类 AspectJ表达式 org.example.*Service+通过 AspectJ表达式过滤一些类 以正则表达式为例,我列举一个应用实例:Java代码 1.2
16、.3.值得注意的是配置项不但启用了对类包进行扫描以实施注释驱动 Bean定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor和 CommonAnnotationBeanPostProcessor),因此当使用后,就可以将移除了。2.3.使用Scope来定义 Bean的作用范围 在使用 XML定义 Bean时,我们可能还需要通过 bean的 scope属性来定义一个 Bean的作用范围,我们同样可以通过Scope注解来完成这项工作:Java代码 1.Scope(session)2.Component()3.public class UserSessionBean implements Serializable 4.5.3.参考 http:/ http:/ http:/static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config http:/static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-classpath-scanning