·在Servlet中需要调用service中的方法,则需要在Servlet类中通过new关键字创建Service的实
public interface ProductService{
public List<Product> listProducts();
}
public interface ProductService{
public List<Product> listProducts();
}
public class ProductServiceImpl2 implements ProductService{
public List<Product> listProducts(){
//查询好评商品
}
}
public class ProductListServlet extends HttpServlet{
//在servlet中使用new关键字创建ProductServiceImpl1对象,增加了servlet和service的耦合度
private ProductService productService = new ProductServiceImpl1();
protected void doGet(HttpServletRequest request,HttpServletResponse response){
doPost(request,response);
}
protected void doPost(HttpServletRequest request,HttpServletResponse response){
productService.listProducts();
}
}
·在service实现类中需要调用DAO中的方法,也需要在service实现类通过new关键字创建DAO实现类对象
·如果在实现new关键字创建对象:
·标题失去了面向接口编程的灵活性
·代码的侵入性增强(在一个类中new另外一个,增加了耦合度)、降低了代码的灵活性
1.2、 面向接口编程
解决方案:在Servlet中定义Service接口的对象,不适用new关键字创建实现类对象,在servlet的实例化的时候,通过反射动态的给Service接口的对象变量赋值。
如何实现:Spring可以做到!
Spring是一个轻量级的控制反转和面向切面的容器
框架,用来解决企业项目开发的复杂度问题——解耦
·轻量级:体积小,对代码没有侵入性
·控制反转:IoC(Inverse of Control),把创建对象的工作由Spring完成,·Spring在创建对象的时候同时可以完成
对象属性赋值(DI)
·面向切面:AOP(Aspect Oriented Programming)面向切面编程,可以在不改变原有业务逻辑的情况下实现对业务的增强
·容器:实例的容器,管理创建的对象.
·官网 https://spring.io/
·Spring架构图
Spring容器组件,用于完成实例的创建和管理
·core 核心
·beans 实例管理
·context 容器上下文
Spring AOP组件,实现面向切面编程
·AOP
·Aspects
Spring web组件实际指的是SpringMVC框架、实现web项目的MVC控制
·web(Spring对web项目的支持)
·webmvc(SpringMVC)
Spring数据访问组件,也是一个基于JDBC封装的持久层框架(即使没有mybatis,Spring也可以完成持久化的数据库 *** 作)
·tx
Spring的单元测试组件,提供了Spring环境下的单元测试支持
·test
Spring Ioc 容器组件,可以完成对象的创建,对象属性赋值,对象管理
2.1.1 创建Maven工程·Java
·Web
·core
·beans
·aop
·expression
·context
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
2.1.3 创建Spring配置文件
通过配置文件“告诉”Spring容器创建什么对象,给对象属性赋什么值
·在resource目录下创建名为 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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--对于一个xml文件如果作为框架的配置文件,需要遵守框架的配置规则-->
<!--通常一个框架为了开发者能够正确的配置,都会提供xml的规范文件(dtd\xsd)-->
<!--xsd 可以根据配置引入多个,只要引入了相应的xsd,可以使用相应标签规则属性-->
</beans>
2.2 SpringIoC使用
使用SpringIoC组件创建并管理对象
2.2.1 创建一个实体类public class Student {
private String stuNum;
private String stuName;
private String stuGender;
private int stuAge;
private Date enterenceTime;//入学日期
}
2.2.2 在Spring配置文件中配置实体类
ClassPathXmlApplicationContext
//通过Spring容器创建Student对象
//1、初始化Spring容器,加载Spring配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2、通过Spring容器,获取Student对象
Student student2 = (Student) context.getBean("stu");
2.3 IoC和DI
·IoC(Inverse of Control) 控制反转,依赖Spring对象工厂,完成对象的创建
·DI (Dependency Injection)依赖注入,在Spring完成对象创建的同时依赖Spring容器完成对象属性的赋值
当我们需要通过Spring对象工厂创建某个类的对象时候,需要将这个交给Spring管理——通过bean标签配置
<bean id="book" class="com.liguoqing.ioc.bean.Book"></bean>
2.3.2 DI
通过Spring容器给创建的对象属性赋值
<!--通过bean标签将实体类配置给Spring进行管理,id表示实体类的唯一标识(自己定义,一般是类名小写)-->
<bean id="stu" class="com.liguoqing.ioc.bean.Student">
<property name="stuNum" value="10002"/>
<property name="stuName" value="李四"/>
<property name="stuGender" value="女"/>
<property name="stuAge" value="18"/>
<property name="enterenceTime" ref="date"/>
</bean>
2.4 DI依赖注入
2.4.1 依赖注入三种方式
Spring容器加载配置文件之后,通过反射创建类的对象,并给属性赋值;
Spring容器通过反射实现属性注入有三种种方式:
·set方法注入
·构造器注入
·接口注入(不常用)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)