springIOC (2)

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

3.基本使用流程:

导入IOC的jar包

springIOC

在src下声明并配置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 https://www.springframework.org/schema/beans/spring-beans.xsd> <!--配置业务层的对象--> <bean></bean> </beans>

在代码中创建ApplicationContext对象,并获取Spring容器中的对象,然后完成功能开发

6.SpringIOC创建对象的三种方式

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

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

1.通过构造器方式

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

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

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 "> <!--创建student的bean对象--> <!--构造器方式--> <!-- 无参构造器 特点:Spring容器默认使用无参构造方式创建对象 使用:在配置文件中直接使用bean标签配置即可,无需过多声明 --> <bean></bean> <!--有参数的构造器 特点:Spring容器对根据配置调用的有参构造器创建一个带有初始化数据的对象 使用:constructor-arg:使用bean的字标签来声明调用的构造器的形参的个数 一个字标签表示一个参数 属性:index:参数的下标 type:参数的类型,全限定路径 name:参数的形参名 value:参数要给的值 --> <bean> <constructor-arg index="0" type="java.lang.Integer" value="1"></constructor-arg> <constructor-arg index="1" type="java.lang.String" value="张三"></constructor-arg> </bean> </beans>

Test代码示例:

public class testStu { public static void main(String[] args) { //创建容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationcontext.xml"); //获取容器中的对象 //无参构造器方式 Student student = (Student) ac.getBean("stu"); System.out.println("无参构造:"+student); //有参构造器 Student student1= (Student) ac.getBean("stu2"); System.out.println("有参构造:"+student1); } }

2.通过属性注入(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 "> <!--创建student的bean对象--> <!-- 属性注入方式 特点:相当于创建一个空对象然后使用set方法赋值 使用: property:在bean标签下使用子标签property,表示调用set方法给某个属性赋值 属性:name:要赋值的属性名 value:值 --> <bean> <property value="2"></property> <property value="李四"></property> </bean> </beans>

TestObject代码示例:

public class testStu { public static void main(String[] args) { //创建容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationcontext.xml"); //获取容器中的对象 //属性注入方式 Student student = (Student) ac.getBean("stu3"); System.out.println("属性注入方式"+student); } }

3.通过工厂模式

问题:

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

D d=new D();

C c=new C(d);

B b=new B(c);

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(c); 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(c); A a=new A(b); return a; } }

SpringIOC使用工厂创建对象:

传统方案:

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

IOC方案:

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

①动态工厂模式

②静态工厂模式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywsff.html