Bean自动装配Bean之间关系Bean的作用域

对于学习spring有帮助的网站:

Bean的自动装配

Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 的 autowire 属性里指定自动装配的模式 有以下几种自动装配的类型:

byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用

首先我们先来看一个手动装配的例子, 目录结构

先创建两个实体Bean

package com.gp.spring.autowire;{private String name;private Address address;public String getName() {return name;}(String name) {this.name = name;}public Address getAddress() {return address;}(Address address) {this.address = address;}@Overridepublic String toString() {return “Person [name=” + name + “, address=” + address + “]”;}}package com.gp.spring.autowire;{private String city;private String street;public String getCity() {return city;}(String city) {this.city = city;}public String getStreet() {return street;}(String street) {this.street = street;}@Overridepublic String toString() {return “Address [city=” + city + “, street=” + street + “]”;}}

再创建IOC配置文件

===”http://www.springframework.org/schema/beans”>====></beans>

测试代码

package import orgimport orgpublic class Main {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext(“autowired.xml”);Person p = (Person) ctx.getBean(“person”);System.out.println(p);}}

输出结果

Person [name=Alis, address=Address [city=beijing, street=haidian]]

下面我们来看一下是如何进行自动装配的 修改配置文件

<bean id=”address” class=”com.gp.spring.autowire.Address”p:city=”beijing” p:street=”haidian”></bean><bean id=”person” class=”com.gp.spring.autowire.Person”p:name=”Alis” autowire=”byName”></bean>

增加代码autowire=”byName”,使用byName的方式进行自动匹配。 它就会根据person类中的setAddress属性匹配名为address的bean。 同理可知,byType匹配方式,匹配与setAddress类型一直的bean。

XML 配置里的 Bean 自动装配的缺点在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些Bean的继承关系

来看下下面这段代码

====> (String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext(“context_relate.xml”);Address address = (Address) ctx.getBean(“address1”);System.out.println(address);address = (Address) ctx.getBean(“address2”);System.out.println(address);}

输出结果

Address [city=鸡西, street=南岗] Address [city=鸡西, street=电台路]

很简单的属性注入,你是否注意到再配置文件中,注入的两条信息,大部分内容是相同的,比如相同的Bean,相同的值。

这里我们可以用一个Bean继承的做法,来简化配置,如下

====”address1″></bean>

这里用到了parent,继承自address1的Bean,然后我们在重写我们要修改的内容。

抽象Bean(abstract=”true”)

抽象的Bean是不允许被实例化的,我们看一个错误的代码

==>=>

address1增加了abstract=”true”表示为抽象Bean

(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext(“context_relate.xml”);Address address = (Address) ctx.getBean(“address1”);System.out.println(address);address = (Address) ctx.getBean(“address2”);System.out.println(address);}

运行测试方法

我们会看到以下异常,意思为抽象类是不许被实现的。

Exception in thread “main” org.springframework.beans.factory.BeanIsAbstractException: Error creating bean with name ‘address1’: Bean definition is abstract

因为在路上你就已经收获了自由自在的好心情。

Bean自动装配Bean之间关系Bean的作用域

相关文章:

你感兴趣的文章:

标签云: