[Spring5 ]Spring工厂
- 什么是spring
- 什么是设计模式
- 工厂设计模式
- spring工厂
- 简单的工厂设计
- spring简易实现原理
- 控制反转 与 依赖注入
- 反转控制 ioc
- 依赖注入 DI
- spring工厂创建复杂对象 3种方式
- factorybean 接口
- factorybean 实现原理
- 实例工厂
- 静态工厂
- Spring 控制对象创建的次数
- 对象的生命周期、配置文件参数化、自定义类型转换器、后置处理Bean
- 什么是对象的生命周期
- 为什么学习对象的生命周期
- 生命周期的3个阶段
- 创建阶段
- 初始化阶段 -init
- 销毁阶段
- 对象的生命周期总结
- 配置文件参数的开发步骤
- 后置处理bean
- 后置处理bean的原理
什么是spring
轻量级的javaee的完整的解决方案,整合众多设计模式
javaee的解决方案
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQGSvgTq-1659679452237)(https://note.youdao.com/yws/res/2904/WEBRESOURCEe4fba1413656a3c494da2abd60a96cad)]
整合设计模式
1.工厂
2.代理
3.模板
4.策略
什么是设计模式
广义概念:面向对象设计中,解决特定问题的经典代码
狭义概念:gof4人定义的23种设计模式
工厂设计模式
1.概念:通过工厂类创建对象
User user = new User;
UserDao userDao = new UserDaoImpl();
2.好处:解耦合
耦合:存在强关联关系
问题:不利于代码维护
简单:把接口的实现类硬编码在程序中
spring工厂
简单的工厂设计
spring简易实现原理
1.spring框架通过ClassPathXmlApplicationContext 工厂 读取配置文件applicationcontext.xml文件
2.spring框架获得xml中bean的id 和class的值
3.通过反射创建对象
控制反转 与 依赖注入
反转控制 ioc
控制:对于成员变量赋值的控制权
反转控制:把成员变量赋值的控制权交给spring xml配置文件,和工厂
好处:解耦合
底层实现:工厂模式
依赖注入 DI
依赖注入:当一个类需要另一个类时,就意味着依赖,一旦出现依赖,就可以把另一个类作为本类的成员变量,通过配置文件进行注入(赋值)
好处:解耦合
spring工厂创建复杂对象 3种方式
简单对象:可以通过new来创建的
复杂对象:不能直接通过new 构造方法来创建对象
Connection
SqlSessionFactory
factorybean 接口
1.实现fatorybean接口
Spring 配置文件的配置:如果 class 中指定的类型是 FactoryBean 接口的实现类,那么通过 id 值获得的是这个类所创建的复杂对象
public class ConnectionFactoryBean implements FactoryBean<Connection> {
@Override
public boolean isSingleton() {
//每一次
return false;
}
/**
* 用于书写创建复杂对象时的代码
*/
@Override
public Connection getObject() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://124.70.92.78:33066/ele_fence?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
, "root", "Smb@2084888smb#$");
return conn;
}
/**
* 返回创建的复杂对象的类型
*/
@Override
public Class<Connection> getObjectType() {
return Connection.class;
}
}
2.xml 配置文件
class 指定的是 ConnectionFactoryBean,获得的是 Connection 对象。
<bean id="conn" class="entity.ConnectionFactoryBean"></bean>
3.FactoryBean 细节
如果就想获得 FactoryBean 类型的对象,加个 &,ctx.getBean(“&conn”)
4.isSingleton 方法返回 true 只会创建⼀个复杂对象,返回 false 每⼀次都会创建新的对象;
需要根据这个对象的特点 ,决定是返回 true(SqlSessionFactory) 还是 false(Connection);
ConnectionFactoryBean cfb = (ConnectionFactoryBean) ctx.getBean("&conn")
connection 使用同一个对象会存在事务问题 所以不能只创建一次
factorybean 实现原理
原理:接口回调
问题:
1.为什么spring规定 实现getobject();
2.为什么 applicationContext.getBean(“conn”); 获得的是复杂对象Connection而不是ConnectionFactoryBean
spring内部运行
1. 配置文件通过id 获取ConnectionFactoryBean,进而通过instanceof
判断是否属于Connection
2.spring 按照getObject() 返回Connection
实例工厂
1.用于整合遗留系统
2.避免speing框架的入侵(需要实现FactoryBean接口)
静态工厂
public class StaticConnection {
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
try {
conn = DriverManager.getConnection("jdbc:mysql://124.70.92.78:33066/ele_fence?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
, "root", "Smb@2084888smb#$");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}
}
spring
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PlOZTsG9-1659679452238)(https://note.youdao.com/yws/res/3020/WEBRESOURCEe037c8a0e8d8a771519fda418f45a8a8)]
Spring 控制对象创建的次数
scop
1.singleton:每一个ioc容器只会创建一次简单对象,默认值
2.protoype:每一次都会创建新的对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7zhhQhhm-1659679452238)(https://note.youdao.com/yws/res/3024/WEBRESOURCEb1ab02cd5e7d454396f9dd77068ca2af)]
为什么要控制对象创建的次数
好处:节省不必要的内存浪费
什么对象只创建一次?
重量级的、可以被共用的,线程安全的
SqlSessionFatory
DAO
Service
什么对象每一次都要创建
Connection
SqlSession | Session
Strtus2 Action
对象的生命周期、配置文件参数化、自定义类型转换器、后置处理Bean
什么是对象的生命周期
一个对象创建,存活,消亡的完整的过程
为什么学习对象的生命周期
由spring来控制对象的创建,存活,消亡
生命周期的3个阶段
创建阶段 ->初始化阶段 -> 销毁阶段
创建阶段
scope =“prototype”: Srping工厂在获取对象的同时创建对象
(Connection)applicationContext.getBean(“conn”);
scope =“signLeton”: Spring工厂(IOC)容器创建同时创建对象
通过配置 也可以实现工厂获取对象的同时,创建对象
初始化阶段 -init
Spring工厂创建完对象,调用对象的初始化方法,完成初始化
初始化方法提供:程序员根据需求,自定义初始化方法
初始化方法调用:spring工程调用
1.InitializingBean
初始化操作细节
1.如果一个对象实现了初始化接口,同时又提供普通方法,执行顺序
先执行实现的接口,在执行普通方法
2.注入一定在初始化操作之前
3.什么是初始化操作
数据库,io,网络 (资源得初始化)
销毁阶段
销毁阶段细节
1.销毁方法的操作只适用于scope=“singleton”, 初始化操作都适用
2.销毁操作是什么
资源的释放 io.close ,connection.close
对象的生命周期总结
public class Product implements InitializingBean, DisposableBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("Product.setName");
this.name = name;
}
Product() { // 创建
System.out.println("Product.Product");
}
// 程序员根据需求实现的方法, 完成初始化操作
public void myInit() {
System.out.println("Product.myInit");
}
// 程序员根据需求实现的方法, 完成初始化操作
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Product.afterPropertiesSet");
}
public void myDestory() {
System.out.println("Product.myDestory");
}
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
@Override
public void destroy() throws Exception {
System.out.println("Product.destroy");
}
}
<bean id="product" class="com.yusael.life.Product" init-method="myInit" destroy-method="myDestory">
<property name="name" value="yusael"/>
</bean>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0NW8kvH-1659679452239)(https://note.youdao.com/yws/res/3079/WEBRESOURCE2dbd6b6165840261a04adb2511548016)]
配置文件参数的开发步骤
提供一个小的配置文件
后置处理bean
BeanPostProcessor (接口):作用对spring创建的对象,在进行加工。
后置处理bean的原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e7q9f3Fl-1659679452239)(https://note.youdao.com/yws/res/3098/WEBRESOURCE6e0ba377de9765e3b34d66886d3664f3)]
1.实现2个方法
beanPostProcessor
postProcessBeforInitialization(Object bena,String beanNmae){
return bean;
}
postProcessAfterInitialization(Object bena,String beanNmae){
return bean;
}调用构造方法-》postProcessBeforInitialization-》初始化(InitializingBean 或者 自定义myinit方法)-》 初始化完成后postProcessAfterInitialization
2开发步骤
实现BeanPostProcessor接口
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof User){
User user = (User) bean;
user.setName("yyyyyyyyyy");
return user;
}
return bean;
}
}
工厂创建对象
<bean id="mybean" class="MyBeanPostProcessor"></bean>
3注意事项
if(bean instanceof User){} 通过判断来进行指定对象的加工