GVKun编程网logo

多次使用@Autowired(多次使用麻药对身体有什么危害)

9

在这里,我们将给大家分享关于多次使用@Autowired的知识,让您更了解多次使用麻药对身体有什么危害的本质,同时也会涉及到如何更有效地@Autowired、@Autowired报红线、@Autowi

在这里,我们将给大家分享关于多次使用@Autowired的知识,让您更了解多次使用麻药对身体有什么危害的本质,同时也会涉及到如何更有效地@Autowired、@Autowired 报红线、@Autowired 注解、@Autowired 的使用的内容。

本文目录一览:

多次使用@Autowired(多次使用麻药对身体有什么危害)

多次使用@Autowired(多次使用麻药对身体有什么危害)

我是春天的新手,所以我可能会问一个愚蠢的问题,但是无论如何…

我已经建立了Spring MVC 4.0应用程序。

我的设置是这样的:

控制器>>服务>> DAO

在控制器级别,我使用大约4到5个不同的@Autowired变量

@Autowiredprivate ClientService clientService;@Autowiredprivate CommentService commentService;@Autowiredprivate SearchService searchService;

在服务级别I中,Autowire也有几个DAO

@AutowiredSearchDAO searchDAO;@Autowiredprivate ActivityDAO activityDAO;@Autowiredprivate UserService userService;

我大约有10个不同的控制器,其中大多数控制器都@Autowire提供相同的服务,所以我的问题可以吗?

是否可以@Autowire根据需要多次使用,否则会占用过多的内存?会对我的应用程序产生其他影响吗?

我使用Spring 4.0 + Hibernate JPA

答案1

小编典典

没问题@Autowired

Autowired在Spring上下文中找到bean,并将其分配给变量。它只是引用Service / Dao bean的同一对象。它不会创建重复项。

但是,将如此多的对象注入一个类,就表明一个类做了很多事情。尽可能检查将类重构为多个类的可能性。

@Autowired

@Autowired

1.结论:@Autowired 默认是按照byType进行注入的,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。

2.byType是什么?byName是什么?

2.1.@Autowired修饰变量

@Autowired
DataSource ds;

byType是DataSource(变量类型)

byName是ds(变量名)

2.2.@Bean修饰变量

@Bean
public DataSource dataSource1() { 
    return new DruidDataSource(); 
}
@Bean
public DataSource dataSource2(){
    return new DruidDataSource(); 
}

byType是DataSource(方法返回值)

byName是dataSource1与dataSource2(方法名)

2.3.xml创建bean(之后再写)

3.解决冲突

3.1.byType相同,使用@Primary注解(优先级byType>@Primary>byName)

@Bean
@Primary
public DataSource dataSource1() { 
    return new DruidDataSource(); 
}
@Bean
public DataSource dataSource2(){
    return new DruidDataSource(); 
}

3.2.修改byName为指定名称(不修改变量名),@Qualifier("xxx")

@Autowired
@Qualifier("dataSource1")
DataSource ds;

 另注:@Resource(这个注解属于J2EE的)的标签,默认是按照byName方式注入的

@Autowired 报红线

@Autowired 报红线

代码可正常跑,不过红线看着有点难受,解决方案

使用 @Autowired (required=false)    或者 @Resource.

这两者区别网上一大堆

@Autowired 注解

@Autowired 注解

@Autowired 注解
自 Spring 诞生以来,<bean/> 的 autowire 和 dependency-check 属性便一直存在。当 JDK 5.0 正式发布后,Spring 针对 dependency-check 属性引入了对应的 @Required。同理,它针对 autowire 属性引入了对应的 @Autowired 注解,其定义摘录如下。

Java 代码 复制代码  收藏代码
  1. @Retention(RetentionPolicy.RUNTIME)     
  2. @Target ({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})   
  3. public @interface Autowired {     
  4.   
  5. // 是否必须满足依赖性检查     
  6. boolean required() default true;    
  7. }   
@Retention(RetentionPolicy.RUNTIME)  
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})
public @interface Autowired {  

//是否必须满足依赖性检查  
boolean required() default true; 
}


@Autowired 注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即 setter 方法,常见的各种方法都可以应用这一注解。比如,位于 autowiringdemo 项目中的 TestBean1 类的 testBean2 和 testBean3 属性应用了这一注解,具体如下。

Java 代码 复制代码  收藏代码
  1. @Autowired(required=false)     
  2. private TestBean2 testBean2;     
  3.   
  4. @Autowired    
  5. private TestBean3 testBean3;  
@Autowired(required=false)  
private TestBean2 testBean2;  

@Autowired 
private TestBean3 testBean3;


为启用这一注解,AutowiredAnnotationBeanPostProcessor 必须定义在 XML 配置文件中,示例如下,摘自 autowired.xml。运行时,testBean2 和 testBean3 受管 Bean 会自动注入到 testBean1 中。开发者是否注意到 @Autowired 暴露的 required 属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了 @Autowired 注解的属性和方法都必须找到合适的协作者,否则 DI 容器会抛出异常,通过调整 required 属性取值能够改变这一行为。

Java 代码 复制代码  收藏代码
  1. <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>   
  2. <bean id="testBean1" class="test.TestBean1"/>     
  3.   
  4. <bean id="testBean2" class="test.TestBean2"/>     
  5.   
  6. <bean id="testBean3" class="test.TestBean3"/>    
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean id="testBean1" class="test.TestBean1"/>  

<bean id="testBean2" class="test.TestBean2"/>  

<bean id="testBean3" class="test.TestBean3"/>

下面给出了应用于设值方法的 @Autowired 注解。

Java 代码 复制代码  收藏代码
  1. @Autowired(required=false)     
  2. public void setTestBean2(TestBean2 testBean2) {     
  3.     this.testBean2 = testBean2;     
  4. }     
  5.   
  6. @Autowired    
  7. public void setTestBean3(TestBean3 testBean3) {     
  8.    this.testBean3 = testBean3;     
  9. }   
@Autowired(required=false)  
public void setTestBean2(TestBean2 testBean2) {  
    this.testBean2 = testBean2;  
}  

@Autowired 
public void setTestBean3(TestBean3 testBean3) {  
   this.testBean3 = testBean3;  
}

下面给出了应用于构建器的 @Autowired 注解。

Java 代码 复制代码  收藏代码
  1. @Autowired(required=false)     
  2. public TestBean1(TestBean2 tb2, TestBean3 tb3) {   
  3.     this.testBean2 = tb2;    
  4.     this.testBean3 = tb3;     
  5. }  
@Autowired(required=false)  
public TestBean1(TestBean2 tb2, TestBean3 tb3) {
    this.testBean2 = tb2; 
    this.testBean3 = tb3;  
}

下面给出了应用于普通方法的 @Autowired 注解。

Java 代码 复制代码  收藏代码
  1. @Autowired    
  2. public void preparedBean(TestBean2 tb2, TestBean3 tb3){     
  3.     this.testBean2 = tb2;     
  4.     this.testBean3 = tb3;     
  5. }  
@Autowired 
public void preparedBean(TestBean2 tb2, TestBean3 tb3){  
    this.testBean2 = tb2;  
    this.testBean3 = tb3;  
}

除了能够自动注入普通受管 Bean 外,@Autowired 注解还能够注入一些特殊对象,比如受管 Bean 所在 DI 容器中的各种元数据对象,示例如下。@Autowired 将当前 DI 容器注入。


Java 代码 复制代码  收藏代码
  1. @Autowired    
  2. private ApplicationContext ac;   
@Autowired 
private ApplicationContext ac;


在 @Autowired 的 required 属性与 @Required 注解间进行取舍

@Required 是专门用于依赖性检查的注解,而 @Autowired 注解的 required 属性也能够用来承担依赖性检查工作。一旦 @Required 应用到目标设值方法,则 DI 容器必须成功调用这一设值方法,@Required 注解才认为依赖性条件得到满足,否则将抛出异常。相比之下,当我们将 @Autowired 注解的 required 属性设置为 false 时,即使未找到合适的协作者,异常都始终不会被抛出。

5.6.5  细粒度控制 Autowiring 策略

当多个协作者满足 autowire 注入条件时,我们可以启用 <bean/> 元素的 primary 属性,从而避免异常的抛出。但是,primary 属性不能够满足企业级应用的复杂需求,比如多个同一类型的不同协作者需要注入到同一受管 Bean 的时候。

下面给出了某 XML 配置示例。

Java 代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2"/>     
  2.   
  3. <bean id="testBean2b" class="test.TestBean2"/>     
  4.   
  5. <bean id="testBean2c" class="test.TestBean2"/>   
<bean id="testBean2a" class="test.TestBean2"/>  

<bean id="testBean2b" class="test.TestBean2"/>  

<bean id="testBean2c" class="test.TestBean2"/>

现在希望将它们分别注入到下面给出的属性中。显然,启用 primary 属性是不行的,因为一旦启用它,testBean2a、testBean2b、testBean2c 将引用到同一受管 Bean 中。


Java 代码 复制代码  收藏代码
  1. @Autowired 2.private TestBean2 testBean2a;     
  2.   
  3. @Autowired    
  4. private TestBean2 testBean2b;     
  5.   
  6. @Autowired    
  7. private TestBean2 testBean2c;   
@Autowired 2.private TestBean2 testBean2a;  

@Autowired 
private TestBean2 testBean2b;  

@Autowired 
private TestBean2 testBean2c;

为此,我们需要启用 <qualifier/> 元素及 @Qualifier 注解。调整后的 XML 配置示例如下。

Java 代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2">     
  2.     <qualifier value="2a"/>     
  3. </bean>     
  4.   
  5. <bean id="testBean2b" class="test.TestBean2">     
  6.     <qualifier value="2b"/>     
  7. </bean>     
  8.   
  9. <bean id="testBean2c" class="test.TestBean2">     
  10.     <qualifier value="2c"/>     
  11. </bean>   
<bean id="testBean2a" class="test.TestBean2">  
    <qualifier value="2a"/>  
</bean>  

<bean id="testBean2b" class="test.TestBean2">  
    <qualifier value="2b"/>  
</bean>  

<bean id="testBean2c" class="test.TestBean2">  
    <qualifier value="2c"/>  
</bean>

相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个 @Qualifier 注解分别指定了待注入的受管 Bean,比如 "2a" 表示要注入 <qualifier/> 的 value 属性取值为 "2a" 的目标受管 Bean。

Java 代码 复制代码  收藏代码
  1. @Autowired    
  2. @Qualifier("2a")     
  3. private TestBean2 testBean2a;     
  4.   
  5. @Autowired    
  6. @Qualifier("2b")     
  7. private TestBean2 testBean2b;    
  8.   
  9. @Autowired 10.@Qualifier("2c")     
  10. private TestBean2 testBean2c;  
@Autowired 
@Qualifier("2a")  
private TestBean2 testBean2a;  

@Autowired 
@Qualifier("2b")  
private TestBean2 testBean2b; 

@Autowired 10.@Qualifier("2c")  
private TestBean2 testBean2c;

@Qualifier 注解能够作用于属性、参数、类、其他注解等地方,比如下面给出了参数级的使用示例。

Java 代码 复制代码  收藏代码
  1. @Autowired    
  2. private void preparedBean(@Qualifier("2a") TestBean2 testBean2a, @Qualifier("2b") TestBean2 testBean2b,@Qualifier("2c") TestBean2 testBean2c) {     
  3.   
  4.     this.testBean2a = testBean2a;     
  5.     this.testBean2b = testBean2b;     
  6.     this.testBean2c = testBean2c;     
  7.   
  8. }   
@Autowired 
private void preparedBean(@Qualifier("2a") TestBean2 testBean2a, @Qualifier("2b") TestBean2 testBean2b,@Qualifier("2c") TestBean2 testBean2c) {  

    this.testBean2a = testBean2a;  
    this.testBean2b = testBean2b;  
    this.testBean2c = testBean2c;  

}

开发者还可以基于 @Qualifier 注解构建更复杂的 Autowiring 策略,下面给出了一注解示例。

Java 代码 复制代码  收藏代码
  1. @Retention(RetentionPolicy.RUNTIME)     
  2. @Target({ElementType.FIELD, ElementType.PARAMETER})     
  3. @Qualifier    
  4. public @interface FineQualifier {    
  5.   
  6.     String keyFine() default "";     
  7.     String valueFine() default "";     
  8. }   
@Retention(RetentionPolicy.RUNTIME)  
@Target({ElementType.FIELD, ElementType.PARAMETER})  
@Qualifier 
public @interface FineQualifier { 

    String keyFine() default "";  
    String valueFine() default "";  
}

同使用 @Qualifier 注解一样,下面给出了 @FineQualifier 应用示例。

Java 代码 复制代码  收藏代码
  1. @Autowired    
  2. @FineQualifier(keyFine="key2A", valueFine="value2A")     
  3. private TestBean2 testBean2a;     
  4.   
  5. @Autowired    
  6. @FineQualifier(keyFine="key2B", valueFine="value2B")     
  7. private TestBean2 testBean2b;     
  8.   
  9. @Autowired 10.@FineQualifier(keyFine="key2C", valueFine="value2C")   
  10.   
  11. private TestBean2 testBean2c;   
@Autowired 
@FineQualifier(keyFine="key2A", valueFine="value2A")  
private TestBean2 testBean2a;  

@Autowired 
@FineQualifier(keyFine="key2B", valueFine="value2B")  
private TestBean2 testBean2b;  

@Autowired 10.@FineQualifier(keyFine="key2C", valueFine="value2C")

private TestBean2 testBean2c;

为配合 @FineQualifier 注解的使用,XML 配置文件也需要作相应的调整,下面给出了调整后的配置示例。

Java 代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2">     
  2.     <qualifier type="test.FineQualifier">     
  3.         <attribute key="keyFine" value="key2A"/>     
  4.         <attribute key="valueFine" value="value2A"/>     
  5.     </qualifier>     
  6. </bean>    
  7. <bean id="testBean2b" class="test.TestBean2">     
  8.    <qualifier type="test.FineQualifier">     
  9.        <attribute key="keyFine" value="key2B"/>     
  10.        <attribute key="valueFine" value="value2B"/>    
  11.    </qualifier>     
  12. </bean>     
  13.   
  14. <bean id="testBean2c" class="test.TestBean2">     
  15.    <qualifier type="test.FineQualifier">     
  16.        <attribute key="keyFine" value="key2C"/>     
  17.        <attribute key="valueFine" value="value2C"/>     
  18.    </qualifier>     
  19. </bean>   
<bean id="testBean2a" class="test.TestBean2">  
    <qualifier type="test.FineQualifier">  
        <attribute key="keyFine" value="key2A"/>  
        <attribute key="valueFine" value="value2A"/>  
    </qualifier>  
</bean> 
<bean id="testBean2b" class="test.TestBean2">  
   <qualifier type="test.FineQualifier">  
       <attribute key="keyFine" value="key2B"/>  
       <attribute key="valueFine" value="value2B"/> 
   </qualifier>  
</bean>  

<bean id="testBean2c" class="test.TestBean2">  
   <qualifier type="test.FineQualifier">  
       <attribute key="keyFine" value="key2C"/>  
       <attribute key="valueFine" value="value2C"/>  
   </qualifier>  
</bean>

或者,开发者也可以启用 <meta/> 元素,配置示例如下。当在同一受管 Bean 中同时指定 < qualifier/> 和 < meta/> 元素时,DI 容器会优先使用 < qualifier/>。

Java 代码 复制代码  收藏代码
  1. <bean id="testBean2a" class="test.TestBean2">     
  2.     <meta key="keyFine" value="key2A"/>     
  3.     <meta key="valueFine" value="value2A"/>     
  4. </bean>     
  5. <bean id="testBean2b" class="test.TestBean2">     
  6.    <meta key="keyFine" value="key2B"/>     
  7.    <meta key="valueFine" value="value2B"/>     
  8. </bean>  1011.<bean id="testBean2c" class="test.TestBean2">     
  9.    <meta key="keyFine" value="key2C"/>     
  10.    <meta key="valueFine" value="value2C"/>     
  11. </bean>  
<bean id="testBean2a" class="test.TestBean2">  
    <meta key="keyFine" value="key2A"/>  
    <meta key="valueFine" value="value2A"/>  
</bean>  
<bean id="testBean2b" class="test.TestBean2">  
   <meta key="keyFine" value="key2B"/>  
   <meta key="valueFine" value="value2B"/>  
</bean>  10. 11.<bean id="testBean2c" class="test.TestBean2">  
   <meta key="keyFine" value="key2C"/>  
   <meta key="valueFine" value="value2C"/>  
</bean>

当 @FineQualifier 注解没有应用类一级的 @Qualifier 注解时,开发者必须借助如下对象注册它。

Java 代码 复制代码  收藏代码
  1. <bean id="customAutowireConfigurer" class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">     
  2.    <property name="customQualifierTypes">     
  3.        <set>     
  4.            <value>test.FineQualifier</value>     
  5.        </set>     
  6.    </property>     
  7. </bean>   

@Autowired 的使用

@Autowired 的使用

这三张图里的 @Autowired 的作用是否相同?帮忙具体解释一下

今天关于多次使用@Autowired多次使用麻药对身体有什么危害的讲解已经结束,谢谢您的阅读,如果想了解更多关于@Autowired、@Autowired 报红线、@Autowired 注解、@Autowired 的使用的相关知识,请在本站搜索。

本文标签: