Spring -- 配置bean的三种方法
配置通过静态工厂方法创建的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的三种方法的更多相关文章
- spring注入bean的三种方法
在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring实例化Bean的三种方法
在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象.在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化.静态工厂方式实例化和实例工厂方式实例化. 构造器实例化 ...
- Spring实例化bean的三种方法
1.用构造器来实例化 <bean id="hello2" class="com.hsit.hello.impl.ENhello" /> 2.使用静态 ...
- Spring配置数据源的三种方法
前言:今天接触新项目发现用的是JNDI配置数据源,用度娘倒腾了一会也没弄好,只好用平常用的方法,结果发现BasicDataSource和DriverManagerDataSource也是不同的,所以记 ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- Spring使用jdbcJdbcTemplate和三种方法配置数据源
三种方法配置数据源 1.需要引入jar包:spring-jdbc-4.3.2.RELEASE.jar <!-- spring内置,springJdbc,配置数据源 --> <bean ...
- spring集成JPA的三种方法配置
JPA是Java EE5规范之一,是一个orm规范,由厂商来实现该规范.目前有hibernate,OpenJPA,TopLink和EclipseJPA等实现 spring提供三种方法集成JPA:1.L ...
- Spring 实例化bean的三种方式
第一种方法:直接配置Bean <bena id="所需要实例化的一个实例名称" class="包名.类名"/> 例如: 配置文件中的bean.XML ...
- spring 装配bean的三种方式
这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...
随机推荐
- javascript 代码放在head和body的区别
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt239 1,在head中时,所代表的functions只加载而不执行,执行是在 ...
- VHDL学习:利用Quartus自带库3步快速完成状态机
Quartus自带库里面有各种编程语言的模板,供开发者参考. 初学者利用VHDL实现状态机比较生疏的情况下,可以调出该模板,适当修改即可. 本文将描述如何利用Quartus自带库调出状态机模板,并适当 ...
- jQuery插件——ajax
一.ajax请求 1.load(url, [data], [callback]) 概述:加载远程的HTML文件代码,并插入到指定的DOM节点中. 参数:url:待装入 HTML 网页网址. data: ...
- 从概念到业务来看 To B 和 To C 产品区别在哪?
自从互联网火了以后,一大堆 o2o,b2b,c2c 的产品出现,这些名词也渐渐为人熟知,但很多人对这些产品的理解也是停留在概念上,实际上绝大部分人用的都是 To C(也写作2c)产品,比如微信,qq ...
- 团队作业4——第一次项目冲刺(Alpha版本)第一天+第二天+第三天+第四天+第五天+第六天+第七天
冲刺第一天 一.Daily Scrum Meeting照片 二.每个人的工作 1.今天计划完成的任务 GUI.计时功能.题目生成 2.工作中遇到的困难 刚开始在计时功能模块只能做到秒位,经过查询资料后 ...
- 201521123037 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口: 接口简而言之是方法声明和常量值的集合,接口中所有的方法默认为public ...
- 201521123100 《Java程序设计》第3周学习总结
1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...
- 201521123106 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1. ...
- 201521123085 《java程序设计》 第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...
- 13.Linux键盘驱动 (详解)
版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的 ...