【浅学Spring框架--IOC(一)】

学习了一段时间的mybatis后,现在开始了spring框架的学习。这篇文章主要概述IOC的基本概述。

文章目录

  • Spring概述
          • `以下即将对上面的一串话进行具体分析`
  • 一、spring是什么?
  • 二、如何理解用来解决企业项目开发的复杂度问题即解耦?
    • 1.web项目开发中的耦合度问题
  • 三、控制反转是什么?
    • 1.IOC和DI
    • 2.IOC
    • 3.DI
        • 3.1 依赖注入三种方式
          • 3.1.1 通过属性的set方法注入
          • 3.1.2 构造器注入
          • 3.1.3 通过工厂方法注入
    • 4.引用其他的 bean(ref)
    • 5.从 IOC 容器中获取 Bean
            • 5.1 初始化Spring对象工厂,获取对象
  • 总结


Spring概述

Spring是一个轻量级的控制反转和面向切面的容器框架,用来解决企业项目开发的复杂度问题—解耦

  • 轻量级:体积小,对代码没有侵入性
  • 控制反转:IOC(Inversion of Control),把创建对象的工作交由Spring完成,Spring在创建对象的时候同时可以完成对象属性赋值(DI)
  • 面向切面:AOP(Aspect Oriented Programming)面向切面编程,可以在不改变原有业务逻辑的情况下实现对业务的增强
  • 容器:实例的容器,管理创建的对象

以下即将对上面的一串话进行具体分析

一、spring是什么?

Spring 是一个开源框架,Spring 为简化企业级应用开发而生。使用Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。Spring 是一个 IOC(DI) 和AOP 容器框架。

二、如何理解用来解决企业项目开发的复杂度问题即解耦?

1.web项目开发中的耦合度问题

  • 在Servlet中需要调用service中的方法,则需要在Servlet类中通过new关键字创建Service的实例
public interface StudentService{
    public List<Student> listStudent();
}
public class StudentServiceImpl1 implements StudentService{
    public List<Student> listStudent(){
        //查询学生列表
    }
}
public class StudentListServlet extends HttpServlet{
    
    //在servlet中使用new关键字创建StudentServiceImpl1对象,增加了servlet和service的耦合度
    private StudentService studentService = new StudentServiceImpl1();
    
    protected void doGet(HttpServletRequest request,HttpServletResponse response){
        doPost(request,response);
    }
    protected void doPost(HttpServletRequest request,HttpServletResponse response){
        studentService.listStudent();
    }
}
  • 在service实现类中需要调用DAO中的方法,也需要在servcie实现类通过new关键字创建DAO实现类对象

  • 如果使用new关键字创建对象:

    • 失去了面向接口编程的灵活性
    • 代码的侵入性增强(增加了耦合度)、降低了代码的灵活性
    • 降低项目的扩展性
  • 耦合性:也叫耦合度,模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。形象的说就是改变一部分代码影响全部项目的影响程度有多大,需要改动的地方有多少。多则代表耦合度高,反之则低。

  • 解决方案:在Servlet中定义Service接口的对象变量,不使用new关键字创建实现类对象,在servlet的实例化的时候,通过反射动态的给Service对象变量赋值。

  • 如何实现:Spring可以做到!!!

三、控制反转是什么?

  • 由原来的自己需要什么就要直接去new出来,变成了你需要什么你告诉别人(容器)它给你提供,你负责使用就行。这种过程上的转变就叫做控制反转。

1.IOC和DI

  • IoC (Inverse of Control) 控制反转,通过Spring对象工厂完成对象的创建
  • DI (Dependency Injection)依赖注入,在Spring完成对象创建的同时依赖Spring容器完成对象属性的赋值

2.IOC

当我们需要通过Spring对象工厂创建某个类的对象时候,需要将这个交给Spring管理——通过bean标签配置


<bean id="student" class="com.etime.Student">bean>

<bean id="book" class="com.etime.Book">bean>

3.DI

通过Spring容器给创建的对象属性赋值

3.1 依赖注入三种方式

Spring容器加载配置文件之后,通过反射创建类的对象,并给属性赋值;

Spring容器通过反射实现属性注入有三种方式:

  • 通过属性的set方法注入
  • 构造器注入
  • 通过工厂方法注入
3.1.1 通过属性的set方法注入
<!--通过bean将实体类配置给Spring进行管理,id表示实体类的唯一表示-->
<bean id="stu" class="com.etime.Student">
    <property name="studentName" value="aaa"/>
3.1.2 构造器注入
public class Student {
private String studentName;
private int studentId;
//构造方法
public Car(String studentName, int studentId) {
this.studentName= studentName;
this.studentId= studentId;
}
//无参数构造方法
public Student (){}
.....
<bean id="studnet" class="edu.etime.Student">
<constructor-arg value="aaa"></constructor-arg>
<constructor-arg value="9527"></constructor-arg>
</bean>
  • 注意:上面的value是按照构造器里面参数的顺序来进行注入的。如果不想也可以添加一个index属性或者按照名字来注入
//按照index顺序
 <constructor-arg index="1" value="bbb"/>
 <constructor-arg index="0" value="1234"/> 
//按照名字属性
<constructor-arg value="aa" name="studentName"></constructor-arg>
<constructor-arg value="4" name="studentId"></constructor-arg>
3.1.3 通过工厂方法注入

这种方式一般是框架内部进行操作时会使用的方式,这里不过多赘述。


4.引用其他的 bean(ref)

  • 例:一个学生有姓名,年龄,班级三个属性。班级也有班级名和班主任名2个属性。(下面以set方法注入为例)
//班级
<bean id="class" class="edu.etime.Class">
<property name="className" value="J245"/>
<property name="studentTeacher" value="zw"/>
</bean>

//学生
<bean id="studnet" class="edu.etime.Student">
<property name="studentName" value="aaa"/>
<property name="studentAge" value="12"/>
<property name="studentClass" ref="class"
</bean>

也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部Bean。当Bean实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean。内部Bean 声明直接包含在 或 元素里, 不需要设置任何 id 或name 属性。内部Bean 不能使用在任何其他地方

<!-- 内部 bean -->
<bean id="student" class="edu.etime.Student">
<property name="studentName" value="aaa"></property>
<property name="studentAge" value="12"></property>
<!-- 通过属性来应用其他 bean -->
<property name="class">
<bean class="edu.etime.Class">
<constructor-arg value="zw" index="1"></constructor-arg>
<constructor-arg value="J245" index="0"></constructor-arg>
</bean>
</property>
</bean>

5.从 IOC 容器中获取 Bean

5.1 初始化Spring对象工厂,获取对象
  • ClassPathXMLApplicationContext
//1.初始化Spring容器,加载Spring配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过Spring容器获取Student对象
Student student1 = (Student) context.getBean("student");

总结

以上是对spring框架的IOC部分的学习,后续部分会在学习之后继续更新。。。
注意:此文章为学习记录文章,参考多篇文章,如有不正之处请指教

你可能感兴趣的:(spring,java,java-ee)