复杂对象、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相关推荐

  1. 【Java从0到架构师】Spring - 纯注解开发

    纯注解开发 纯注解开发 - AOP 纯注解开发 - 整合 MyBatis 纯注解开发 - 事务管理 JSR 注解 JSR 注解 - @Resource.@Inject JSR 注解 - @PostCo ...

  2. 【Java从0到架构师】Spring - 注解

    注解 读取多个配置文件 注解实现 bean 标签 - @Component.@Component-scan 注解实现注入 - @Autowired.@Value.@PropertySource 注解实 ...

  3. 【Java从0到架构师】Spring - 事务管理

    事务管理 声明式事务 propagation - 设置事务传播行为 read-only - 告诉数据库该事务只读 timeout - 超时抛出异常 rollback-for.no-rollback-f ...

  4. 【Java从0到架构师】Spring - AOP

    AOP AOP 编程使用 AOP - MethodBeforeAdvice AOP - MethodInterceptor AOP - 动态代理的底层实现 AOP - 切入点表达式 AOP - 目标方 ...

  5. 【Java从0到架构师】Spring - 生命周期、代理

    生命周期.代理 bean 的生命周期 代理 业务层的一些问题 静态代理 (Static Proxy) 动态代理 (Dynamic Proxy) JDK 动态代理 - Proxy.newProxyIns ...

  6. 【Java从0到架构师】Spring - 整合 MyBatis

    整合 MyBatis 整合 MyBatis - 依赖 整合 MyBatis - 数据源 整合 MyBatis - SqlSessionFactoryBean 整合 MyBatis - MapperSc ...

  7. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入

    IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...

  8. 【Java从0到架构师】JDBC、Spring JDBC、JUnit

    JDBC 下载 MySQL 的 JDBC 实现(jar,驱动包) JDBC 使用 Statement 的常用 API ResultSet 的常用 API PreparedStatement 配置文件 ...

  9. 【Java从0到架构师(1),Java中高级面试题总结(全面)

    JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...

最新文章

  1. 未来到底是什么样子?
  2. python程序员薪资-python工资高还是java?
  3. Mathtype写分段函数的方法
  4. 一起来学ES —— 浅谈Nested结构
  5. 关于我对于写博客写文章的理解
  6. python做excel自动化-用Python控制Excel实现自动化办公,手把手教你
  7. 18.10 汇编语句
  8. 【Oracle】Oracle错误编码大全
  9. 【软件逆向-分析工具】反汇编和反编译工具
  10. SFP+光纤模块使用
  11. Android 裸眼3D效果View
  12. c语言写的exe文件怎么改图标,c/c++修改exe文件图标
  13. 教你如何做好微信客户管理?做到这3点,效率翻5倍
  14. MATLAB-修改图片的背景颜色
  15. 随机获取4位26个英文字母和数字组合的值(4位随机码)
  16. 银联支付前端页面跳转
  17. 【简介】流程化项目管理咨询师刘俊平介绍
  18. 编程实现顺序表的基本操作
  19. 魔方二阶玩法[图解]
  20. OBS 基础19 窗口置顶

热门文章

  1. 指针用作函数参数、指针型函数和函数指针
  2. SQL Server 2016中的新PowerShell Cmdlet
  3. sql server合并行_合并SQL Server复制参数化的行筛选器问题
  4. SQL Server维护计划–好处,功能和特性
  5. The 10th Shandong Provincial Collegiate Programming Contest 2019山东省赛游记+解题报告
  6. CIO:让IT成为企业的一种竞争优势
  7. Spring JMS 整合 ActiveMQ
  8. sublime text 3 package control
  9. Oracle忽略hint的几种情形
  10. php随笔10-thinkphp 3.1.3 模板继承 布局