前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring框架(二) spring IOC框架的使用流程,springIOC创建对象的3个方式

Spring框架(二) spring IOC框架的使用流程,springIOC创建对象的3个方式

作者头像
一写代码就开心
发布2021-07-08 15:04:25
4890
发布2021-07-08 15:04:25
举报
文章被收录于专栏:java和python

目录

回顾之前javaee web项目的创建流程

看这个系列

javaee的OA项目(一)项目搭建,数据库连接,用到的技术是mysql,mybatis,servlet,jsp,没有使用到具体的框架哦,是一个原生项目

总结:

就是我们得自己创建mapper层对象,用这个对象调用mapper接口里面的方法,才可以执行操作数据库,每一个业务层都得使用这个公共类得到mapper对象,代码是冗余的。也就是在业务层要使用这个公共类获取mapper对象,进行操作数据库。

什么时候使用spring IOC

什么时候使用IOC对对象进行解耦是一个主观问题,应当根据代码的结构以及功能的需求进行分析,然后决定哪些对象之间需要使用IOC解耦.一般情况下,在MVC代码结构中,会将Servlet和Service之间解耦,Service和mapper之间解耦.

spring IOC框架的使用流程

需要的jar包

spring IOC框架是人家封装好的东西,我们要使用,就得把人家的东西导进来,进行使用。

我们要导入哪些jar包呢?

看spring框架的架构图

核心包就是这4个包

创建一个web项目

创建lib文件夹

把spring的核心包导入

创建对应的包结构

使用java ee 的步骤写一个接口

写controller层,service层,在controller层创建service层的对象,利用这个对象调用service里面的方法。

这样的方法还得自己创建service层的对象,耦合性比较的高

使用springioc的方式解决 耦合性的问题

先保证我们导入了spring的jar包。

现在创建容器对象,以后就可以从容器里面拿东西了

首先写一个配置文件

这个配置文件里面,利用反射就创建了对象。以后我们创建这个spring容器的对象,利用这个配置文件创建对象。

在servlet里面利用这个配置文件创建spring容器的对象,从这个对象里面拿就可以了

以上就是创建servlet层的对象不是我们创建的,是从spring容器里面拿的。

SpringIOC创建对象的三种方式

问题及解决

问题

在学习了SpringIOC的基本使用流程后,我们使用IOC解耦层与层之间的逻辑关系,但是我们发现,对象由以前我们自己根据需求在代码中直接new创建,变为从Spring容器中获取,也就说对象的创建由Spring容器来创建,我们直接获取使用即可.那么,如果我们需要一个带有指定的初始化数据的对象,如何让Spring容器对象帮我们创建呢?

解决

在applicationcontext.xml配置文件中,配置对象的创建方式以及初始化的方式.

就是在这个配置文件里面,就有很多种创建对象的方法,我们只需要配置之后,从这个容器里面拿就可以了

通过构造器方式

①无参数构造器(创建一个没有初始化数据的对象)

②有参 数构造器(创建一个带有初始化数据的对象)

Applicationcontext.xml示例:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--创建student的bean对象-->
    <!--构造器方式-->
    <!--
    无参构造器 
    特点:Spring容器默认使用无参构造方式创建对象
    使用:在配置文件中直接使用bean标签配置即可,无需过多声明
    -->
    <bean id="stu" class="com.pojo.Student"></bean>
    





    <!--有参数的构造器
    特点:Spring容器对根据配置调用的有参构造器创建一个带有初始化数据的对象
    使用:constructor-arg:使用bean的字标签来声明调用的构造器的形参的个数
    一个字标签表示一个参数
    属性:index:参数的下标
          type:参数的类型,全限定路径
          name:参数的形参名
          value:参数要给的值
    -->
    <bean id="stu2" class="com.pojo.Student">
        <constructor-arg index="0" type="java.lang.Integer" name="sid" value="1"></constructor-arg>
        <constructor-arg index="1" type="java.lang.String" name="sname" value="张三"></constructor-arg>
    </bean>
          
</beans>

通过属性注入(get/set)

先通过空构造器创建一个对象,然后再使用set方法进行初始化赋值.

ApplicationContext.xml配置示例:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--创建student的bean对象-->
    <!--
    属性注入方式
    特点:相当于创建一个空对象然后使用set方法赋值
    使用:
    property:在bean标签下使用子标签property,表示调用set方法给某个属性赋值
    属性:name:要赋值的属性名
          value:值
    -->
    <bean id="stu3" class="com.pojo.Student">
        <property name="sid" value="2"></property>
        <property name="sname" value="李四"></property>
    </bean>
</beans>

通过工厂模式

问题:

我们在使用Java代码处理某个问题的时候,需要创建A对象,调用 A对象中的某个方法,但是A对象的创建依赖B对象,而B对象的 创建又依赖于C对象,C对象的创建又依赖于D对象…,如下:

D d=new D();

C c=new C(d);

B b=new B©;

A a=new A(b);

这样造成,代码的阅读性极差

解决:

将对象的创建过程进行封装,直接返回创建好的对象使用.

实现:

工厂设计模式

本质:就是封装对象的创建过程的一种代码的编程思想

静态工厂:生产对象的方法是静态方法

类名.方法 就可以使用

public class AFactory{

public static A newInstance(){

D d=new D();

C c=new C(d)

B b=new B©;

A a=new A(b);

return a;

}

}

动态工厂:生产对象的方法是非静态方法

必须创建这个类的对象,才可以使用

public class AFactory{

public A newInstance(){

D d=new D();

C c=new C(d)

B b=new B©;

A a=new A(b);

return a;

}

}

SpringIOC使用工厂创建对象:

传统方案:

我们自己创建工厂,然后调用工厂生产对象的方法,获取生产的对象,然后使用生产的对象完成功能开发.

也就是这个工厂我们还得自己创建,现在我们就想要让spring调用工厂,给我们创建

IOC方案:

Spring容器创建工厂,并自动调用其创建的工厂的生产对象的方法,生产的对象直接存储在Spring容器中,我们直接从Spring容器中获取对象,完成功能开发.

也就是我们只是从spring容器里面拿数据,其他的都是spring给我们做

①动态工厂模式

②静态工厂模式

代码语言:javascript
复制
动态工厂
public class StudentFactory {
    public Student newIntance(){
        //声明Student对象创建的其他依赖资源
        System.out.println("我是动态工厂");
        return  new Student();
    }
}

静态工厂
public class StudentStaticFactory {
    public static Student newIntance(){
        //声明Student对象创建的其他依赖资源
        System.out.println("我是静态工厂");
        return  new Student();
    }
}
代码语言:javascript
复制
applicationcontext.xml配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--创建student的bean对象-->
    <!--工厂设计模式-->
    <!--动态工厂-->
        <bean id="factory" class="com.pojo.StudentFactory"></bean>
        <!--生产Student对象-->    也就是根据上面的对象调用类里面的方法
factory这个对象里面的newIntance方法
        <bean id="stu4" factory-bean="factory" factory-method="newIntance"></bean>
   



 <!--静态工厂-->
    <!--可以理解为静态方法直接用类名调用-->   直接调用静态方法
        <bean id="stu5" class="com.pojo.StudentFactory2" factory-method="newIntance"></bean>
</beans>

总结

springioc的作用就是 我们获取对象的方式遍历,之前是我们自己创建对象,现在是让spring给我们创建对象,放到spring容器里面,我们只需要从这个里面拿就可以了。

只是获取对象的方式不一样了,拿到对象之后需要做什么,还是和之前一样,该咋做就咋做

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 回顾之前javaee web项目的创建流程
  • 什么时候使用spring IOC
  • spring IOC框架的使用流程
    • 需要的jar包
      • 创建一个web项目
        • 使用java ee 的步骤写一个接口
          • 使用springioc的方式解决 耦合性的问题
          • SpringIOC创建对象的三种方式
            • 问题及解决
              • 问题
              • 解决
            • 通过构造器方式
              • 通过属性注入(get/set)
                • 通过工厂模式
                  • 问题:
                  • 解决:
                  • 实现:
              • 总结
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档