在这里,我们将给大家分享关于多次使用@Autowired的知识,让您更了解多次使用麻药对身体有什么危害的本质,同时也会涉及到如何更有效地@Autowired、@Autowired报红线、@Autowi
在这里,我们将给大家分享关于多次使用@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
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 (required=false) 或者 @Resource.
这两者区别网上一大堆
@Autowired 注解
@Autowired 注解
自 Spring 诞生以来,<bean/> 的 autowire 和 dependency-check 属性便一直存在。当 JDK 5.0 正式发布后,Spring 针对 dependency-check 属性引入了对应的 @Required。同理,它针对 autowire 属性引入了对应的 @Autowired 注解,其定义摘录如下。



- @Retention(RetentionPolicy.RUNTIME)
- @Target ({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})
- public @interface Autowired {
- // 是否必须满足依赖性检查
- boolean required() default true;
- }
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})
public @interface Autowired {
//是否必须满足依赖性检查
boolean required() default true;
}
@Autowired 注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即 setter 方法,常见的各种方法都可以应用这一注解。比如,位于 autowiringdemo 项目中的 TestBean1 类的 testBean2 和 testBean3 属性应用了这一注解,具体如下。



- @Autowired(required=false)
- private TestBean2 testBean2;
- @Autowired
- 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 属性取值能够改变这一行为。



- <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"/>
<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 注解。



- @Autowired(required=false)
- public void setTestBean2(TestBean2 testBean2) {
- this.testBean2 = testBean2;
- }
- @Autowired
- public void setTestBean3(TestBean3 testBean3) {
- this.testBean3 = testBean3;
- }
@Autowired(required=false)
public void setTestBean2(TestBean2 testBean2) {
this.testBean2 = testBean2;
}
@Autowired
public void setTestBean3(TestBean3 testBean3) {
this.testBean3 = testBean3;
}
下面给出了应用于构建器的 @Autowired 注解。



- @Autowired(required=false)
- public TestBean1(TestBean2 tb2, TestBean3 tb3) {
- this.testBean2 = tb2;
- this.testBean3 = tb3;
- }
@Autowired(required=false)
public TestBean1(TestBean2 tb2, TestBean3 tb3) {
this.testBean2 = tb2;
this.testBean3 = tb3;
}
下面给出了应用于普通方法的 @Autowired 注解。



- @Autowired
- public void preparedBean(TestBean2 tb2, TestBean3 tb3){
- this.testBean2 = tb2;
- this.testBean3 = tb3;
- }
@Autowired
public void preparedBean(TestBean2 tb2, TestBean3 tb3){
this.testBean2 = tb2;
this.testBean3 = tb3;
}
除了能够自动注入普通受管 Bean 外,@Autowired 注解还能够注入一些特殊对象,比如受管 Bean 所在 DI 容器中的各种元数据对象,示例如下。@Autowired 将当前 DI 容器注入。



- @Autowired
- 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 配置示例。



- <bean id="testBean2a" class="test.TestBean2"/>
- <bean id="testBean2b" class="test.TestBean2"/>
- <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 中。



- @Autowired 2.private TestBean2 testBean2a;
- @Autowired
- private TestBean2 testBean2b;
- @Autowired
- private TestBean2 testBean2c;
@Autowired 2.private TestBean2 testBean2a;
@Autowired
private TestBean2 testBean2b;
@Autowired
private TestBean2 testBean2c;
为此,我们需要启用 <qualifier/> 元素及 @Qualifier 注解。调整后的 XML 配置示例如下。



- <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>
<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。



- @Autowired
- @Qualifier("2a")
- private TestBean2 testBean2a;
- @Autowired
- @Qualifier("2b")
- private TestBean2 testBean2b;
- @Autowired 10.@Qualifier("2c")
- private TestBean2 testBean2c;
@Autowired
@Qualifier("2a")
private TestBean2 testBean2a;
@Autowired
@Qualifier("2b")
private TestBean2 testBean2b;
@Autowired 10.@Qualifier("2c")
private TestBean2 testBean2c;
@Qualifier 注解能够作用于属性、参数、类、其他注解等地方,比如下面给出了参数级的使用示例。



- @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;
- }
@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 策略,下面给出了一注解示例。



- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.FIELD, ElementType.PARAMETER})
- @Qualifier
- public @interface FineQualifier {
- String keyFine() default "";
- String valueFine() default "";
- }
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Qualifier
public @interface FineQualifier {
String keyFine() default "";
String valueFine() default "";
}
同使用 @Qualifier 注解一样,下面给出了 @FineQualifier 应用示例。



- @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;
@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 配置文件也需要作相应的调整,下面给出了调整后的配置示例。



- <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>
<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/>。



- <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>
<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 注解时,开发者必须借助如下对象注册它。



- <bean id="customAutowireConfigurer" class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
- <property name="customQualifierTypes">
- <set>
- <value>test.FineQualifier</value>
- </set>
- </property>
- </bean>
@Autowired 的使用
这三张图里的 @Autowired 的作用是否相同?帮忙具体解释一下
今天关于多次使用@Autowired和多次使用麻药对身体有什么危害的讲解已经结束,谢谢您的阅读,如果想了解更多关于@Autowired、@Autowired 报红线、@Autowired 注解、@Autowired 的使用的相关知识,请在本站搜索。
本文标签: