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:ideaWorkSpacespringtargetclassesapplicationfile-arg.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:ideaWorkSpacespringtargetclassesapplicationfile-scan.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:ideaWorkSpacespringtargetclassesapplicationfile-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:ideaWorkSpacespringsrcmainresourcesapplicationfile-arg.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:ideaWorkSpacespringsrcmainresourcesapplicationfile-scan.xml]
七月 08, 2020 6:45:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:ideaWorkSpacespringsrcmainresourcesapplicationfile-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 FilesJavajdk1.8.0_181binjava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2018.2.3libidea_rt.jar=51969:C:Program FilesJetBrainsIntelliJ IDEA 2018.2.3bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.8.0_181jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_181jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_181jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_181jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_181jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_181jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_181jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_181jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_181jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_181jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_181jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_181jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_181jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_181jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_181jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_181jrelibjce.jar;C:Program FilesJavajdk1.8.0_181jrelibjfr.jar;C:Program FilesJavajdk1.8.0_181jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_181jrelibjsse.jar;C:Program FilesJavajdk1.8.0_181jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_181jrelibplugin.jar;C:Program FilesJavajdk1.8.0_181jrelibresources.jar;C:Program FilesJavajdk1.8.0_181jrelibrt.jar;D:ideaWorkSpacespringtargetclasses;D:mvnorgspringframeworkspring-context4.3.11.RELEASEspring-context-4.3.11.RELEASE.jar;D:mvnorgspringframeworkspring-aop4.3.11.RELEASEspring-aop-4.3.11.RELEASE.jar;D:mvnorgspringframeworkspring-beans4.3.11.RELEASEspring-beans-4.3.11.RELEASE.jar;D:mvnorgspringframeworkspring-core4.3.11.RELEASEspring-core-4.3.11.RELEASE.jar;D:mvncommons-loggingcommons-logging1.2commons-logging-1.2.jar;D:mvnorgspringframeworkspring-expression4.3.11.RELEASEspring-expression-4.3.11.RELEASE.jar;D:mvnorgspringframeworkspring-test4.3.11.RELEASEspring-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"。
参考文献:
- 使用xUnit为.net core程序进行单元测试(4)
- 使用xUnit为.net core程序进行单元测试(3)
- 使用xUnit为.net core程序进行单元测试(2)
- 使用xUnit为.net core程序进行单元测试(1)
- 用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api
- asp.net core 2.0 查缺补漏
- SQL Server 性能优化之——T-SQL NOT IN 和 NOT Exists
- SQL Server 性能优化之——重复索引
- SQL Server 性能优化之——系统化方法提高性能
- C# 调用PowerShell方法
- 使用Visual Studio 2010 一步一步创建Powershell Module 和 Cmdlet
- [SQLServer大对象]——FileTable初体验
- JavaScript闭包,只学这篇就会了
- [数据库基础]——编码标准之格式
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- AllTube:视频解析下载源码安装教程
- Zsh和Oh My Zsh的安装配置
- 程序猿怎么利用技术挣钱?——python量化实践
- 利用WireGuard建立IPv6隧道
- selenium爬虫相关报错解决
- 小涴熊漫画CMS:非常不错的免费开源的漫画连载系统,带采集API
- 成都电信宽带获取IPV6地址全过程
- android studio 3.6.1导入项目报错提示无法下载classpath里的内容
- Linux VPS使用命令行快速查询百度网盘提取码
- Flutter 首页必用组件NestedScrollView的示例详解
- AUXPI:简单的API图床程序,支持上传到搜狗/新浪/SMMS等多个图床
- android使用TextView实现跑马灯效果
- Android 自定义 View 中使用 Spannable的实例详解
- Android实现扫描和生成二维码
- android自定义弹出框样式的实现方法