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的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...
随机推荐
- JAVA线程池应用的DEMO
在做很多高并发应用的时候,单线程的瓶颈已经满足不了我们的需求,此时使用多线程来提高处理速度已经是比较常规的方案了.在使用多线程的时候,我们可以使用线程池来管理我们的线程,至于使用线程池的优点就不多说了 ...
- 【DDD】领域驱动设计实践 —— 框架实现
本文主要了在社区服务系统(ECO)中基于SpringMVC+mybatis框架对DDD的落地实现.本文为系列文章中的其中一篇,其他内容可参考:通过业务系统的重构实践DDD. 框架实现图 该框架实现基本 ...
- input长度随输入内容动态变化 input光标定位在最右侧
<input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(this. ...
- [iOS开发]Xcode8兼容iOS7以及低版本Xcode调试高版本iOS系统
现在的项目一般都要兼容iOS7系统,同时也要兼容iOS10,在Xcode8上面,默认情况下无法调试iOS7,因为缺乏调试iOS7需要的配置文件.同时在低版本的Xcode上面(8以下),也无法调试iOS ...
- poj 3694双联通缩点+LCA
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...
- java伪代码
愚公移山的目标是毕力平险,指通豫南,达于汉阴,方法是扣石垦壤,箕畚运于渤海之尾 条件判断if(愚公死了)我的儿子替我完成.循环结构是“子又生孙,孙又生子,子子孙孙无穷匮也” import.java.大 ...
- 个人作业3—个人总结(Alpha阶段)
一.个人总结 在Alpha阶段,我们团队通过合作的方式,完成了之前觉得不大可能会完成的事(至少在我看来是这样的),大家其实之前的写代码能力都不太好,这期间大家都是边学边做,边做边学,最后跌跌撞撞的完成 ...
- 团队作业8——第二次项目冲刺(Beta阶段)--第二天
团队作业8--第二次项目冲刺(Beta阶段)--第二天 会议照片: 燃尽图: 项目进展: 今天完成了记录用户的姓名,其他的任务还在跟进. 团队贡献比: 队员 角色 团队贡献比 陈麟凤 PM 16% 张 ...
- 201521123052《Java程序设计》第2周学习总结
1. 本周学习总结 String类一些用法 学习Array类 使用枚举 使用eclipse关联JDK源代码 使用码云管理云代码 2.书面作业 1.使用Eclipse关联jdk源代码,并查看String ...
- 201521123010 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...