专栏首页技术趋势Spring BeanFactory 容器

Spring BeanFactory 容器

Spring BeanFactory 容器是什么?

BeanFactory简称bean工厂,是整个spring的核心父类,也是IOC容器或对象的工厂,类是:org.springframework.beans.factory.BeanFactory,是一个接口类,主要定义一些接口的功能为子类来实现。ApplicationContext、ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等,这些都是BeanFactory的各种功能实现。

类图:

方法说明:

public interface BeanFactory {

   /**
        * 通过该&将FactoryBean进行转义,通过&进行转义可以获取到工厂,否则则拿到工厂生成的对象。
    */
   String FACTORY_BEAN_PREFIX = "&";


   /**
    * 通过名称获取IOC容器中的bean
    */
   Object getBean(String name) throws BeansException;

   /**
    * 通过名称和Class类型获取IOC容器中的bean
    */
   <T> T getBean(String name, Class<T> requiredType) throws BeansException;

   /**
    * 通过class类型获取容器中的bean
    */
   <T> T getBean(Class<T> requiredType) throws BeansException;

   /**
        * 通过名称和对象获取bean
    */
   Object getBean(String name, Object... args) throws BeansException;

   /**
    * 
    */
   <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;


   /**
    * 通过名称判断bean是否存在
    */
   boolean containsBean(String name);

   /**
    * 通过名称判断bean是否单例
    */
   boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

   /**
    * 通过名称判断是否是原型bean
    */
   boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

   /**
    * 通过名称和类型匹配是否一致 比如 user,User
    */
   boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

   /**
    * 同上
    */
   boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

   /**
    * 返回给定名称bean的类型
    */
   Class<?> getType(String name) throws NoSuchBeanDefinitionException;

   /**
    * 获取bean的别名
    */
   String[] getAliases(String name);

}

1.ClassPathXmlApplicationContext 从类路径的xm文件载入上下文定义的信息

2.FileSystemXmlApplicationContext 从文件系统的xml文件载入上下文定义信息

代码实现:

版本:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.11.RELEASE</version>
</dependency>
/**
 * @Auther: csh
 * @Date: 2020/7/7 17:56
 * @Description:用户信息
 */
public class User implements Serializable {
    private String userName;
    private int age;

    public User() {
    }

    public User(String userName, int age) {
        this.userName = userName;
        this.age = age;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--通过属性注入-->
    <bean id="user" name="userTTTT" class="com.hong.spring.common.entity.User" >
        <property name="age" value="20" />
        <property name="userName" value="csh" />
    </bean>
</beans>
/**
 *
 * 功能描述:beanFactory测试
 *
 * @param:
 * @return:
 * @auther: csh
 * @date: 2020/7/8 18:36
 */
public class BeanFactoryTest {
    public static void main(String[] args) {
       //从类路径的xm文件载入上下文定义的信息
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfile*.xml");
System.out.println("context 已启动!");
User user = context.getBean(User.class,"user");
System.out.println("user信息:"+user.toString()+":内存"+System.identityHashCode(user));
System.out.println("是否包含:"+context.containsBean("user"));
System.out.println("是否单例:"+context.isSingleton("user"));
System.out.println("是否一致!"+context.isTypeMatch("user",User.class));
Class <?> user1 = context.getType("user");
System.out.println(user1.toString());
System.out.println(Arrays.asList(context.getAliases("user")).toString());
//从文件系统的xml文件载入上下文定义信息
ApplicationContext context2 = new FileSystemXmlApplicationContext("src/main/resources/applicationfile*.xml");
User user2 = context2.getBean(User.class,"user");
System.out.println("user2信息:"+user2.toString()+":内存"+System.identityHashCode(user2));
    }

}

结果

七月 08, 2020 6:45:13 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2e0fa5d3: startup date [Wed Jul 08 18:45:13 CST 2020]; root of context hierarchy
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\ideaWorkSpace\spring\target\classes\applicationfile-arg.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\ideaWorkSpace\spring\target\classes\applicationfile-scan.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\ideaWorkSpace\spring\target\classes\applicationfile-setter.xml]
context 已启动!
user信息:User{userName='csh', age=20}
是否包含:true
是否单例:true
是否一致!true
class com.hong.spring.common.entity.User
[userTTTT]
七月 08, 2020 6:45:13 下午 org.springframework.context.support.FileSystemXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@612fc6eb: startup date [Wed Jul 08 18:45:13 CST 2020]; root of context hierarchy
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\ideaWorkSpace\spring\src\main\resources\applicationfile-arg.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\ideaWorkSpace\spring\src\main\resources\applicationfile-scan.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\ideaWorkSpace\spring\src\main\resources\applicationfile-setter.xml]
user2信息:User{userName='csh', age=20}

BeanFactory和FactoryBean的区别

spring的bean分为两种,一种为普通注入的bean,另外一种就是FactoryBean,两种bean是不一样,可以简单理解为一种是工厂(系统)的bean,一种是业务的bean。而想通过FactoryBean来getBean(id)来获取。

简单理解为:BeanFactory是个工厂,而FactoryBean是一个Bean而这个bean是可以能生产或者修饰对象生成的工厂bean。类位置:org.springframework.bean.factory.FactoryBean

类图

public interface FactoryBean<T> {

   /**
    * 获取对象
    */
   T getObject() throws Exception;

   /**
    * 获取类型
    */
   Class<?> getObjectType();

   /**
    * 是否单例
    */
   boolean isSingleton();

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--通过属性注入-->
    <bean id="userFactory" name="userFactory2" class="com.hong.spring.beanfactory.FactoryBeanTest" >
    </bean>
</beans>
/**
 * @Auther: csh
 * @Date: 2020/7/8 19:28
 * @Description:测试factoryBean
 */
public class FactoryBeanTest implements FactoryBean<User> {
    public User getObject() throws Exception {
        return new User();
    }

    public Class <?> getObjectType() {
        return User.class;
    }

    public boolean isSingleton() {
        return true;
    }

    public static void main(String[] args) {
        BeanFactory bf = new ClassPathXmlApplicationContext("applicationfile-factorybean.xml");
        User user = (User)bf.getBean("userFactory");
        System.out.println(user);
    }

}
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.2.3\lib\idea_rt.jar=51969:C:\Program Files\JetBrains\IntelliJ IDEA 2018.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;D:\ideaWorkSpace\spring\target\classes;D:\mvn\org\springframework\spring-context\4.3.11.RELEASE\spring-context-4.3.11.RELEASE.jar;D:\mvn\org\springframework\spring-aop\4.3.11.RELEASE\spring-aop-4.3.11.RELEASE.jar;D:\mvn\org\springframework\spring-beans\4.3.11.RELEASE\spring-beans-4.3.11.RELEASE.jar;D:\mvn\org\springframework\spring-core\4.3.11.RELEASE\spring-core-4.3.11.RELEASE.jar;D:\mvn\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\mvn\org\springframework\spring-expression\4.3.11.RELEASE\spring-expression-4.3.11.RELEASE.jar;D:\mvn\org\springframework\spring-test\4.3.11.RELEASE\spring-test-4.3.11.RELEASE.jar" com.hong.spring.beanfactory.FactoryBeanTest
七月 08, 2020 7:31:34 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@685f4c2e: startup date [Wed Jul 08 19:31:34 CST 2020]; root of context hierarchy
七月 08, 2020 7:31:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationfile-factorybean.xml]
User{userName='null', age=0}

最后

BeanFactory是一个接口类,就是IOC(DI)的容器,它的实现负责将对象转化为bean,管理bean的整个生命周期。BeanFactory只能管理单例,当然如果若想实现多例,通过子类ApplicationContext获取可以在xml加添加scope="prototype"。

参考文献:

参考1

参考2

本文分享自微信公众号 - 技术趋势(jishuqs),作者:逍遥壮士

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring的AOP

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AO...

    逍遥壮士
  • spring使用e-mail

    常用的电子邮件协议有SMTP、POP3、IMAP4,它们都隶属于TCP/IP协议簇,默认状态下,分别通过TCP端口25、110和143建立连接。

    逍遥壮士
  • 问题:mysql数据库查询出来有数据而ssm查询出来是[]

    前两天帮一位朋友看一个问题,发现有点奇怪,问题是这样的,ssm的框架数据库查询出来的数据,而ssm没有报错,查询出来没有数据并且结果为【】。

    逍遥壮士
  • Ribbon讲解与应用

    注意:Ribbon就属于进程内LB ,它只是一个类库,集成于消费方进程,消费方通过它来 获取到服务提供方的地址 。

    全栈自学社区
  • SpringCloud的入门学习之概念理解、Ribbon负载均衡入门

    1、Ribbon负载均衡,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端、负载均衡的工具。

    别先生
  • SSM框架整合 原

    wuweixiang
  • 电商网站开发记录(三) Spring的引入,以及配置详解

    Dar_Alpha
  • 第八章:Shiro和Spring的集成——深入浅出学Shiro细粒度权限开发框架

    Standalone Applications nShiro 应用程序需要一个具有单例SecurityManager 实例的应用程序。请注意,这不会是一个静态的...

    MonroeCode
  • 第八章:Shiro和Spring的集成——深入浅出学Shiro细粒度权限开发框架

    Standalone Applications

    MonroeCode
  • SaaS公司持久性和弹性的一次测试

    ? 来源:栈外 ID:zhanwai_    ---- 本文看点 ▪ 经济衰退中,投资环境风云变幻。不断扩充的新基金会继续投资,但公司估值可能会下降,市场会更...

    腾讯SaaS加速器

扫码关注云+社区

领取腾讯云代金券