认识Ioc容器和Servlet容器

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

认识Ioc容器和Servlet容器

1.介绍loC容器

loC (Inversion of Control)容器,是面向对象编程中的一种设计原则,意为控制反转(也被 称为'控制反向”或"控制倒置”)。它将程序中创建对象的控制权交给Spring框架来管理,以便降低计算机代码之间的耦合度。
控制反转的实质是获得依赖对象的过程被反转了。这个过程由自身管理变为由loC容器主动注入。这正是loC实现的方式之一:依赖注入(dependency injection, DI),由loC容器在运行期间动态地将某种依赖关系注入对象之中。
在传统编程方式中,要实现某种功能一般都需要几个对象相互作用。在主对象中要保存其他类型对象的引用,以便在主对象中实例化对象,然后通过调用这些引用的方法来完成任务,其运行方式如图

而IoC容器是在主对象中设置Setter方法,通过调用Setter方法或构造方法传入所需引用(即 依赖注入),如图所示。

要使用某个对象,只需要从loC容器中获取需要使用的对象,不需要关心对象的创建过程,即 把创建对象的控制权反转给了 Spring框架。


2.loC的实现方法

IoC的实现方法主要有两种——依赖注入与依赖查找。
(1 )依赖注入。
loC容器通过类型或名称等信息将不同对象注入不同属性中。组件不做定位查询,只提供普通 的Java方法让容器去决定依赖关系。这是最流行的loC方法。依赖注入主要有以下几种方式-

  • 设值注入(setter injection ):让loC容器调用注入所依赖类型的对象。
  • 接口注入(interface injection):实现特定接口,以供loC容器注入所依赖类型的对象。
  • 构造注入(constructor injection ):实现特定参数的构造函数,在创建对象时让loC容器 注入所依赖类型的对象。
  • 基于注解:通过Java的注解机制让loC容器注入所依赖类型的对象,例如,使用 @Autowired
loC是通过第三方容器来管理并维护这些祓依赖对象的,应用程序只需要接收并使用loC容器 注入的对象。
(2)依赖查找。
在传统实现中,需要用户使用API来管理依赖的创建、查找资源和组装对象。这会对程序有侵 入性。
依赖查找则通过调用容器提供的回调接口和上下文环境来获取对象,在获取时需要提供相关的 配置文件路径、key等信息来确定获取对象的状态。依赖查找通常有两个方法 —— 依赖拖拽(DP ) 和上下文化依赖查找(CDL )。
3.认识Servlet容器

Servlet是在javax.serlvet包中定义的一个接口。在开发Spring Boot应用程序时,使用 Controller基本能解决大部分的功能需求。但有时也需要使用Servlet,比如实现拦截和监听功能。
Spring Boot的核心控制器DispatcherServlet会处理所有的请求。如果自定义Servlet,则需 要进行注册,以便DispatcherServlet核心控制器知道它的作用,以及处理请求url-pattern。
实例14:用loC管理Bean
1.创建一个Bean
  1. package com.itheima.domain;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class User {
  9.     private long id;
  10.     private String name;
  11.     private int age;
  12. }
复制代码
2.编写User的配置类
  1. package com.itheima.config;
  2. import com.itheima.domain.User;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class UserConfig {
  7.     @Bean("user1")
  8.     public User user(){
  9.         User user = new User();
  10.         user.setId(55);
  11.         user.setName("Joe");
  12.         user.setAge(65);
  13.         return user;
  14.     }
  15. }
复制代码

  • @Configuration:用于标注配置类,让Spring来加载该类配置作为Bean的载体。在运行 时,将为这些Bean生成BeanDefinition和服务请求。
  • @Bean:产生一个Bean,并交给Spring管理。目的是封装用户、数据库中的数据,一般 有 Setter、Getter 方法
  3.编写测试类
  1. package com.itheima;
  2. import com.itheima.domain.User;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.test.context.junit4.SpringRunner;
  9. @RunWith(SpringRunner.class)
  10. @SpringBootTest
  11. public class IocTest {
  12.     @Autowired
  13.     private ApplicationContext applicationContext;
  14.     @Test
  15.     public void testIoc() throws Exception {
  16.         User user = (User) applicationContext.getBean("user1");
  17.         System.out.println(user);
  18.     }
  19. }
复制代码

  • @SpringBootTest: Spring Boot用于测试的注解,可指定入口类或测试环境等。
  • @RunWith(SpringRunner.class):让测试运行于 Spring 测试环境。
  • @Test:一个测试方法。
  • Applicationcontext:获取Spring容器中己初始化的Bean,这里是运行testloC方法,在控制台输出以下结果:
  User(id=55, name=Joe, age=65)
  实例:用Servlet处理请求
  用Servlet处理请求,可以直接通过注解@WebServlet(urlPattem, descript)注册Servlet, 然后在入口类中添加注解@ServletComponentScan,以扫描该注解指定包下的所有Servlet。
  1.注册Servlet类
  1. package com.itheima.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet(urlPatterns = "/servlet/*")
  9. public class ServletDemo extends HttpServlet {
  10.     @Override
  11.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
  12.         System.out.println("DoGet");
  13.         resp.getWriter().print("ServletTest");
  14.     }
  15. }
复制代码
@WebServlet(urlPatterns = "/servlet/*"):属性 urlPatterns 指定 WebServlet 的作用范围,这里代表servlet下的所有子路径。
doGet:父类HttpServlet的doGet方法是空的,没有实现任何代码,子类需要重写此方法。
  2.开启Servlet支持
  1. package com.itheima;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.web.servlet.ServletComponentScan;
  5. @ServletComponentScan
  6. @SpringBootApplication
  7. public class Springboot05MybatisApplication {
  8.     public static void main(String[] args) {
  9.         SpringApplication.run(Springboot05MybatisApplication.class, args);
  10.     }
  11. }
复制代码
@ComponentScan:组件扫描、可自动发现和装配一些Bean,并根据定义的扫描路径把 符合扫描规则的类装配到Spring容器中。
@SpringBootAppfication:入口类 Application 的启动注解。
在运行程序后,使用GET方法访问http://localhost:8080/servlet/aoptest 会返回重写doGET方法的值:
ServletTest
同时,控制台会输出doGet里定义的值:
DoGet

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表