SpringFramework|基于XML的两种自动装配
SpringFramework|基于XML的两种自动装配
环境交代
Java:
1.8
Maven:
3
SpringFramework版本以及各组件成员:
5.1.1.RELEASE
- spring-context
- spring-core
- spring-beans
自动装配byName
来自: W3CSchool中的概述
这种模式由属性名称指定自动装配。Spring 容器看作 beans,在 XML 配置文件中 beans 的 auto-wire 属性设置为 byName。然后,它尝试将它的属性与配置文件中定义为相同名称的 beans 进行匹配和连接。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常。
对比示例 (byName
在设值注入的应用)
其目的是省略XML中的一些配置, 以减少代码量.
原例
Bean - Bean.java
❗这个Bean只是由于Spring配置所写顺口叫的, 并不符合严格意义上的JavaBean.
package noioo;
public class Bean {
public void sayHelloWorld(){
System.out.println("Hello World");
}
}
Bean的使用者, 它依赖这个Bean - BeanUser.java
package noioo;
public class BeanUser {
private Bean beanName;
public Bean getBeanName() {
return beanName;
}
public void setBeanName(Bean beanName) {
this.beanName = beanName;
}
public void useSayHelloWorld(){
beanName.sayHelloWorld();
}
}
Spring XML配置文件 - spring-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
<bean id="beanUser" class="noioo.BeanUser">
<!-- 待会我们将省略下面这个property配置 -->
<property name="beanName" ref="bean"/>
</bean>
<bean id="beanName" class="noioo.Bean">
</bean>
</beans>
执行者 - Runner.java
package noioo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Runner {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml");
BeanUser beanUser = (BeanUser)context.getBean("beanUser");
beanUser.useSayHelloWorld();
}
}
运行结果
Hello World
Process finished with exit code 0
使用byName
来省略其中的一些配置
修改spring-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
<!-- 去掉了property, 新增了属性autowire="byName" -->
<bean id="beanUser" class="noioo.BeanUser" autowire="byName">
</bean>
<!-- 这里的id值对应了BeanUser中的属性名bean -->
<bean id="beanName" class="noioo.Bean">
</bean>
</beans>
也就是说, 在
BeanUser
这个类中的属性private Bean beanName
将被取出, 用来匹配同名为"beanName"
的Spring Bean.
运行结果
运行结果一样.
Hello World
Process finished with exit code 0
虽然在这里省略的代码并不是很多, 毕竟只有一个对象....
自动装配byType
这种模式由属性类型指定自动装配。Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 byType。然后,如果它的 type 恰好与配置文件中 beans 名称中的一个相匹配,它将尝试匹配和连接它的属性。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常。
来自: W3CSchool中的概述
示例
上面的Java代码不用改, 仅仅修改配置文件即可.
Spring配置文件 - spring-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
<bean id="beanUser" class="noioo.BeanUser" autowire="byType">
<!-- 它将会以定义的属性值的类型来匹配这里的Bean名,
属性值是Bean, 也就是将会匹配一个类型为"Bean"的Spring Bean
-->
</bean>
<!-- 因为是根据类型匹配的, 我们甚至连给这个Bean起id都不用 -->
<bean class="noioo.Bean">
</bean>
</beans>
❗注意:
是按照
UserBean
中属性的类型来匹配的.
运行结果
Hello World
Process finished with exit code 0