学习笔记:Spring注解注入

来源:互联网 发布:学校机房安装软件 编辑:程序博客网 时间:2024/04/20 21:25

一、注解注入概述

  注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化得方法,使我们可以在稍后某个时刻方便的使用这些数据(通过解析注解来使用这些数据),用来将任何的信息或者元数据与程序元素(类、方法、成员变量等)进行关联。其实就是更加直观更加明了的说明,这些说明信息与程序业务逻辑没有关系,并且是供指定的工具或框架使用的。Annotation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的申明语句中。
  通常情况下我们会在xml配置文件中进行action , service, dao 等层的声明,然后并告知框架我们想要的注入方式,然后在类中声明要组合类的get,set方法。而通过Spring框架中注解的运用也就主要是解决这类问题的。
  注入是实现IOC的重要环节,即由容器动态的将某个依赖关系注入到组件之中,注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

二、注解注入使用过程

  在之前的依赖注入往往是采用xml配置的方式,采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。以下代码片段是一个xml配置的典型例子:

<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>   <bean id="personService" class="com.spring.service.impl.PersonServiceBean" >   <property name="personDao" ref="personDao"/>   </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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"></beans>

配置需要扫描的类。开启Spring的注解功能,这样Spring环境才会进行指定位置的扫描,进行类之间的关联组合:

<!-- 扫描注解类base-package:表示当前扫描的包,框架会根据包查找所有使用注解的类--><context:component-scan base-package="com.haiwi.spring.*" />

在需要被纳入Spring容器的类上加上相应的注解。声明注解类,让Spring框架可以识别

@Service("userService")public class UserServiceImpl implements UserService {………}

最后,就可以进行注入了

@Resource(name = "userService")private UserService userService;

三、注解注入的一些总结

(1)扫描配置<context:annotation-config /><context:component-scan />的区别
  xml配置文件中配置的作用是式地向 Spring 容器注册
AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、
PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 这 4 个BeanPostProcessor。注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。否则,在需要使用什么注解时候就需要声明对应类,例如如果你想使用@Autowired注解,那么就必须事先在Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>

  类似的使用@Resource 、@PostConstruct、@PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor;使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor;使用@Required的注解,就必须声明RequiredAnnotationBeanPostProcessor。
  而配置主要扫描加载base-package包下注解的类,同时包含标签的功能,也即是说此时标签完全可以移除了。
(2)注解的类型
- @Controller 用于标注控制层组件(如:Struts中的action)

@Controller@Scope("prototype")public class UserAction extends BaseAction<User>{}

  使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为”userAction”的action,这个名字是根据UserAction类名来取的。
  注:如果@Controller不指定其value,则默认的bean名字为这个类的类名首字母小写,如果指定【@Controller(value=”userAction”)】或者【@Controller(“userAction”)】,则使用value作为bean的名字。
  UserAction还使用了@Scope注解,@Scope(“prototype”)表示将Action的范围声明为原型,可以利用容器的scope=”prototype”来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope=”singleton”),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope=”prototype” 可以保证当有请求的时候都创建一个Action对象。
- @Repository 用于标注数据访问层组件

@Repository(value="userDao")public class UserDaoImpl extends BaseDaoImpl<User> {}

  @Repository(value=”userDao”)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。
  当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = “userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可。
- @Service 用于标注业务层组件

@Service("userService")public class UserServiceImpl implements UserService {}

  @Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做”userService”,这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的”userService”,然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的”userService”即可。
- @Component 表示泛型组件,当组件不好归类时,我们可以使用这个组件进行注解
  @Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
(3)注入的类型
  Autowired和Resource是用来修饰字段,构造函数,或者设置方法,并做注入的。
- @Autowired 自动注入,自动从spring的上下文找到合适的bean来注入
  @Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。

@Autowired @Qualifier("baseDao")private BaseDao baseDao;
  • @Resource 来指定名称注入
      名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Resource(name="baseDao")private BaseDao baseDao;

参考涉及博客:
http://www.cnblogs.com/xdp-gacl/p/3495887.html
http://www.cnblogs.com/leiOOlei/p/3713779.html

0 0