Java笔记:Spring配置xml和注解(1)

简介: Java笔记:Spring配置xml和注解

Spring

Java Web发展历史

  • 第一阶段 JavaBean + Servlet + JSP
  • 第二阶段 EJB重量级框架
  • 第三阶段 SpringMVC/Struts + Spring + Hibernate/MyBatis
  • 第四阶段 SpringBoot 约定大于配置
  • 第五阶段 Dubbo为代表的SOA微服务架构体系
  • 第六阶段 SpringCloud 微服务框架爱技术生态圈

课程内容IoC

  • 介绍IoC并编写一个简单的IoC容器
  • 介绍通过xml方式完成SpringIoC对Bean的管理
  • 介绍SpringIoC相关注解的使用

IoC介绍

IoC Inversion of Control 控制反转,依赖注入

控制:控制对象的创建及销毁(生命周期)

反转:将对象的控制权交给IoC容器

简化约定

  • 所有的Bean的生命周期都交由IoC容器管理
  • 所有被依赖的Bean通过构造函数方法执行注入
  • 被依赖的Bean需要优先创建

IoC实现

依赖关系

Car
    +start()
    +stop()
    +turnLeft()
    +turnRight()
    <- AudiCar
    <- BuickCar
Human
    +goHome()
    <- HumanWithCar
        -car
        +goHome()
        <- LisiHuman
        <- ZhangsanHuman

代码实现

package com.demo.ioc.car;
/**
 * 汽车
 */
public interface Car {
    void start();
    void stop();
    void turnLeft();
    void turnRight();
}
package com.demo.ioc.car;
/**
 * 奥迪车
 */
public class AudiCar implements Car{
    @Override
    public void start() {
        System.out.println("AudiCar start");
    }
    @Override
    public void stop() {
        System.out.println("AudiCar stop");
    }
    @Override
    public void turnLeft() {
        System.out.println("AudiCar turnLeft");
    }
    @Override
    public void turnRight() {
        System.out.println("AudiCar turnRight");
    }
}
package com.demo.ioc.car;
/**
 * 别克车
 */
public class BuickCar implements Car{
        @Override
        public void start() {
            System.out.println("BuickCar start");
        }
        @Override
        public void stop() {
            System.out.println("BuickCar stop");
        }
        @Override
        public void turnLeft() {
            System.out.println("BuickCar turnLeft");
        }
        @Override
        public void turnRight() {
            System.out.println("BuickCar turnRight");
    }
}
package com.demo.ioc.human;
/**
 * 人类接口
 */
public interface Human {
    void goHome();
}
package com.demo.ioc.human;
import com.demo.ioc.car.Car;
/**
 * 有车人
 */
public abstract class HumanWithCar implements Human {
    protected Car car;
    public HumanWithCar(Car car) {
        this.car = car;
    }
    public abstract void goHome();
}
package com.demo.ioc.human;
import com.demo.ioc.car.Car;
/**
 * 张三
 */
public class ZhangsanHuman extends HumanWithCar{
    public ZhangsanHuman(Car car) {
        super(car);
    }
    @Override
    public void goHome() {
        this.car.start();
        this.car.turnLeft();
        this.car.stop();
    }
}
package com.demo.ioc.human;
import com.demo.ioc.car.Car;
/**
 * 李四
 */
public class LisiHuman extends HumanWithCar{
    public LisiHuman(Car car) {
        super(car);
    }
    @Override
    public void goHome() {
        this.car.start();
        this.car.turnRight();
        this.car.stop();
    }
}
package com.demo.ioc;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 1. 实例化Bean
 * 2. 保存Bean
 * 3. 提供Bean
 * 4. 每个Bean要与唯一的id对应
 */
public class IocContainer {
    private Map<String, Object> beans = new ConcurrentHashMap<>();
    /**
     * 根据 beanId获取Bean
     *
     * @param beanId
     * @return
     */
    public Object getBean(String beanId) {
        return beans.get(beanId);
    }
    /**
     * 委托IoC容器创建一个Bean
     *
     * @param clazz        Bean的class
     * @param beanId       Bean 的id
     * @param paramBeanIds class构造函数所需参数的beanId
     */
    public void setBean(Class<?> clazz, String beanId, String... paramBeanIds) {
        //  1. 组装构造方法所需要的参数值
        Object[] paramBeans = new Object[paramBeanIds.length];
        for (int i = 0; i < paramBeanIds.length; i++) {
            paramBeans[i] = beans.get(paramBeanIds[i]);
        }
        //  2. 调用构造方法实例化Bean
        Object bean = null;
        for (Constructor<?> constructor: clazz.getConstructors()){
            try {
                bean = constructor.newInstance(paramBeans);
            } catch (InstantiationException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
        }
        if(bean == null){
            throw new RuntimeException("Bean实例化失败");
        }
        //  3. 将示例化的bean放入beans
        beans.put(beanId, bean);
    }
}

代码回顾

所有的依赖关系被集中统一的管理起来,清晰明了

每个类只需要关注自己的业务逻辑

修改依赖关系将是一件很容易的事情

相关文章
|
12天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
29 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
15天前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
30 4
|
15天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
41 2
|
15天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
34 2
|
18天前
|
消息中间件 Java 数据库
解密Spring Boot:深入理解条件装配与条件注解
Spring Boot中的条件装配与条件注解提供了强大的工具,使得应用程序可以根据不同的条件动态装配Bean,从而实现灵活的配置和管理。通过合理使用这些条件注解,开发者可以根据实际需求动态调整应用的行为,提升代码的可维护性和可扩展性。希望本文能够帮助你深入理解Spring Boot中的条件装配与条件注解,在实际开发中更好地应用这些功能。
24 2
|
18天前
|
JSON Java 数据格式
springboot常用注解
@RestController :修饰类,该控制器会返回Json数据 @RequestMapping(“/path”) :修饰类,该控制器的请求路径 @Autowired : 修饰属性,按照类型进行依赖注入 @PathVariable : 修饰参数,将路径值映射到参数上 @ResponseBody :修饰方法,该方法会返回Json数据 @RequestBody(需要使用Post提交方式) :修饰参数,将Json数据封装到对应参数中 @Controller@Service@Compont: 将类注册到ioc容器
|
15天前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
33 0
Java初级笔记-第五章
第五章 面向对象的特点 5.1 继承 面向对象的重要特点之一就是继承。类的继承使得能够在已有的类的基础上构造新的类,新类除了具有被继承类的属性和方法外,还可以根据需要添加新的属性和方法。
1051 0
|
Java Windows 开发框架
Java初级笔记-第一章
第一章 Java概览 1.1 基本简介 Java是一种理想的面向对象的网络编程语言。 1991年,出现了Oak语言,旨在解决编程语言的选择和跨平台的问题。
1375 0
Java初级笔记-第二章
第二章 Java的基本数据类型、运算符及表达式 2.1 标识符 标识符是程序员对程序中的各个元素加以命名时使用的命名记号。
1210 0