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的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...
随机推荐
- Microsoft Dynamics 365 之 味全食品 项目分享和Customer Engagement新特性分享
味全食品 Dynamics 365项目: 在企业门户和电子商务等新营销模式频出的今天,零售业需要利用统一的管理平台管理日益庞大的客户及销售数据,整合线上线下的零售业务,从采购.仓储.生产.配送到销售. ...
- cocoapods的安装和使用以及版本升级遇到的问题
一.CocoaPods是什么? CocoaPods是一个负责管理iOS项目中第三方开源库的工具.CocoaPods的项目源码在Github上管理.该项目开始于2011年8月12日,在这两年多的时间里, ...
- java 运行时常量、编译时常量、静态块执行顺序
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt223 常量是程序运行时恒定不变的量,许多程序设计语言都有某种方法,向编译器告 ...
- el表达式里面fn的用法
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp31 头部加入标签库 <%@ taglib prefix=" ...
- Java缓存类的实际应用场景
不要着迷于技术,应把注意力放到问题上. 一个普通的后台管理系统,一定会有参数配置.参数配置数据表和其他的数据表是不同的,它的操作基本都是查的操作.参数配置的这些数据信息是贯穿在整个项目中,那么把他们放 ...
- Entity Framework Core 2.0 数据库迁移
看见过几篇其他大神写的关于EFCore2.0的文章.本人有点小白,一开始看文档的时候除了一些基本操作外其他部分几乎没有读懂,我估计会有一部分人跟我一样,因为人家读懂了的早就懂了. 在这里我写一下我自己 ...
- 所谓编码--泛谈ASCII、Unicode、UTF8、UTF16、UCS-2等编码格式
最近在看nodejs的源码,看到stream的实现里面满地都是encoding,不由想起以前看过的一篇文章--在前面的随笔里面有提到过--阮一峰老师的<字符编码笔记:ASCII,Unicode和 ...
- grunt之connect、watch
先说下这两个插件配合的用处,简单的说,它们可以拯救你的F5.connect用于建立一个静态服务器,watch监听文件的修改并自动实时刷新浏览器的页面. 还是options走起. connect(V0. ...
- java--整理下关于static关键字的知识
如果将域定义为static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.--<java核心技术> 使用static的两种情形:1.只想为某特定域分配单一存储 ...
- 201521123040《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...