自动装配
;
构造器加载,在类加载构造体中生成IOC容器对象依赖的依然时TYPE方式加载,所以id名称无价值。
这里因为没有实例autoWiringDAO对象,所以Service类中的say方法没有办法调用DAO类的实例方法,可是为什么没错误呢?
对象中其它成员变量的依赖关系不再由配置文件中bean标签中定义,而是通过set方法的设置,在加载IOC容器时,通过名称自动赋值
Bean自动装配(Autowiring)
自动配置以后 若A引用B,在A类中声明引用的类以及写set方法
private AutoWiringDAO autoWiringDAO;setAutoWiringDAO(AutoWiringDAO autoWiringDAO){this.autoWiringDAO = autoWiringDAO},自动会配置A与B的关系
当配置文件中自动配置类型为byname时运行原来 当遇到private AutoWiringDAO autoWiringDAO 时 会将spring-authowriting.xml中 id 为autoWiringDAO 的bean替换为private AutoWiringDAO autoWiringDAO 中的autoWiringDAO 作为引用 类型为byType将通过配置文件中的class进行关联
Bean自动装配:默认、byName、byType、byConstor
通过byName的方式装配Bean的话xml文件中需要配置id属性,并且id属性需要跟对象的引用同名。
bean自动装配
关于自动装配:
在这里面的例子中:采用byname的方式 : service实现类里面是有XXDaoImpl的这个成员变量,然后定义set方法;接着定义say方法,当执行serviceImpl的say方法时候,会调用XXDaoImpl的say方法,但是要创建对象,这时候,通过byname方式,找到跟set方法里面参数一样的id的类,然后,容器调用set方法创建对象,接着执行XXDaoImpl的say方法
根据构造器也是一样的道理,只不过set方法换成了构造方法
自动装载:
在bean容器中,不要再设置property或constructor,只要在引用的bean里面添加set方法,并bean容器中设置default-autowire。
byName有一个需要注意的地方:
name的含义就是我们在ioc容器中声明的id必须和setter方法名对应,例如id = autoWritingDAO111,setter方法名就是setAutoWritingDAO111,这一点似乎没讲到。
Bean的自动装配
Bean的自动装配
自动装配:无需在xml中指定property或是constructor-arg属性。
byName:根据set中参数的bean id装配bean实例。
byType:根据set中参数的bean类型装配bean实例。
constructor:IOC容器查找有无构造器方法中的参数的类型
一、bean的装配
byName 按照名字一一对应
byType 按照类型对应
Bean的自动装配(Autowiring)
No:不做任何操作,默认选项。
byname:根据setXXX()方法的set后的名称进行自动注入(首字母不区分大小写)。查找xml中有没有<bean>标签id的名称与属性完全一致的,如果有则自动注入,并且执行set方法,基于set方法,如果没有不报错,该属性置为NULL,并且不执行set()。
byType:根据类型自动注入,如果容器中存在一个与指定属性类型相同的bean,那么该属性自动注入;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配,如果没有找到相匹配的bean,则什么事都不发生,该属性置为null基于set方法。
Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一个bean,那么抛出异常。
xml方式的Bean自动注入(<beans>标签的属性default-autowire=byName)
No:不做任何操作,默认选项。
byname:根据setXXX()方法的set后的名称进行自动注入(首字母不区分大小写)。查找xml中有没有<bean>标签id的名称与属性完全一致的,如果有则自动注入,并且执行set方法,基于set方法,如果没有不报错,该属性置为NULL,并且不执行set()。
byType:根据类型自动注入,如果容器中存在一个与指定属性类型相同的bean,那么该属性自动注入;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配,如果没有找到相匹配的bean,则什么事都不发生,该属性置为null基于set方法。
Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一个bean,那么抛出异常。
Bean的自动装配
No
byname
byType
constructo
Bean的自动装配Autowiring2
Bean的自动装配Autowiring
autowirng 自动装配,跟注入的概念相似,这里是自动的赋值引用
xml中定义default-autowire 可以使用byName byType constructor等
xml方式的Bean自动注入(<beans>标签的属性default-autowire=byName)
No:不做任何操作,默认选项。
byname:根据setXXX()方法的set后的名称进行自动注入(首字母不区分大小写)。查找xml中有没有<bean>标签id的名称与属性完全一致的,如果有则自动注入,并且执行set方法,基于set方法,如果没有不报错,该属性置为NULL,并且不执行set()。
byType:根据类型自动注入,如果容器中存在一个与指定属性类型相同的bean,那么该属性自动注入;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配,如果没有找到相匹配的bean,则什么事都不发生,该属性置为null基于set方法。
Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一个bean,那么抛出异常。
Spring官方文档对自动注入属性的四种类型解释
案例:(原理:IOC容器加载XML配置文件,由于设置了自动按名称进行注入,所以当获取Bean1的实例时,查找XML文件中有没有Id为set方法后的名称(去掉set,并且不区分大小写),如果有则进行自动注入)
步骤1:
编写两个类,并在其中一个类中引用其他类作为自己的属性,而且必须提供set方法。
步骤2:
编写xml文件
<beans>标签添加 default-autowire="byName"
并且对着两个类进行<bean>配置。
代码:
public class Bean1{
private Bean2 bean2;
public Bean2 getBean3() {
return bean2;
}
public void setBean3(Bean2 bean2) {
this.bean2 = bean2;
}
}
xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName">
<bean id="bean1" class="main.java.com.imooc.Bean1"></bean>
<bean id="bean3" class="main.java.com.imooc.Bean2"></bean>
</beans>
结果:
Bean1 [bean2=main.java.com.imooc.Bean2@2ec5f45d]
当default-autowire="byType"时:则会根据属性的类型查找xml中是否有和它相同的类型的<bean>(也就是class),如果有以一个则进行注入,如果一个以上则报异常,没有则为null。
通过构造方法实现自动注入:
步骤1:提供构造方法为属性赋值。
代码:
public class Bean1{
private Bean2 bean2;
public Bean1(Bean2 bean2) {
super();
this.bean2 = bean2;
}
步骤2:xml中设置default-autowired="constructor”,并且提供和有参构造函数的参数相同类型的一个<bean>标签。
代码:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="constructor">
<bean id="bean1" class="main.java.com.imooc.Bean1"></bean>
<bean class="main.java.com.imooc.Bean2"></bean>
</beans>
结果:
Bean2@5c5766b1
bean 的自动装配(Autowiring)
Bean的自动装配(Autowiring)
Bean的自动装配(Autowiring);
在xml中使用 default-autowire="*"配置。
配置了自动装配后,根据约定的规则,在xml中就不用在配置装配了,
Bean的自动装配
自动装配的类型
在配置文件中配置:
default-autowire = ""
在引用的bean中声明set方法
全局配置:
default-autowire (这样就不用写<property>属性了,用到什么按照实际配置情况找bean即可)