http://www.iteye.com/topic/43165
(转自springframework开发手册和分享java快乐博客)
Autowiring modes
模式 说明
no 不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。
byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。
constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
----------------------------------------------------------------------------------
理解自动装配的优缺点是很重要的。其中优点包括:
自动装配能显著减少配置的数量。不过,采用bean模板也可以达到同样的目的。
自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
自动装配的一些缺点:
尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。
对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。
如果采用by type方式自动装配,那么容器中类型与自动装配bean的属性或者构造函数参数类型一致的bean只能有一个,如果配置可能存在多个这样的bean,那么就要考虑采用显式装配了。
尽管使用autowire没有对错之分,但是能在一个项目中保持一定程度的一致性是最好的做法。例如,通常情况下如果没有使用自动装配,那么仅自动装配一个或两个bean定义可能会引起开发者的混淆。
代码如下
bean.xml
Java代码
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="date" name="myDate" class="java.util.Date"/>
<bean id="helloBean" class="javamxj.spring.basic.autowiring.HelloBean"
dependency-check="simple">
<property name="hello" value="javamxj"/>
</bean>
<bean id="HelloByName" class="javamxj.spring.basic.autowiring.HelloDate"
autowire="byName"/>
<bean id="HelloByType" class="javamxj.spring.basic.autowiring.HelloDate"
autowire="byType"/>
<bean id="HelloConstructor" class="javamxj.spring.basic.autowiring.HelloDate"
autowire="constructor"/>
<bean id="HelloAutodetect" class="javamxj.spring.basic.autowiring.HelloDate"
autowire="autodetect"/>
<bean id="helloCheck" class="javamxj.spring.basic.autowiring.HelloDate"
autowire="byType" dependency-check="objects">
<property name="date2">
<bean class="java.util.GregorianCalendar"/>
</property>
<!-- <property name="date" ref="date"/>-->
<!-- <property name="hello" ref="helloBean"/>-->
</bean>
</beans>
HelloBean.java
Java代码
public class HelloBean {
private String hello;
public String getHello() {
return hello;
}
public void setHello(String hello) {
this.hello = hello;
}
}
HelloDate.java
Java代码
public class HelloDate {
public HelloDate() {
System.out.println("defalt Constructor called");
}
public HelloDate(HelloBean hello) {
System.out.println("HelloDate(HelloBean) called");
}
public HelloDate(HelloBean hello, Date date) {
System.out.println("HelloDate(HelloBean,Date) called");
}
public void setHello(HelloBean hello) {
System.out.println("Property hello set");
}
public void setDate(Date date) {
System.out.println("Property date set");
}
public void setDate2(GregorianCalendar date) {
System.out.println("Property date2 set");
}
}
main.java
Java代码
public class Main {
public static void main(String[] args) {
BeanFactory bf = new XmlBeanFactory(new ClassPathResource(
"javamxj/spring/basic/autowiring/beans.xml"));
System.out.println("使用 byName:");
HelloDate hb = (HelloDate) bf.getBean("HelloByName");
System.out.println("\n使用 byType:");
hb = (HelloDate) bf.getBean("HelloByType");
System.out.println("\n使用 constructor:");
hb = (HelloDate) bf.getBean("HelloConstructor");
System.out.println("\n使用 autodetect:");
hb = (HelloDate) bf.getBean("HelloAutodetect");
System.out.println("\n使用 dependency-check:");
hb = (HelloDate) bf.getBean("helloCheck");
}
}
分享到:
相关推荐
NULL 博文链接:https://diaochenlong2.iteye.com/blog/1831333
#学习springboot自动装配 ##一,手动装配 ### 1,模式注解装配 @Component注解,或者@Component注解的扩展,@ Controller,@ Service,存储库,@ Configruation等, ### 2. @ Configuration启动容器+ @ Bean注册...
autowire自动导入句柄
Spring自动装配的方式和举例、以及@Qualifier、@Autowire、@Resource的使用。
使用autowire属性指定自动装配的方式byName根据bean的名字和当前bean的setter风格属性名进行自动装配若有匹配,则自动转配若无匹配,则不装配
在idea2020 下写的spring5-autowired 小例子。person,cat dog ,给大家一个参考。
多线程Autowire注入null的解决方案.docx
Autowire是Python的轻量级和简单的依赖注入库
2.为他们启用构造函数自动装配 还在想为什么将控制器用作服务? 检查和文章。 安装 composer require symplify/controller-autowire 将捆绑包添加到AppKernel.php : class AppKernel extends Kernel { public ...
以Spring5.3.6为演示基础,以多个范例显示演示了autowire多种形式的应用 default、byName、byType、constructor 并对相关使用做了一定的对比
主要介绍了Spring实战之@Autowire注解用法,结合实例形式详细分析了Spring @Autowire注解具体实现步骤与相关使用技巧,需要的朋友可以参考下
:electric_plug: 汽车线 用于Golang的基于反射的依赖项注入工具箱。 该自述文件处于进行中状态。 安装 整个项目基于go模块。 要获取最新版本,请使用go1.16 +并使用...go get github.com/go-autowire/autowire@v1.0.4
AndroidAutowire, Android视图activity 和 Fragments的Java注释方法 Android自动装配使用Java注释和反射,这个库将允许你用基于注释的方法替换来自 activity 。Fragments 和视图的一些烦人的样板设置。这里知识库在...
Symfony应用程序的自动装配数组参数 安装 composer require symplify/autowire-array-parameter 用法 1.在内核中注册Compiler Pass use Symfony \ Component \ DependencyInjection \ ContainerBuilder ; use ...
可以在一个应用上下文中定义多个配置文件,每个配置文件设置自己的默认自动装配策略(default-autowire) 如果使用constructor自动装配策略,就不能混合使用constructor-arg 注解方式可以实现更细粒度的自动装配,...
NULL 博文链接:https://garrincha.iteye.com/blog/2109488
资源分类:Python库 所属语言:Python 资源全名:Autowire-1.0.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
主要介绍了Idea 解决 Could not autowire. No beans of 'xxxx' type found 的错误提示,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
概述Mockitobeans是一个 ,通过使用Spring自己的@Autowire语法,您可以无缝地对所有bean进行自动装配。历史mockitobeans时,我一直在寻找一种方式来开始使用嘲笑说已经自动装配依赖其中有额外的自动装配Autowired的...