zoukankan      html  css  js  c++  java
  • spring的注入

    1 可能遇到的问题:

    异常信息 NoSuchBeanDefinitionException: No matching bean of type [...]或是NoSuchBeanDefinitionException: No unique bean of type [...] 这两者具体区别暂不深究,但究其原因都是因为找不到某类型的bean,后面再讲。

    异常信息 expected single matching bean but found 2,很好理解,之前是找不到,现在是找到不止一个,spring不知道该怎么办了。

    ...待补充

    2 注入和注出

         这是未经考证的说法,我认为区分为这两者之后比较容易理解注入问题。严格来讲注入和注出关系被以各种方式描述在了beanDefinition里面,类似于消费者和生产者。他们的行为往往发生在spring容器初始化时,除非指定为了prototype。

         排查问题时从这两个角度来看,注入是不是不对,注出是不是不对。

    2.1 常见的注出方式

    1. 我们必须要了解最简单直接的方式,即

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" />
    

      就这种方式而言也另有工厂方法方式,其中还分为静态工厂以及实例工厂,不细讲

    2. 在spring后续引入注解后,在对类施加@Service @Component @Controller @Repository这四种注解(他们在注出上作用一样),并配置包扫描:

    <context:component-scan base-package="com.mypackage"/>
    

      同时配置注解的类要在包扫面的路径之内。注解注出的bean默认的id和name是类名第一个字母改为小写

    2.2 常见的注入方式

      注入指的是通知spring你的bean对哪些bean拥有实例或称依赖,需要spring做“填充”。

    2.2.1.显式注入:setter注入(还有constructor注入,与此类似):  

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
           <ref>dataSource</ref>
        </property>
    </bean>
    

      setter注入需要有对应的setter方法,请注意驼峰命名,否则抛出找不到setter的异常。constructor注入需要对应的构造方法。

    2.2.2.自动装配

      default-autowire="byName/byType"

      特别注意,这个东西和@autowire没有半毛钱关系,一般出现在spring文件头,即<beans>标签内。这个设置会智能的扫描每个bean有哪些setter方法,并添加类似第一条的property。也就是说有此配置后就不需要上面的<property></property>标签了。不同之处在于显式配置可自由指定所需的bean,default-autowire只有根据名称、类型来匹配。

    2.2.3.注解注入

      首先要启动注解注入,主要由AutowiredAnnotationBeanPostProcessor、 CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor以及requiredAnnotationBeanPostProcessor这四个类来负责检测注解并实现注入的,所以spring容器需要得到这几个类的bean,这里有两种方式:

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

      使用到哪个注解就注册对应的PostProcessor,假如使用autowired,就用这个就可以了。其他的具体对应关系请自行研究。

    • 懒汉式
    <context:annotation-config /> 
    

      这个配置将隐式地向 Spring 容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor以及equiredAnnotationBeanPostProcessor这 4 个 BeanPostProcessor。而上述的 component-scan该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。这是因为前者默认包含着这样一个属性:annotation-config="true",假如我们将其显式指定为false,那么就要另外添加<context:annotation-config/>配置。


    启动注解注入之后,当然要使用注解:

    @autowired

      @autowired 注入的注解,默认是按type注入,但可以用@Qualifier("abc")改为byname。

      使用方法: 
        1.写在setter中如:
      
         @Autowired 
       setAbc(@Qualifier("abc")Abc abc)
    

      事实证明,写在方法前面的autowire可以无视方法名,如    

         @Autowired
         public void aaa(QuestionMarkDao questionMarkDao) {
              super.setBaseDao(questionMarkDao);
         }
    

      这样,和@postConstruct注解就相对比较接近了,不同在于前者可以带参数,参数会自动从容器中找对应的bean

       
    2.也可写在变量前,可以省略setter,如 
      
       @Autowired @Qualifier("abc")
      MyClass  myClass;
    

    @Resource 

      按name来注入的注解,找不到的时候尝试按type注入。byName指的是优先byName,如果找不到与属性名称相同的bean时再按照type进行查找。这里就会出现上面讲的两个异常了,第一种是没找到相同名字、也没有相同类型( No unique bean of type );第二种是有相同名字,但是类型不同(……);第三种是没有找到相同名字,但是相同类型的有多个( expected single matching bean but found 2)

      小细节,在子类中需要注入基类的某个属性a还不能用resource注入,因为假如使用子类,那么没有问题使用的是子类版本的属性a,假如代码运行到基类的代码,调用到a属性时,这时候使用的是基类的a,注入就没有意义了,容易nullpointer。所以在继承关系中有属性隐藏的时候,最好使用显式的注入方式,选择只注入基类,也可以只注入子类,或是都注入。
     
      使用方法(可以省略setter):
     
    @Resource
    MyClass myClass
    
    @Resource(name="otherName")
    MyClass myClass
    

      


    other stuff:

     
    同id的bean:
      两个bean拥有相同的id:在同一个文件中会报错的。但是如果通过<import,来自于不同的xml文件不会报错,spring会根据加载顺序来选择后一个bean,第一个bean直接无视。
    不同spring文件的default-autowire:
      是否会互相影响,我还没研究过,有人知道请告诉我
    p标签:
      p标签就是property
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
    p:dataSource-ref="dataSource" />
    

      需要引入xmlns以及schemaLocation

    value和ref的区别:

      前者是注入字符串值,后者注入容器内的bean(id为ref值的bean)

     
  • 相关阅读:
    The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph
    回溯法、子集树、排列树、满m叉树
    顺时针打印矩阵
    单调递增的数字
    nodejs
    nodejs + express + mangodb 项目搭建
    nodejs + express 项目初始化
    星星评分功能(带小数点的那种,5颗星,10分制)
    easyui 增加删除toolbar 显示异常问题
    sql 外键级联,触发器防删
  • 原文地址:https://www.cnblogs.com/violinn/p/3256880.html
Copyright © 2011-2022 走看看