配置通过静态工厂方法创建的bean

public class StaticBookFactory {

    //静态工厂方法;
public static Book getBook(String bookName){
System.out.println("静态工厂方法调用...");
Book book = new Book();
book.setBookName(bookName+"_static");
book.setAuthor(new Person());
book.setInfo(new HashMap<String,Object>());
book.setLists(new ArrayList<>());
book.setPrice(98.98);
return book;
} }

spring配置如下:

<bean id="book01"
class="com.soyoungboy.spring.factory.StaticBookFactory"
factory-method="getBook">
<!-- 给方法参数定义值 -->
<constructor-arg value="西游记"></constructor-arg>
</bean>

class:指定为工厂类型
factory-method="":告诉Spring这个工厂的工厂方法;
Spring会调用工厂方法,把返回的结果放在容器中;容器中其实保存的是Book

实例工厂:

1)、必须得有这个工厂对象
2)、我们创建bean的时候使用这个工厂

例如:

public class InstanceBookFactory {

    // 实例工厂方法;
public Book getBook(String bookName) {
System.out.println("实例工厂方法调用...");
Book book = new Book();
book.setBookName(bookName+"_instance");
book.setAuthor(new Person());
book.setInfo(new HashMap<String, Object>());
book.setLists(new ArrayList<>());
book.setPrice(98.98);
return book;
} }

spring配置文件如下:

<bean id="instanceBookFactory" class="com.soyoungboy.spring.factory.InstanceBookFactory"></bean>
<bean id="book02" class="com.atguigu.spring.Book"
factory-bean="instanceBookFactory" factory-method="getBook">
<constructor-arg value="东游记"></constructor-arg>
</bean>

告诉Spring创建book对象的时候使用哪个工厂对象
factory-bean="instanceBookFactory":指定工厂对象
factory-method="getBook":指定工厂方法

FactoryBean

public class SpringSupportFactory implements FactoryBean<Book> {

    /**
* 造书的工厂方法
*/
@Override
public Book getObject() throws Exception {
System.out.println("SpringFactory......");
Book book = new Book();
book.setBookName("SpringFactory");
return book;
} /**
* 告诉外界这个工厂是造什么类型数据的
*/
@Override
public Class<?> getObjectType() {
return Book.class;
} /**
* 是单例?
* true:代表造的数据是单例
* false:代表不是单例
*/
@Override
public boolean isSingleton() {
return false;
} }

配置文件如下:

<bean id="springSupportFactory" class="com.soyoungboy.spring.factory.SpringSupportFactory"></bean>

Spring定义的一个工厂接口;实现这个接口;实现了这个接口的所有类,Spring就认为这是一个工厂类 容器中保存的是getObject方法返回的对象

通过继承实现bean配置信息的重用

<bean id="person01" class="com.soyoungboy.spring.Person" abstract="true">
<property name="firstName" value="三"></property>
<property name="lastName" value="王"></property>
<property name="gender" value="男"></property>
</bean>

通过abstract属性创建一个模板bean:abstract="true":这是一个抽象定义,只是让别人继承的。

<bean id="person03" parent="person01">
<property name="lastName" value="张"></property>
<property name="age" value="19"></property>
</bean>

parent="person01":只是指配置的继承。

bean之间的依赖

改变创建顺序
depends-on="person02":依赖的bean优先创建

    <!-- 默认是按照配置顺序来创建bean的 -->
<bean id="book01" class="com.soyoungboy.spring.Book" depends-on="person02"></bean>
<!-- parent="person01":只是指配置的继承 -->
<bean id="person02" parent="person01">
<property name="lastName" value="张"></property>
<property name="age" value="19"></property>
</bean>
<bean id="person03" parent="person01">
<property name="lastName" value="张"></property>
<property name="age" value="19"></property>
</bean>

bean的作用域(是否单多实例)

scope="":作用域;
  prototype:原型,多实例;
  singleton:单实例(默认)

web环境有用的
  request:同一次请求创建一次对象
  session:同一个会话创建一个对象

单实例:
  1、默认注册的bean都是单实例的
  2、容器一启动就会创建这些单实例bean
多实例:
  1、容器启动不会创建这些bean

<bean id="car01" class="com.soyoungboy.spring.Car" scope="prototype"></bean>  

创建带有生命周期方法的bean

生命周期:(从创建到销毁的过程);
  Spring帮我们创建对象====销毁:
  Spring允许我们为bean自定义声明周期方法,在具体生命周期的时候会自动调用

  init-method="":指定初始化方法;
  destroy-method="":指定销毁方法;
调用:
单实例:
  容器启动(调用构造器)===init=====xxxx====容器关闭销毁;
多实例:(销毁方法不会被调用)
  每次获取(调用构造器)===init====xxx====容器关闭;

public class Car {

    public void carInit(){
System.out.println("car..init。。。。");
} public void carDestroy(){
System.out.println("car..destroy。。。。");
} public Car() {
super();
// TODO Auto-generated constructor stub
System.out.println("car创建....");
}
}

配置 调用对应的初始化和销毁方法:

<bean id="car02" class="com.soyoungboy.spring.Car"
init-method="carInit" destroy-method="carDestroy"></bean>

bean的后置处理器:BeanPostProcessor(接口)

作用:拦截bean的初始化过程在初始化前后做一些工作;
使用:
  1、写实现
  2、注册在容器中

public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
* 创建对象===初始化前===【初始化】==初始化后===使用=====销毁
*
*
* 初始化前调用
*
* Object bean, 刚刚创建好的bean
* String beanName 创建的bean的名字id
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessBeforeInitialization:bean=id:"+beanName+"==》详细信息:"+bean);
return bean;
} /**
* 初始化后调用的
*
* Object bean
* String beanName
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessAfterInitialization:bean=id:"+beanName+"==》详细信息:"+bean);
return bean;
} }

配置文件内容如下:

<bean class="com.soyoungboy.spring.process.MyBeanPostProcessor"></bean>

Spring认为每一个组件是有默认初始化方法的,只是我们可
能没定义
1、每个bean创建初始化后置处理器都会工作
2、我们可以在后置处理器中对初始化前后的bean进行检查修改。。。

Spring -- 配置bean的三种方法的更多相关文章

  1. spring注入bean的三种方法

    在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...

  2. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring实例化Bean的三种方法

    在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象.在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化.静态工厂方式实例化和实例工厂方式实例化. 构造器实例化 ...

  3. Spring实例化bean的三种方法

    1.用构造器来实例化 <bean id="hello2" class="com.hsit.hello.impl.ENhello" /> 2.使用静态 ...

  4. Spring配置数据源的三种方法

    前言:今天接触新项目发现用的是JNDI配置数据源,用度娘倒腾了一会也没弄好,只好用平常用的方法,结果发现BasicDataSource和DriverManagerDataSource也是不同的,所以记 ...

  5. spring创建bean的三种方式

    spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...

  6. Spring使用jdbcJdbcTemplate和三种方法配置数据源

    三种方法配置数据源 1.需要引入jar包:spring-jdbc-4.3.2.RELEASE.jar <!-- spring内置,springJdbc,配置数据源 --> <bean ...

  7. spring集成JPA的三种方法配置

    JPA是Java EE5规范之一,是一个orm规范,由厂商来实现该规范.目前有hibernate,OpenJPA,TopLink和EclipseJPA等实现 spring提供三种方法集成JPA:1.L ...

  8. Spring 实例化bean的三种方式

    第一种方法:直接配置Bean <bena id="所需要实例化的一个实例名称" class="包名.类名"/> 例如: 配置文件中的bean.XML ...

  9. spring 装配bean的三种方式

    这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...

随机推荐

  1. 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用

    32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX  可以这样想,16位通 ...

  2. jsp、freemarker、velocity区别详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt172 在java领域,表现层技术主要有三种:jsp.freemarker.v ...

  3. 201521123030 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4 ...

  4. 201521123074 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. (嗯..都画了那么久的导图,还是用导图归纳吧~) 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList ...

  5. 201521123036 《Java程序设计》第4周学习总结

    本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 继承:extends子类将获得父类的属性与方法,并具有自身特有的属性与方法 抽取共同特征(行为与属 ...

  6. 201521123062《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  7. 201521123117 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  8. 控制结构(4) 局部化(localization)

    // 上一篇:状态机(state machine) // 下一篇:必经之地(using) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 前情回顾 上一次,我们说到状态机结构( ...

  9. [ JDK ] 列表转数组 toArray

    <T> T[] toArray(T[] a) :该方法返回一个数组,数组元素包含了 List<T> 中的所有元素,数组中的元素顺序和 List<T> 中的元素顺序保 ...

  10. Java 最常用类(前1000名) 来自GitHub 3000个项目

    这篇文章主要介绍了最常用的1000个Java类(附代码示例),需要的朋友可以参考下 分析Github 3000个开源项目,粗略统计如下.括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整 ...