Spring学习笔记5 GoF之工厂模式_biubiubiu0706的博客-CSDN博客
Spring为Bean提供了多种实例化方式,通常包括4中(目的:更加灵活)
1.通过构造方法实例化
2.通过简单工厂模式实例化
3.通过factory-bean实例化
4.通过FactoryBean接口实例化
新建模块 spring-005
依赖
<!--Spring依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.10</version> </dependency> <!--junit单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!--Log4j2依赖--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.19.0</version> </dependency>
Spring默认的日志是log4j2,引入依赖,在resource添加log4j2.xml(文件名固定)便可以使用日志
<?xml version="1.0" encoding="UTF-8"?> <configuration> <loggers> <!-- level指定⽇志级别,从低到⾼的优先级: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF --> <root level="INFO"> <appender-ref ref="spring6log"/> </root> </loggers> <appenders> <!--输出⽇志信息到控制台--> <console name="spring6log" target="SYSTEM_OUT"> <!--控制⽇志输出的格式--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/> </console> </appenders> </configuration>
1.通过构造方法实例化
2.通过简单工厂模式实例化(又称静态工厂方法实例化)
3.通过factory-bean实例化(其实这种方式是通过工厂方法模式)
简单工厂模式(静态工厂方法)是通过一个静态方法实例化所有产品
工厂方法模式是通过多个工厂具体实例化对应产品-->工厂里面是实例方法
4.通过FactoryBean接口实例化
在第三种方式中,factory-bean是我们自定义的,factory-method也是我们自定义的
在Spring中,当你编写的类直接实现FactoryBean接口之后,fantory-bean就不需要指定了
factory-method也不需要指定了.
factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。
也就是说上面的GunFactory实际上就是一个FactoryBean
FactoryBean和BeanFactory的区别
面试题:
BeanFactory是SpringIOC容器的顶级接口,在Spring的IOC容器中,BeanFactory是工厂
FactoryBean:是辅助Spring实例化Bean对象的一个Bean(工厂Bean)
Spring中Bean可以分为两类
1.普通Bean
2.工厂Bean(工厂Bean也是一种Bean,只不过这种Bean比较特殊,它可以辅助Spring实例化其他Bean)
注入自定义Date
Date在Spring中被当作简单类型,简单类型在注入的时候可以直接使用value属性赋值.但是
用value属性赋值的化,对日期格式比较严格.必须是这种格式 Mon Oct 10 14:30:26 CST 2022
其他格式不会被识别.
问题是一直这种格式,写代码会很费劲
当非简单类型 这种只能获得系统当前时间
但是这样时间只是系统当前时间
使用FactoryBean