微网站的搭建流程,安徽城乡建设厅网站焊工证查询,烟台网站的建设,美食网站案例Spring提供了四种类型的自动装配策略#xff1a; byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。byType – 把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。constructor – 把与Bean的构造器入参具有相同类型的其他…Spring提供了四种类型的自动装配策略 byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。byType – 把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。constructor – 把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean的对应属性中。autodetect – 首先使用costructor进行自动装配。如果失败再尝试使用byType进行自动装配。我这里以关羽和青龙偃月刀为例 首先定义一个武器接口Weapon package com.moonlit.myspring;public interface Weapon {public void attack();
} 然后定义一个Weapon接口的实现Falchion类: package com.moonlit.myspring;public class Falchion implements Weapon {public void attack() {System.out.println(falcon is attacking!);}
} 定义一个英雄接口Hero package com.moonlit.myspring;public interface Hero {public void perform();
} 然后定义一个Hero接口的实现Guanyu类代表关羽 package com.moonlit.myspring;public class GuanYu implements Hero {private Weapon weapon;public void perform() {System.out.println(GuanYu pick up his weapon.);weapon.attack();}public Weapon getWeapon() {return weapon;}public void setWeapon(Weapon weapon) {this.weapon weapon;}
} 在不涉及自动装配的情况下我们想要通过Spring的DI将Fachion类对象注入到Guanyu类的weapon属性中可以新建一个xml文件我这里取名为spring-idol.xml并在里面填写 spring-idol.xml: ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdbean idfalchion classcom.moonlit.myspring.Falchion /bean idguanyu classcom.moonlit.myspring.GuanYuproperty nameweapon reffalchion //bean/beans 其中最主要的内容就是两个bean的声明部分 bean idfalchion classcom.moonlit.myspring.Falchion /bean idguanyu classcom.moonlit.myspring.GuanYuproperty nameweapon reffalchion //bean 第一个bean标签定义了一个Falchion类型的bean第二个bean标签中将第一个bean作为weapon的值装配到了weapon属性中。 然后我们可以写一个测试程序来查看效果 package com.moonlit.practice;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.moonlit.myspring.Hero;public class AutowirePractice {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(spring-idol.xml);Hero guanyu (Hero) context.getBean(guanyu);guanyu.perform();}
} 输出结果如下 GuanYu pick up his weapon.
falcon is attacking! 到目前为止还没有涉及到自动装配的内容接下来开始讲述自动装配的内容。 byName自动装配 改变spring-idol.xml中bean声明内容的形式如下 bean idweapon classcom.moonlit.myspring.Falchion /bean idguanyu classcom.moonlit.myspring.GuanYu autowirebyName / 得到一样的结果。 我们将Falchion类的id去了一个和Guanyu类的属性weapon一样的名字并且在guanyu bean中添加了autowirebyName用于指明装配类型是byName自动装配。这个时候guanyu bean就是在上下文中找名为weapon的bean装配到他自己的weapon属性中。 byType自动装配 改变spring-idol.xml中bean声明内容的形式如下 bean idfalchion classcom.moonlit.myspring.Falchion /bean idguanyu classcom.moonlit.myspring.GuanYu autowirebyType / 得到一样的结果。 这里我们已经不用关注Falchion类对应的bean的id是什么了因为我们已经定义guanyu bean的autowire属性为byType。这个时候guanyu bean会在上下文中寻找和weapon具有相同类型的类对应的bean。因为Guanyu类的weapon实现Weapon借口整个上下文中目前只有一个Weapon接口的实现Falchion类所以以byType类型就检测到了falchion bean并将其注入到了guanyu bean的weapon属性中。但是也会出现一种情况就是检测的时候可能会出现多个相同type的bean这个时候就不知道要装配那个了。比如我在新建一个实现Weapon接口的方天画戟类HalBerd package com.moonlit.myspring;public class Halberd implements Weapon {public void attack() {System.out.println(halberd is attacking!!!);}
} 并且在xml文件中声明一个新的halberd bean bean idhalberd classcom.moonlit.myspring.Halberd / 在这种情况下就会出错因为有两个bean满足byType的结果。 这个时候有两种解决办法第一种方法是将其中一个bean的primary属性设为false比如我们将方天画戟falchion bean的primary属性设为true以防冠以使用方天画戟很好奇吕布死了之后赤兔马归关羽了方天画戟去哪里了 bean idfalchion classcom.moonlit.myspring.Falchion /bean idhalberd classcom.moonlit.myspring.Halberd primarytrue /bean idguanyu classcom.moonlit.myspring.GuanYu autowirebyType / 输出结果如下 GuanYu pick up his weapon.
halberd is attacking!!! 从输出结果中可以看到关羽没有使用青龙偃月刀而是使用方天画戟进行攻击了。 注我看的Spring实战第3版上面说bean的默认primary属性默认是true但是我这里用的是spring 4根据效果来看primary的默认属性应该是false。第二种方法是设置其中一个bean的autowire-candidate属性为false比如我们将方天画戟的autowire-candidate属性设为false bean idfalchion classcom.moonlit.myspring.Falchion /bean idhalberd classcom.moonlit.myspring.Halberd primarytrue autowire-candidatefalse /bean idguanyu classcom.moonlit.myspring.GuanYu autowirebyType / 这个时候测试程序的输出如下 GuanYu pick up his weapon.
falcon is attacking! 可以看到这个时候关羽又重拾了青龙偃月刀。可以看到当halberd bean的autowire-candidate属性设为false时他将不会作为自动装配的竞选bean之一这个时候虽然halberd的primary属性为true但是halberd bean没有参与自动装配的竞选所以自动装配到了falchion。 这种感觉就好像“隔壁村李小花觊觎我已久但我是一个要成为海贼王的男人于是拒绝了她……最终她嫁给了隔壁老王过上了幸福的生活”。 constructor自动装配 演示constructor之前我需要在在GuanYu类中添加一个构造函数 public GuanYu(Weapon weapon) {this.weapon weapon;} 在xml文件中设置guanyu bean的autowire属性为constructor bean idfalchion classcom.moonlit.myspring.Falchion /bean idguanyu classcom.moonlit.myspring.GuanYu autowireconstructor / 输出结果如下 GuanYu pick up his weapon.
falcon is attacking! 实现了自动装配。 最佳自动装配 书上说是将autowire属性设为autodetect但是我发现在我使用的spring 4我看的书是spring 3版本中没有autodetectautowire属性只有byName,byType,constructor,default,no这些属性。 默认自动装配 可以在beans标签中添加default-autowire属性来设置默认自动装配策略如在beans标签中添加default-autowirebyType设置默认自动装配策略为byType自动装配。 混合使用自动装配和显示装配 为了演示这个效果我为Guanyu类添加了一个String成员变量name虽然关羽就叫关羽但是人家称呼他的时候还是会称呼他云长之类的。新定义的GuanYu类如下 package com.moonlit.myspring;public class GuanYu implements Hero {private String name;private Weapon weapon;
// public GuanYu(String name, Weapon weapon) {
// this.name name;
// this.weapon weapon;
// }public void perform() {System.out.println(name pick up his weapon.);weapon.attack();}public Weapon getWeapon() {return weapon;}public void setWeapon(Weapon weapon) {this.weapon weapon;}public String getName() {return name;}public void setName(String name) {this.name name;}
} 这里我注释掉了GuanYu类的构造函数。 一个完全显示装配的例子如下 bean idfalchion classcom.moonlit.myspring.Falchion /bean idguanyu classcom.moonlit.myspring.GuanYuproperty namename valueGuan Yun Chang /property nameweapon reffalchion //bean 当然我们也可以使用显示装配和自动装配结合显示装配name自动装配weapon如下 bean idfalchion classcom.moonlit.myspring.Falchion /bean idguanyu classcom.moonlit.myspring.GuanYu autowirebyTypeproperty namename valueGuan Yun Chang //bean 具有一样效果的输出。 使用混合装配的最后一个注意事项当使用constructor自动装配策略时我们必须让Spring自动装配构造器的所有入参——我们不能混合使用constructor自动装配策略和constructor-arg元素。转载于:https://www.cnblogs.com/moonlightpoet/p/5569239.html