目录
回顾之前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容器里面,我们只需要从这个里面拿就可以了。
只是获取对象的方式不一样了,拿到对象之后需要做什么,还是和之前一样,该咋做就咋做