1、抽象bean与子bean

用于指定配置模板。

2、容器中的工厂bean

这种工厂bean必须实现FactoryBean接口,通过spring容器getBean()方法获取它时,容器返回的不是FactoryBean实现类的实例,而是返回FactoryBean的产品(即该工厂bean的getObject()方法的返回值,至于该方法返回什么东西,使我们重写该方法时决定的,一般是工厂bean生成的实例)。

FactoryBean接口提供了3个方法:

1》T getObject():实现该方法返回该工厂bean生成的java实例。

2》Class<?> getObjectType():实现该方法返回该工厂bean生成的java实例的实现类。

3》bolean isSingleton():实现该方法表示该工厂bean生成的java实例是否为单例模式。

举一例子:

GetFieldFactoryBean.java

package com.lfy.bean;

import java.lang.reflect.Field;

import org.springframework.beans.factory.FactoryBean;

public class GetFieldFactoryBean implements FactoryBean<Object> {

   private String targetClass;
private String targetField; public void setTargetClass(String targetClass) {
this.targetClass=targetClass;
} public void setTargetField(String targetField) {
this.targetField=targetField;
} /**
* 返回工厂bean所生产的产品
*/
@Override
public Object getObject() throws Exception{ Class<?> clazz=Class.forName(targetClass);
Field field=clazz.getField(targetField);
return field.get(null);
} /**
* 获取工厂bean所生产的产品的类型
*/
@Override
public Class<? extends Object> getObjectType() { return Object.class;
} /**
* 返回该工厂bean所生产的产品是否为单例
*/
@Override
public boolean isSingleton() { return false;
}
}

Cat.java

package com.lfy.bean;

public class Cat {

    //品种:猫
public static final String variety="猫"; //叫声:有可能是“喵喵”,也有可能是其他的
public static String voice="喵喵";
}

Dog.java

package com.lfy.bean;

public class Dog {

    //品种:狗
public static final String variety="狗"; //叫声:有可能是“汪汪”,也有可能是其他的
public static String voice="汪汪";
}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean id="cat" class="com.lfy.bean.GetFieldFactoryBean">
<property name="targetClass" value="com.lfy.bean.Cat"/>
<property name="targetField" value="voice"/>
</bean> <bean id="dog" class="com.lfy.bean.GetFieldFactoryBean">
<property name="targetClass" value="com.lfy.bean.Dog"/>
<property name="targetField" value="voice"/>
</bean>
</beans>

SpringTest.java

package com.lfy.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* 容器中的工厂bean
* @author lfy
*
*/
public class SpringTest { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml"); System.out.println(ctx.getBean("cat"));
System.out.println(ctx.getBean("dog")); System.out.println(ctx.getBean("&dog"));
} }

运行结果:

总结:spring容器会自动检测容器中的所有bean,如果发现某个bean实现类(如:GetFieldFactoryBean)实现了FactoryBean接口,spring容器就会在实例化该bean,根据<property.../>执行setter方法之后,额外调用该bean的getObject()方法,并将该方法的返回值作为容器中的bean。

对于在ApplicationContext.getBean()方法使用&符号,将会得到FactoryBean本身,而不是它的产品。

3、获取bean本身的部署id

实现BeanNameAware接口,其中的方法setBeanName(String name)方法会在容器检查到目标bean实现了BeanNameAware接口的时候(目标bean已经实例化完成),自动调用该方法,并将目标bean部署时的id作为参数传入到该方法中。

举个例子:

Chinese.java

package com.lfy.bean;

import org.springframework.beans.factory.BeanNameAware;

public class Chinese implements BeanNameAware {

    private String beanName;

    @Override
public void setBeanName(String beanName) { this.beanName=beanName;
} public void info() { System.out.println("Chinese实现类"+",部署该bean时指定的id为:"+beanName);
} }

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean id="chin" class="com.lfy.bean.Chinese"></bean>
</beans>

SpringTest.java

package com.lfy.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lfy.bean.Chinese; /**
* 获得bean本身的id
* @author lfy
*
*/
public class SpringTest { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml"); Chinese chin=ctx.getBean("chin", Chinese.class);
chin.info();
} }

运行结果:

4、强制初始化bean

某些时候需要被依赖bean先于目标bean初始化,可以使用depends-on属性,该属性可以强制初始化一个或者多个被依赖的bean。

spring-第七篇之深入理解容器中的bean的更多相关文章

  1. Spring-----8、深入理解容器中的bean

    转载自:http://blog.csdn.net/hekewangzi/article/details/45648687

  2. Spring扩展:替换IOC容器中的Bean组件 -- @Replace注解

    1.背景:     工作中是否有这样的场景?一个软件系统会同时有多个不同版本部署,比如我现在做的IM系统,同时又作为公司的技术输出给其他银行,不同的银行有自己的业务实现(比如登陆验证.用户信息查询等) ...

  3. 从Spring容器中获取Bean。ApplicationContextAware

    引言:我们从几个方面有逻辑的讲述如何从Spring容器中获取Bean.(新手勿喷) 1.我们的目的是什么? 2.方法是什么(可变的细节)? 3.方法的原理是什么(不变的本质)? 1.我们的目的是什么? ...

  4. Spring容器中的Bean

    一,配置合作者的Bean Bean设置的属性值是容器中的另一个Bean实力,使用<ref.../>元素,可制定一个bean属性,该属性用于指定容器中其他Bean实例的id属性 <be ...

  5. String框架搭建的基本步骤,及从 IOC & DI 容器中获取 Bean(spring框架bean的配置)--有实现数据库连接池的链接

    Spring框架的插件springsource-tool-suite-3.4.0.RELEASE-e4.3.1-updatesite(是一个压缩包)导入步骤: eclipse->help-> ...

  6. 在listener或者工具中使用spring容器中的bean实例

    在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...

  7. FastJson序列化Json自定义返回字段,普通类从spring容器中获取bean

    前言: 数据库的字段比如:price:1 ,返回需要price:1元. 这时两种途径修改: ① 比如sql中修改或者是在实体类转json前遍历修改. ②返回json,序列化时候修改.用到的是fastj ...

  8. spring 在容器中一个bean依赖另一个bean 需要通过ref方式注入进去 通过构造器 或property

    spring  在容器中一个bean依赖另一个bean 需要通过ref方式注入进去 通过构造器 或property

  9. 7 -- Spring的基本用法 -- 5... Spring容器中的Bean;容器中Bean的作用域;配置依赖;

    7.5 Spring容器中的Bean 7.5.1 Bean的基本定义和Bean别名 <beans.../>元素是Spring配置文件的根元素,该元素可以指定如下属性: default-la ...

随机推荐

  1. 利用vsftpd在Linux构建安全的FTP服务

    最近在机房搭建Linux环境,需要用到了FTP服务,查看了许多的资料,在这里做一下笔记 一.安装 方法一,使用yum命令安装,需要能够连接外网 # yum install vsftpd 方法二,使用安 ...

  2. neo4j图形数据库Java应用

    CREATE (陈冠希:明星 {名称: "陈冠希"}), (王菲:明星 {名称: "王菲"}), (李亚鹏:明星 {名称: "李亚鹏"}), ...

  3. hadoop HA + HBase HA搭建:

    hadoop HA搭建参考:https://www.cnblogs.com/NGames/p/11083640.html (本节:用不到YARN 所以可以不用考虑部署YARN部分) Hadoop 使用 ...

  4. Codeforces Round #425 (Div. 2) - A

    题目链接:http://codeforces.com/contest/832/problem/A 题意:有n个棍子,两个人轮流取这些棍子,每个人每次只能去恰好k个棍子(不足k个则不能取),问先手取的棍 ...

  5. zabbix 4.2 发送警告邮件Python脚本

    #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysimport getoptimport smtplibfrom email.MIMETe ...

  6. Git命令——提交、查看、后退、前进

    Git常用命令 1. 命令git init把这个目录变成Git可以管理的仓库: 2. 命令git commit把文件提交到仓库 这里需要注意的是,Git只能跟踪文本文件的改动,如txt文件,网页,所有 ...

  7. css3-css3属性选择器

    在HTML中,通过各种各样的属性可以给元素增加很多附加的信息.例如,通过id属性可以将不同div元素进行区分. 在CSS2中引入了一些属性选择器,而CSS3在CSS2的基础上对属性选择器进行了扩展,新 ...

  8. kafka docker-composer.yml

    使用Docker快速搭建Kafka开发环境 表现力 关注  0.5 2018.05.04 03:00* 字数 740 阅读 25240评论 1喜欢 11 Docker在很多时候都可以帮助我们快速搭建想 ...

  9. Linux g++ 编译添加 pthread

    If you are going to compile a C program with pthread.h in LINUX using GCC or G++ you will have to us ...

  10. GPS通讯 数据包解析

    全球时区的划分: 每个时区跨15°经度.以0°经线为界向东向西各划出7.5°经度,作为0时区.即0时区的经度范围是7.5°W——7.5°E.从7.5°E与7.5°W分别向东.向西每15°经度划分为一个 ...