【Java从0到架构师】Spring - 复杂对象、Converter
复杂对象、Converter
- 创建过程比较复杂的对象
- 实例工厂
- 静态工厂
- FactroyBean
- 引入外部配置文件
- SpEL表达式
- scope - 控制 bean 是否单例
- Converter
- Spring 内置基本的类型转换功能
- 自定义 Converter
Java 从 0 到架构师目录:【Java从0到架构师】学习记录
学习 Spring 搭配这门课效果更好:《孙哥说Spring5》学习笔记
Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/02_Spring/
创建过程比较复杂的对象
【Spring 工厂】反转控制与依赖注入、Spring工厂创建复杂对象3种方式
实例工厂
public class ConnectionFactory {public Connection getConn1() throws Exception { Class.forName("com.mysql.jdbc.Driver");return DriverManager.getConnection("x", "x", "x");}
}
<!-- 实例工厂 - 调用 factory.getConn() -->
<bean id="factory" class="com.mj.obj.ConnectionFactory"/>
<bean id="conn1" factory-bean="factory" factory-method="getConn1"/>
静态工厂
public class ConnectionFactory {public static Connection getConn2() throws Exception {Class.forName("com.mysql.jdbc.Driver");return DriverManager.getConnection("x", "x", "x");}
}
<!-- 静态工厂方法 - 调用 ConnectionFactory.getConn() -->
<bean id="conn2" class="com.mj.obj.ConnectionFactory" factory-method="getConn2"/>
FactroyBean
public class ConnectionFactoryBean implements FactoryBean<Connection> {@Overridepublic Connection getObject() throws Exception {Class.forName("com.mysql.jdbc.Driver");return DriverManager.getConnection("x", "x", "x");}@Overridepublic Class<?> getObjectType() {return Connection.class;}
}
<bean id="conn" class="com.mj.obj.ConnectionFactoryBean"/>
// & 开头代表创建的是FactoryBean类型的对象
// 参考: BeanFactory中的FACTORY_BEAN_PREFIX
System.out.println(ctx.getBean("&conn"))
引入外部配置文件
# db.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test_mybatis
jdbc.username=root
jdbc.password=root
首先在 applicationContext.xml 根标签中引入标签库:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 引用db.properties文件的内容 -->
<context:property-placeholder location="db.properties"/><!-- FactoryBean -->
<bean id="conn" class="com.mj.obj.ConnectionFactoryBean"><property name="driverClass" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><!-- ${username} 会固定的获取到本机用户名 --><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean>
SpEL表达式
参考资料:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions
<bean id="dog" class="com.mj.domain.Dog"/><bean id="person" class="com.mj.domain.Person"><property name="dog" value="#{dog}"/><property name="age" value="#{dog.testAge}"/><property name="name" value="#{dog.testName.bytes.length}"/><property name="name" value="#{dog.getTestName()}"/>-->
</bean>
scope - 控制 bean 是否单例
参考资料:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes
scope="singleton"
:单例
- 通过同一个 id 值,在统一 IoC 容器中获取的永远是同一个实例
- 在 IoC 容器创建的时候,就会创建 bean,可以设置
lazy-init="true"
修改创建时机
scope="prototype"
:非单例;每次 getBaen 时创建一次 bean
Converter
【Spring5.x】对象的生命周期、配置文件参数化、自定义类型转换器、后置处理Bean
Spring 内置基本的类型转换功能
Spring 已经内置了基本的类型转换功能,比如:
- String 转 int
- String 转 Date(支持 yyyy/MM/dd 格式)
<bean id="service" class="com.mj.service.PersonServiceImpl"><property name="age" value="25"/><property name="birthday" value="2011/09/10"/>
</bean>
自定义 Converter
实现 Converter 接口:
public class DateConverter implements Converter<String, Date> {private List<String> formats;public void setFormats(List<String> formats) {this.formats = formats;}@Overridepublic Date convert(String s) {try {return new SimpleDateFormat(format).parse(s);} catch (ParseException e) {e.printStackTrace();return null;}}
}
注册 Converter:
注:id 为 conversionService 是固定的
<bean id="person" class="com.mj.domain.Person" p:birthday="09_10_2111"/><!-- id 固定为 conversionService -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.mj.converter.DateConverter"><property name="formats" value="yyyy-MM-dd"/></bean><bean class="com.mj.converter.DateConverter"><property name="formats" value="MM_dd_yyyy"/></bean></set></property>
</bean>
进阶示例:在 xml 中传入 list 的类设计
实现 Converter 接口:
public class DateConverter implements Converter<String, Date> {private List<String> formats;public void setFormats(List<String> formats) {this.formats = formats;}@Overridepublic Date convert(String s) {for (String format : formats) {try {SimpleDateFormat fmt = new SimpleDateFormat(format);return fmt.parse(s);} catch (ParseException e) {// e.printStackTrace();}}return null;}
}
注册 Converter:
<bean id="person" class="com.mj.domain.Person" p:birthday="09_10_2111"/><!-- 配置FactoryBean -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.mj.converter.DateConverter"><property name="formats"><list><value>yyyy-MM-dd</value><value>MM_dd_yyyy</value></list></property></bean></set></property>
</bean>
【Java从0到架构师】Spring - 复杂对象、Converter相关推荐
- 【Java从0到架构师】Spring - 纯注解开发
纯注解开发 纯注解开发 - AOP 纯注解开发 - 整合 MyBatis 纯注解开发 - 事务管理 JSR 注解 JSR 注解 - @Resource.@Inject JSR 注解 - @PostCo ...
- 【Java从0到架构师】Spring - 注解
注解 读取多个配置文件 注解实现 bean 标签 - @Component.@Component-scan 注解实现注入 - @Autowired.@Value.@PropertySource 注解实 ...
- 【Java从0到架构师】Spring - 事务管理
事务管理 声明式事务 propagation - 设置事务传播行为 read-only - 告诉数据库该事务只读 timeout - 超时抛出异常 rollback-for.no-rollback-f ...
- 【Java从0到架构师】Spring - AOP
AOP AOP 编程使用 AOP - MethodBeforeAdvice AOP - MethodInterceptor AOP - 动态代理的底层实现 AOP - 切入点表达式 AOP - 目标方 ...
- 【Java从0到架构师】Spring - 生命周期、代理
生命周期.代理 bean 的生命周期 代理 业务层的一些问题 静态代理 (Static Proxy) 动态代理 (Dynamic Proxy) JDK 动态代理 - Proxy.newProxyIns ...
- 【Java从0到架构师】Spring - 整合 MyBatis
整合 MyBatis 整合 MyBatis - 依赖 整合 MyBatis - 数据源 整合 MyBatis - SqlSessionFactoryBean 整合 MyBatis - MapperSc ...
- 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...
- 【Java从0到架构师】JDBC、Spring JDBC、JUnit
JDBC 下载 MySQL 的 JDBC 实现(jar,驱动包) JDBC 使用 Statement 的常用 API ResultSet 的常用 API PreparedStatement 配置文件 ...
- 【Java从0到架构师(1),Java中高级面试题总结(全面)
JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...
最新文章
- 未来到底是什么样子?
- python程序员薪资-python工资高还是java?
- Mathtype写分段函数的方法
- 一起来学ES —— 浅谈Nested结构
- 关于我对于写博客写文章的理解
- python做excel自动化-用Python控制Excel实现自动化办公,手把手教你
- 18.10 汇编语句
- 【Oracle】Oracle错误编码大全
- 【软件逆向-分析工具】反汇编和反编译工具
- SFP+光纤模块使用
- Android 裸眼3D效果View
- c语言写的exe文件怎么改图标,c/c++修改exe文件图标
- 教你如何做好微信客户管理?做到这3点,效率翻5倍
- MATLAB-修改图片的背景颜色
- 随机获取4位26个英文字母和数字组合的值(4位随机码)
- 银联支付前端页面跳转
- 【简介】流程化项目管理咨询师刘俊平介绍
- 编程实现顺序表的基本操作
- 魔方二阶玩法[图解]
- OBS 基础19 窗口置顶
热门文章
- 指针用作函数参数、指针型函数和函数指针
- SQL Server 2016中的新PowerShell Cmdlet
- sql server合并行_合并SQL Server复制参数化的行筛选器问题
- SQL Server维护计划–好处,功能和特性
- The 10th Shandong Provincial Collegiate Programming Contest 2019山东省赛游记+解题报告
- CIO:让IT成为企业的一种竞争优势
- Spring JMS 整合 ActiveMQ
- sublime text 3 package control
- Oracle忽略hint的几种情形
- php随笔10-thinkphp 3.1.3 模板继承 布局