学习了一段时间的mybatis后,现在开始了spring框架的学习。这篇文章主要概述IOC的基本概述。
Spring是一个
轻量级的控制反转和面向切面的容器
框架,用来解决企业项目开发的复杂度问题—解耦
以下即将对上面的一串话进行具体分析
Spring 是一个开源框架,Spring 为简化企业级应用开发而生。使用Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。Spring 是一个 IOC(DI) 和AOP 容器框架。
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可以做到!!!
当我们需要通过Spring对象工厂创建某个类的对象时候,需要将这个交给Spring管理——通过bean标签配置
<bean id="student" class="com.etime.Student">bean>
<bean id="book" class="com.etime.Book">bean>
通过Spring容器给创建的对象属性赋值
Spring容器加载配置文件之后,通过
反射
创建类的对象,并给属性赋值;Spring容器通过反射实现属性注入有三种方式:
- 通过属性的set方法注入
- 构造器注入
- 通过工厂方法注入
<!--通过bean将实体类配置给Spring进行管理,id表示实体类的唯一表示-->
<bean id="stu" class="com.etime.Student">
<property name="studentName" value="aaa"/>
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>
这种方式一般是框架内部进行操作时会使用的方式,这里不过多赘述。
- 例:一个学生有姓名,年龄,班级三个属性。班级也有班级名和班主任名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>
//1.初始化Spring容器,加载Spring配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过Spring容器获取Student对象
Student student1 = (Student) context.getBean("student");
以上是对spring框架的IOC部分的学习,后续部分会在学习之后继续更新。。。
注意:此文章为学习记录文章,参考多篇文章,如有不正之处请指教