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"。
参考文献:
- 绕过混合内容警告 - 在安全的页面加载不安全的内容
- 如何在Kerberos环境使用Flume采集Kafka数据并写入HDFS
- 熊市里生成几个BTC靓号,冷存储起来装死吧
- 傲游浏览器漏洞系列(上)- 任意文件写入,UXSS
- 如何使用Cloudera Manager在线为集群减容
- GitLab 任意文件读取漏洞 (CVE-2016-9086) 和任意用户 token 泄露漏洞
- 如何使用Hue通过数据文件创建Collections
- GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析
- Memcached 命令执行漏洞(CVE-2016-8704、CVE-2016-8705、CVE-2016-8706)简析
- 使用Hue创建Ssh的Oozie工作流时重定向输出日志报错分析
- Joomla未授权创建特权用户漏洞(CVE-2016-8869)分析
- 检测本地文件躲避安全分析
- 如何在Kerberos的Linux上安装及配置Impala的ODBC驱动
- 对抗静态分析——so文件的加密
- 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 文档注释
- 前端学数据结构与算法(三):链表为什么能和数组相提并论?用链表实现数组bettle下
- 前端学数据结构与算法(二):数组的操作特性与栈的应用
- 前端学数据结构与算法(一):不会复杂度分析,算法等于白学
- 高可扩展性系统的设计
- Vue如何实现导出页面为PDF
- 短视频APP开发,如何做到获取播放视频和音频文件
- 3分钟短文:Laravel模型创建数据条目的2个语法糖
- leetcode队列之最近的请求次数
- 路由策略中的IP-Prefix你了解多少?
- Qt音视频开发29-Onvif云台控制
- 十大高性能开发
- 【云+社区年度征文】java agent及字节码技术得到DNS时间流程尝试
- 短视频商城源码,制作彩色验证码
- ubuntu下的mysql安装与使用
- 排序算法