bean 的继承
abstract: 创建一个模板bean, 通过继承实现bean配置信息的重用.
abstract=“true”, 这个bean是抽象的, 不能获取其实例, 只能被继承
<bean id="person5" class="com.xian.bean.Person" abstract="true">
<property name="name" value="zhangsan"></property>
<property name="age" value="13"></property>
<property name="gender" value="男"></property>
<property name="email" value="zhangsan@qq.com"></property>
</bean>
<!-- parent:指定当前的bean的配置继承于那个 class可省 -->
<bean id="person6" class="com.xian.bean.Person" parent="person5">
<property name="name" value="李四"></property>
</bean>
设置bean之间的依赖:depends-on
<!-- 原来是按照配置的顺序创建bean -->
<!-- depends-on:定义bean之间的依赖 (只是改变创建顺序) -->
<bean id="person" class="com.xian.bean.Person" depends-on="book,car"></bean>
<bean id="car" class="com.xian.bean.Car"></bean>
<bean id="book" class="com.xian.bean.Book"></bean>
bean的作用域:scope
singleton: 单实例的,默认
1),在容器启动完成之前就已经创建好对象, 保存在容器中
2),任何时候获取都是得到之前创建好的这个对象
prototype: 多实例的
1),容器启动时时,不会默认创建, 获取时才创建这个bean对象
2),每次获取都会创建一个新的实例对象
request: 在web环境下, 同一次请求创建一个bean实例
session: 在web环境下, 同一次回话创建一个bean实例
<bean id="person" class="com.xian.bean.Book" scope="prototype"></bean>
使用工厂模式创建bean
静态工厂
工厂本身不用创建对象, 通过静态方法调用, 对象=工厂类.工厂方法名();
import com.xian.bean.Book;
public class BookStaticFactory {
public static Book getBook(String bookName ) {
System.out.println("static Factory");
Book book = new Book();
book.setBookName(bookName);
book.setAuthor("xian");
return book;
}
}
<!-- static Factory,
class:指定静态工厂全类名
factory-method:指定工厂方法
constructor-arg:可以为方法传参 -->
<bean id="airPlane01" class="com.xian.factory.AirPlaneStaticFactory"
factory-method="getAirPlane" >
<constructor-arg value="lisi"></constructor-arg>
</bean>
实例工厂
工厂需要创建对象: 再用该对象创建实例
import com.xian.bean.Book;
public class BookInstanceFactory {
public Book getBook(String bookName ) {
System.out.println("Instance Factory");
Book book = new Book();
book.setBookName(bookName);
book.setAuthor("xian");
return book;
}
}
<!-- 实例工厂 -->
<bean id="bookInstanceFactory" class="com.xian.factory.BookInstanceFactory" >
</bean>
<!-- factory-bean: 指定当前对象创建使用哪个工厂 factory-method:指定工厂方法-->
<bean id="book2" class="com.xian.bean.Book"
factory-bean="bookInstanceFactory" factory-method="getBook">
<constructor-arg value="Spring"></constructor-arg>
</bean>
实现FactoryBean接口
import com.xian.bean.Book;
public class BookFactoryImpl implements FactoryBean<Book> {
/**
*返回创建的对象
*/
@Override
public Book getObject() throws Exception {
Book book = new Book();
return book;
}
/**
*返回创建对象的类型
*Spring会自动调用这个方法来确认创建对象的是什么类型
*/
@Override
public Class<Book> getObjectType() {
return null;
}
/**
* 配置是否为单例, 默认TRUE
*/
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return FactoryBean.super.isSingleton();
}
}
<!-- FactoryBean(Spring接口), 只要是这个接口的实现类, Spring都认为是一个工厂;
1. ioc容器启动的时候不会创建实例
2. FacTory 获取的时候才会创建对象(实例对象)-->
<bean id="bookFactoryImpl" class="com.xian.factory.BookFactoryImpl">
</bean>
Book类
public class Book {
private String bookName;
private String author;
public Book() {
System.out.println("Book被创建");
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book [bookName=" + bookName + ", author=" + author + "]";
}
}