1. Spring Boot基本概念

1.1. 核心概念

1.1.1. IoC控制反转

  • IoC ( Inversion of Control ) 控制反转。

    • 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
  • Spring技术对IoC思想进行了实现

    • Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
  • IOC主要用来控制哪些对象呢?

    • 主要用来控制三层架构,web层、service层、mapper层
  • 如何创建对象交给spring管理

    • 在需要管理的类上加@Component 注解
    • 可以通过使用@Component("名字")的方式,给被管理的对象起别名
  • 如何从spring中要对象

    • @Autowired
    • @Resource("名字")
  • 在spring的优化下,我们针对@Component注解进行了优化,提供了语义化的注解,并衍生出了三个注解

    • @Controller
    • @Service
    • @Repository (集成mybatis时不会使用,因为mybatis中mapper是接口)

       @Component使用事项

      1. 默认情况下,如果一个接口的两个实现类都使用了 @Component 注解,且没有设置别名,则在对接口进行注入(@Autowired),且变量名为接口名的时候,框架会因为不知道注入哪个实现类而报错
        
        // 接口I
        public interface Inter{}

    // 实现类A
    @Component
    public class ImplA implements Inter{}

    // 实现类B
    @Component
    public class ImplB implements Inter{}

    // 测试类
    public class Test{
        // 此处会报错,因为接口有两个实现类,且无法区分
        @Autowired
        Inter inter
    }

    1.  在上述情况下,如果注入的接口的实例化对象,对象名是实现类名的首字母小写形式,是可以找到对应的实现类的

    // 接口I
    public interface Inter{}

    // 实现类A
    @Component
    public class ImplA implements Inter{}

    // 实现类B
    @Component
    public class ImplB implements Inter{}

    // 测试类
    public class Test{
        // 此处注入的是ImplA
        @Autowired
        Inter implA
    }

    
    1.  如果给@Component起别名,即 @Component("别名"),就可以通过@Resource("名字")的方式获取别名对应的对象
    
        // 接口I
        public interface Inter{}
    
        // 实现类A
        @Component("A")
        public class ImplA implements Inter{}
    
        // 实现类B
        @Component("B")
        public class ImplB implements Inter{}
    
        // 测试类
        public class Test{
            // 此处注入的是ImplB
            @Resource("B")
            Inter inter
        }

1.1.2. DI依赖注入

  • DI( Dependency Injection ) 依赖注入
    • 在容器中建立bean与bean之间依赖关系的整个过程,称为依赖注入

1.1.3. spring容器

  • BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
  • ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
  • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
  • ApplicationContext接口常用初始化类
    • ClassPathXmlApplicationContext
    • FileSystemXmlApplicationContext

1.1.4. 目标:充分解耦

实现方式:

  1. 使用IoC容器管理bean (Ioc)
  2. 在IoC容器内将有依赖关系的bean进行关系绑定 (DI)最终效果

最终效果:

  1. 使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系

1.2. 使用xml方式配置spring容器

1.2.1. bean相关

<bean 
    id="bookDao"                                  bean的Id 
    name="dao bookDaoImpl daoImpl"                    bean别名
    class="com,itheima,dao.impl.BookDaoImpl"      bean类型,静态工厂类,FactoryBean类控制bean的实例数量
    scope="singleton"                             生命周期初始化方法
    init-method="init"                                生命周期初始化方法
    destroy-method="destory"                      生命周期销毁方法
    autowire="byType"                             自动装配类型
    factory-method="getInstance"                  bean工厂方法,应用于静态工厂或实例工厂
    factory-bean="com.itheima.factory.BookDaoFactory" 实例工厂bean
    lazy-init="true"                              控制bean延迟加载
/>

1.2.2. 依赖注入相关

此处“简单类型”指基本数据类型和String

<bean id="bookService" class="com,itheima,service.impl,BookServiceImpl">
    <constructor-arg name="bookDao" ref="bookDao"/>   构造器注入引用类型
    <constructor-arg name="userDao" ref="userDao"/>   
    <constructor-arg name="msg" value="WARN"/>        构造器注入简单类型
    <constructor-arg type="java,lang.String" index="3" value="WARN"/> 类型匹配与索引匹配
    <property name="bookDao" ref="bookDao"/>  setter注入引用类型
    <property name="userDao" ref="userDao"/>
    <property name="msg" value="WARN"/>           setter注入简单类型
    <property name="names">                     setter注入集合类型
        <list>                                    list集合
            <value>itcast</value>               集合注入简单类型
            <ref bean="dataSource"/>            集合注入引用类型
        </list>
    </property>
</bean>

2. 三层架构

在 JavaEE 开发中,系统标准的三层架构包括:表现层(web)、业务层(service)、持久层(dao/mapper)。

web层访问service层,service层访问dao层,dao层访问数据库。

层与层之间,只能按照既定的顺序进行调用,不允许跨层调用。

2.1. 表现层 (web)

web层负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求 web 层,web 需要接收 http 请求,完成 http 响应。 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。

2.2. 业务层 (service)

service 层负责业务逻辑处理,web 层依赖业务层,但是业务层不依赖 web 层。 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制)

2.3. 持久层 (dao/mapper)

dao层(也可以叫mapper层)负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。

通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。

2.4. 总结

分层的目的是为了解耦,解耦就是为了降低代码的耦合度,方便项目后期的维护和升级。

1、视图层(web层):用于显示数据和接收用户输入的数据 2、业务逻辑层(service层):负责关键业务的处理和数据的传递 3、数据访问层(dao层):主要负责对数据库的直接访问

如人饮水,冷暖自知。
最后更新于 2023-08-05