Spring的FactoryBean的基本认识
来源:互联网 发布:魔兽数据库7.0手机 编辑:程序博客网 时间:2024/06/10 00:12
FactoryBean:工厂Bean
IOC容器内部一种特殊的Bean,主要作用就是管理内部的Bean实例对象(单例/原型对象),扮演类似工厂的角色
特点:
通过Bean名称只能获取其生产的对象,而不是FactoryBean本身,如果需要获取FactoryBean本身可以通过“&Bean名称”的形式获取
测试:
首先构建一个FactoryBean:UserFactoryBean
package com.zhiwei.factoryBean;import org.springframework.beans.factory.FactoryBean;public class UserFactoryBean implements FactoryBean<User> { /** * FacotryBean生产的对象 */ @Override public User getObject() throws Exception { return new User(); } @Override public Class<User> getObjectType() { return User.class; } /** * 判断FactoryBean管理的对象是否是单例对象 */ @Override public boolean isSingleton() { return false; }}
辅助类:User
package com.zhiwei.factoryBean;public class User { private String name; private int age; public User(){ this("zhangsan",20); } public User(String name,int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; }}
Spring配置文件:
<!-- 普通的FactoryBean --> <bean id="userFactoryBean" class="com.zhiwei.factoryBean.UserFactoryBean"/>
测试代码:
ApplicationContext ac = new ClassPathXmlApplicationContext("com/zhiwei/factoryBean/applicationContext.xml"); //---------获取FactoryBean生产的对象 Object obj = ac.getBean("userFactoryBean"); System.err.println("userFactoryBean对象类型:"+obj.getClass().getName()); //--------获取factoryBean本身 obj = ac.getBean("&userFactoryBean"); System.err.println("&userFactoryBean对象类型:"+obj.getClass().getName()); //----------判断FactoryBean管理的是否是单例对象 System.err.println("userFactoryBean管理单例对象:"+((UserFactoryBean)obj).isSingleton());
控制台日志:
userFactoryBean对象类型:com.zhiwei.factoryBean.User
&userFactoryBean对象类型:com.zhiwei.factoryBean.UserFactoryBean
userFactoryBean管理单例对象:false
FactoryBean的用途:
一般进行Spring和其他的ORM框架整合时一般会用到FactoryBean,例如整合Hibernate使用的LocalSessionFactoryBean,整合mybatis使用的SqlSessionFactoryBean等,一般这些FactoryBean主要用于对一些配置信息的管理,例如数据源
单例FactoryBean应用:
定义DatabaseFactoryBean:
package com.zhiwei.factoryBean;import org.springframework.beans.factory.FactoryBean;/** * 单例模式:FactoryBean的应用 * @author Yang ZhiWei * */public class DatabaseFactoryBean implements FactoryBean<DatabaseConfig>{ private DatabaseConfig databaseConfig; public DatabaseConfig getDatabaseConfig() { return databaseConfig; } public void setDatabaseConfig(DatabaseConfig databaseConfig) { this.databaseConfig = databaseConfig; } /** * 单例模式返回规定的对象 */ @Override public DatabaseConfig getObject() throws Exception { if(null == databaseConfig){ synchronized (databaseConfig) { if(null == databaseConfig){ databaseConfig = new DatabaseConfig(); } } } return databaseConfig; } @Override public Class<User> getObjectType() { return User.class; } /** * FactoryBean管理单例对象,返回true */ @Override public boolean isSingleton() { return true; }}
辅助类:DatabaseConfig
package com.zhiwei.factoryBean;/** * 数据库配置信息 * @author Yang ZhiWei * */public class DatabaseConfig { private String databaseName; private String ip; private String port; private String userName; private String passwd; public String getDatabaseName() { return databaseName; } public void setDatabaseName(String databaseName) { this.databaseName = databaseName; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getPort() { return port; } public void setPort(String port) { this.port = port; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } @Override public String toString() { return "DatabaseConfig [databaseName=" + databaseName + ", ip=" + ip + ", port=" + port + ", userName=" + userName + ", passwd=" + passwd + "]"; }}
Spring配置文件:
<!-- 配置数据源 --> <bean id="dataSource" class="com.zhiwei.factoryBean.DatabaseConfig"> <property name="databaseName" value="test"/> <property name="ip" value="127.0.0.1"/> <property name="port" value="3306"/> <property name="userName" value="userName"/> <property name="passwd" value="test"></property> </bean> <!-- 配置数据库访问FactoryBean --> <bean id="databaseFactoryBean" class="com.zhiwei.factoryBean.DatabaseFactoryBean"> <property name="databaseConfig" ref="dataSource"/> </bean>
测试代码:
//-----------------------使用数据库的FactoryBean DatabaseConfig databaseConfig = (DatabaseConfig) ac.getBean("databaseFactoryBean"); System.out.println(databaseConfig);
控制台日志:
DatabaseConfig [databaseName=test, ip=127.0.0.1, port=3306, userName=userName, passwd=test]
1 0
- Spring的FactoryBean的基本认识
- spring的FactoryBean<T>
- Spring的FactoryBean使用
- spring的FactoryBean
- Spring的FactoryBean详解
- spring 的 factoryBean
- Spring的FactoryBean接口
- Spring的FactoryBean与PropertyEditor
- spring的beanFactory和factoryBean
- spring的beanFactory和factoryBean
- 对Spring FactoryBean的总结
- spring的beanFactory和factoryBean
- spring的beanFactory和factoryBean
- spring的beanFactory和factoryBean
- Spring中FactoryBean的应用
- spring的beanFactory和factoryBean
- spring的FactoryBean和BeanFactoryw
- spring的beanFactory和factoryBean
- Ubuntu中Mysql中文存储乱码设置问题
- 属性动画Demo
- POJ2404:Jogging Trails
- Android透明度换算
- php面向接口编程
- Spring的FactoryBean的基本认识
- 抓包工具Fiddler的使用教程(二十):深入研究AutoResponder
- 最全最好用的Android Studio插件整理
- phpcms v9 本地安装(upupw)
- framework 与 Settings 模块
- 性能测试总结—测试流程篇
- componentsJoinedByString 转化的字符串存储到数据库内部后,显示一个口
- strcpy strncpy实验
- JS:正则表达式学习笔记(十) - 字符串对象方法