前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring BeanFactory 容器

Spring BeanFactory 容器

作者头像
逍遥壮士
发布2020-09-18 11:34:53
3440
发布2020-09-18 11:34:53
举报
文章被收录于专栏:技术趋势技术趋势

Spring BeanFactory 容器是什么?

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

类图:

方法说明:

代码语言:javascript
复制
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文件载入上下文定义信息

代码实现:

版本:

代码语言:javascript
复制
<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>
代码语言:javascript
复制
/**
 * @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 +
                '}';
    }
}
代码语言:javascript
复制
<?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>
代码语言:javascript
复制
/**
 *
 * 功能描述: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));
    }

}

结果

代码语言:javascript
复制
七月 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

类图

代码语言:javascript
复制
public interface FactoryBean<T> {

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

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

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

}
代码语言:javascript
复制
<?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>
代码语言:javascript
复制
/**
 * @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);
    }

}
代码语言:javascript
复制
"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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档