[Spring5 ]Spring工厂

什么是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){} 通过判断来进行指定对象的加工


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值