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的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...
随机推荐
- MySQL(九)之数据表的查询详解(SELECT语法)二
上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1 ...
- django 5 form1
---------------------Form表单验证(用户请求验证+生成HTML标签) 示例:用户管理 a. 添加用户页面 - 显示HTML标签 - 提交:数据验证 - 成功之后保存 - 错误显 ...
- Web颜色对照表大全
Web上16种基本颜色名称 Name Hex (RGB) Red (RGB) Green (RGB) Blue (RGB) Hue (HSL/HSV) Satur. (HSL) Light (HSL) ...
- Java运算符和流程控制
1 运算符 1.1 比较运算符 比较运算符的结果都是boolean类型,也即是要么是true,要么是false. 比较运算符"=="不能写成"=". > ...
- 第2周作业-Java基本语法与类库(20170227-20170304)
本周学习总结 (1)这周学习认识和熟悉了java的一些类型和变量: (2)学习了java的运算符基本使用方法: (3)了解了如何建立远程仓库和本地仓库,和如何让java代码在临时储存,本地仓库和远程仓 ...
- 201521123007《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 201521123033《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. answer; 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4- ...
- 201521123049 《JAVA程序设计》 第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- Eclipse集成spket插件_Ext-5.1.0
1, spket-1.6.23.jar下载 官网下载:http://www.spket.com/download.html , 百度网盘地址: http://pan.baidu.com/s/1qXH ...
- birt 报表设计总结
1, 通过sql查询出来的数据,当某个字段没有值时,我们期望显示别的东东 在表格单元格或者网格中选中这个值, 在属性编辑器-->映射--> 在映射表中添加映射条件 映射中当使用 等于 时, ...