• spring注解


    Spring注释的优点,可以有效的减少配置的工作,和java代码放在一起,增加程序的内聚性,无须频繁的在程序文件和配置文件之间切换,保持思路的一致性。

    疑问:程序的可读性。。

    配置

    Spring 2.1 添加了一个新的 context 的 Schema  命名空间,该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。我们知道注释本身是不会做任何事情的,它仅提供元数据信息。要使元数 据信息真正起作用,必须让负责处理这些元数据的处理器工作起来。使用 <context:annotation-config/> 简化配置

    1、使用 @Autowired 注释

    @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。@Autowired注释是按类型进行匹配。

    example:

      1、对成员变量进行注释

      public class Boss {
       @Autowired    private Car car;
       @Autowired    private Office office;
       …       }

         可以省略setter方法。

    2、对方法进行注解

    public class Boss {    private Car car;    private Office office;
        @Autowired    public void setCar(Car car) {      this.car = car;    }
       @Autowired    public void setOffice(Office office) {      this.office = office;    }    … }

    3、对构造函数使用注解

    public class Boss {    private Car car;    private Office office;
       @Autowired    public Boss(Car car ,Office office){      this.car = car;      this.office = office ;    }
       … }

    对类方法和构造函数使用注解,就是按类型对入参进行注入。

    对于候选bean的个数不为1的处理:

    默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的  Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。

    1、当候选bean的个数为0时

    当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。

    一般情况下,使用 @Autowired 的地方都是需要注入 Bean 的。所以在实际项目中,很少会这么使用。

    2、当候选bean的个数超过1个

    如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。

    解决方法:通过 @Qualifier 注释指定注入 Bean 的名称,消除歧义。

    例子:

    public class Boss {    @Autowired    private Car car;
       @Autowired    @Qualifier("office")    private Office office;    …

       public Boss(Car car , @Qualifier("office")Office office){      this.car = car;      this.office = office ;   } }

    @Qualifier 只能和 @Autowired 结合使用,是对 @Autowired 有益的补充。一般来讲,@Qualifier 对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。

    2、@Resource

    @Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource  默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将  @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name  属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定  type 属性,这时将通过反射机制使用 byName 自动注入策略。

    3、@PostConstruct 和  @PreDestroy

    JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和  @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了  @PreDestroy 的方法将在类销毁之前调用。

    使用 @PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化 / 销毁时被执行。

    4、@Component

    能否也通过注释定义 Bean,从 XML 配置文件中完全移除 Bean 定义的配置呢?答案是肯定的,我们通过 Spring 2.5 提供的 @Component 注释就可以达到这个目标了。

    example:

    @Component("office")

    @Component 有一个可选的入参,用于指定 Bean 的名称,在 Boss 中,我们就将 Bean 名称定义为“boss”。

    在使用 @Component 注释后,Spring 容器必须启用类扫描机制以启用注释驱动 Bean 定义和注释驱动 Bean 自动注入的策略。Spring 2.5 对 context 命名空间进行了扩展,提供了这一功能,请看下面的配置:<context:component-scan base-package="com.baobaotao"/>

    <context:component-scan/> 还允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式:

    过滤器类型 说明
    注释 假如 com.baobaotao.SomeAnnotation 是一个注释类,我们可以将使用该注释的类过滤出来。
    类名指定 通过全限定类名进行过滤,如您可以指定将 com.baobaotao.Boss 纳入扫描,而将 com.baobaotao.Car 排除在外。
    正则表达式 通过正则表达式定义过滤的类,如下所示: com.baobaotao.Default.*
    AspectJ 表达式 通过 AspectJ 表达式定义过滤的类,如下所示: com. baobaotao..*Service+

    下面是一个简单的例子:

    <context:component-scan base-package="com.baobaotao">    <context:include-filter type="regex"      expression="com.baobaotao.service..*"/>    <context:exclude-filter type="aspectj"      expression="com.baobaotao.util..*"/> < /context:component-scan>

    值得注意的是 <context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean  定义的功能,同时还启用了注释驱动自动注入的功能,因此当使用  <context:component-scan/> 后,就可以将  <context:annotation-config/> 移除了。

    @Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。

    注释配置和 XML 配置的适用场合

    是否有了这些 IOC 注释,我们就可以完全摒除原来 XML 配置的方式呢?答案是否定的。有以下几点原因:

    注释配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的,(如 Service 使用了哪几个 DAO  类),这种配置信息不会在部署时发生调整,那么注释配置优于 XML 配置;反之如果这种依赖关系会在部署时发生调整,XML  配置显然又优于注释配置,因为注释是对 Java 源代码的调整,您需要重新改写源代码并重新编译才可以实施调整。

    如果 Bean 不是自己编写的类(如 JdbcTemplate、SessionFactoryBean 等),注释配置将无法实施,此时 XML 配置是唯一可用的方式。

    注释配置往往是类级别的,而 XML 配置则可以表现得更加灵活。比如相比于 @Transaction 事务注释,使用 aop/tx 命名空间的事务配置更加灵活和简单。

    所以在实现应用中,我们往往需要同时使用注释配置和 XML  配置,对于类级别且不会发生变动的配置可以优先考虑注释配置;而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置。Spring  会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起。

  • 相关阅读:
    【服务器】Https服务配置
    【小程序】模拟请求加载数据(本地数据(无服务器))
    BlockingQueue深入解析
    通过maven下载源码和javadoc方法
    运维随笔
    Linux的虚拟内存管理-如何分配和释放内存,以提高服务器在高并发情况下的性能,从而降低了系统的负载
    java写卷积神经网络---CupCnn简介
    使用tcmalloc替换系统的malloc
    Java 进程占用 VIRT 虚拟内存超高的问题研究
    Java8 jvm参数
  • 原文地址:https://www.cnblogs.com/zhaofei/p/3298894.html
Copyright © 2020-2023  润新知