回顾之前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示例:

<?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配置示例:

<?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给我们做

①动态工厂模式
②静态工厂模式

动态工厂
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();
    }
}

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容器里面,我们只需要从这个里面拿就可以了。

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