Spring系统架构知识点总结

1.初识Spring

2.Spring Dramework

2.1学习路线

  1. Aop:面向切面编程

  2. Aspects:AOP思想实现

  3. Core Container:核心容器

  4. Data Access:数据访问

  5. Date Integration:数据集成

  6. Web:web开发

  7. Text:单元测试和集成测试

2.2核心概念

  • IoC(Inversion of Control)控制反转

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

  • Spring技术对IoC思想进行了实现

    • Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的外部

    • IoC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为 Bean

  • DI(Dependence Injection)依赖注入

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

  • 目标:充分解耦

    • 使用IoC容器管理bean (IoC)

    • 在IoC容器内将有依赖关系的bean进行关系绑定 (DI)

  • 最终效果

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

2.3IoC入门案例思路分析

  1. 管理什么? (Service 和Dao)

  2. 如何将被管理的对象告知IoC容器?(配置)

  3. 被管理的对象交给IoC容器,如何获取到IoC容器? (接口)

  4. IoC容器得到后,如何从容器中获取bean?(接口方法)

  5. 使用Spring导入那些坐标? (pom.xml)

IOC入门案例

1.导入spring坐标
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
2.定义Spring管理的类(接口)
public interface BookDao {
    public void save();
}
​
​
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
3.创建Spring配置文件,配置对应类作为Spring管理的bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
​
<!--    1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE-->
​
<!--    2.配置bean
        bean标签表示配置bean
        id属性表示bean起名字
       class属性表示给bean定义类型
-->
    <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl"></bean>
    <bean id="bookService" class="com.wen.service.impl.BookServiceImpl"></bean>
</beans>
4.初始化IOC容器(Spring核心容器/Spring容器),通过容器获取bean
    public static void main(String[] args) {
        //3.获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //4.获取bean(根据bean配置id获取)
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        bookDao.save();
​
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
​
    }

2.4 DI入门案例思路分析

  1. 基于IoC管理bean

  2. Service中使用new形式创建的Dao对象是否保留?(否)

  3. Service中需要的Dao对象如何进入到Service中?(提供方法)

  4. Service与Dao间的关系如何描述?(配置)

DI入门案例(XML版)

1.删除使用的new的形式创建的对象
public class BookServiceImpl implements BookService{
    private BookDao bookDao = new BookDaoImpl();
    public void save(){
        bookDao.save();
    }
}
2.提供依赖对象对应的setter方法
public class BookServiceImpl implements BookService {
    //5.删除业务层中使用new的方式创建的dao对象
    private BookDao bookDao;
​
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
    //6.提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
3.配置service与dao之间的关系
<bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.wen.service.impl.BookServiceImpl">
<!--        7.配置service与dao的关系
            property标签表示配置当前的bean
            name的属性表示配置哪一个具体的属性(方法)
            ref表示这个属性(方法)参考哪一个bean
-->
        <property name="bookDao" ref="bookDao"/>
    </bean>

3.1bean作用范围说明

  • 为什么bean默认为单例?

  • 适合给容器进行管理的bean

    • 表现层对象

    • 业务层对象

    • 数据层对象

    • 工具对象

  • 不适合交给容器的进行管理的bean

    • 封装实体的域对象

3.2bean实例化

  • bean本质上就是对象,创建bean使用构造方法完成

实例化bean的三种构造方法
1.提供可访问 的构造方法
public class BookDaoImpl implements BookDao {
​
//    public BookDaoImpl() {
//        System.out.println("book dao constructor is running ....");
//    }
​
    public void save() {
        System.out.println("book dao save ...");
    }
​
}
​
  • 配置

        <bean id="bookDao"  class="com.wen.dao.impl.BookDaoImpl"/>
  • 无参构造方法如果不存在,,将抛出异常BeanCreationException

2.静态工厂
public class OrderDaoFactory{
    public static OrderDao getOrderDao(){
        return new OrderDaoImpl();
    }
}
  • 配置

    <bean
          id = "orderDao"
          factory-method = "getOrderDao"
          class="com.wen.factory.OrderDaoFactory"
          />

3.实例工厂
  • FactoryBean

public class UserDaoFactoryBean implement FactoryBean<UserDao>{
    public UserDao getObject() throws Exception{
        return new UserDaoImpl();
    }
    public Class<?> getObjectType(){
        return UserDao.class;
    }
}
  • 配置

<!--    方式四:使用FactoryBean实例化bean-->
    <bean id="userDao" class="com.wen.factory.UserDaoFactoryBean"/>

3.3bean生命周期

  • 生命周期:从创建到消亡的完整过程

  • bean生命周期:bean从创建到消亡的整体过程

  • bean生命周期控制:在bean创建后到销毁前做一些事情

  1. 初始化容器

    1. 创建对象(内存分配)

    2. 执行构造方法

    3. 执行属性注入(set操作)

    4. 执行bean初始化方法

  2. 使用bean

    1. 执行业务操作

  3. 关闭销毁bean

    1. 执行bean销毁方法

3.4bean生命周期控制

  • 提供生命周期控制方法

    public class BookDaoImpl implements BookDao {
        public void save() {
            System.out.println("book dao save ...");
        }
        //表示bean初始化对应的操作
        public void init(){
            System.out.println("init...");
        }
        //表示bean销毁前对应的操作
        public void destroy(){
            System.out.println("destory...");
        }
    ​
    }
  • 配置生命周期控制方法

        <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
    ​
  • 接口控制InitializingBean, DisposableBean接口

    public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
        private BookDao bookDao;
    ​
        public void setBookDao(BookDao bookDao) {
            System.out.println(&quot;set .....&quot;);
            this.bookDao = bookDao;
        }
    ​
        public void save() {
            System.out.println(&quot;book service save ...&quot;);
            bookDao.save();
        }
    ​
        public void destroy() throws Exception {
            System.out.println(&quot;service destroy&quot;);
        }
    ​
        public void afterPropertiesSet() throws Exception {
            System.out.println(&quot;service init&quot;);
        }
    }g

    关闭容器

    • close()

    • registerShutdownHook()

4.1依赖注入

  • 思考:向一个类中传递数据的方式有几种?

    • 普通方法(set方法)

    • 构造方法

  • 思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或是字符串呢?

    • 引用类型

    • 简单类型(基本数据类型与String)

  • 依赖注入方式

    • setter注入

      • 简单类型

      • 引用类型

    • 构造器注入

      • 简单类型

      • 引用类型

setter注入---简单类型
  1. 在bean中定义引用类型属性并提供可访问的set方法

        private String databaseName;
        
            public void setDatabaseName(String databaseName) {
            this.databaseName = databaseName;
        }
    ​

  2. 配置中使用property标签value属性注入简单类型数据

        <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl">
            <property name="databaseName" value="mysql"/>
        </bean>

构造器注入---引用类型(了解)

  1. 在bean中定义引用类型属性并提供可访问的构造方法

    public class BookServiceImpl implements BookService{
        private BookDao bookDao;
        private UserDao userDao;
    ​
        public BookServiceImpl(BookDao bookDao, UserDao userDao) {
            this.bookDao = bookDao;
            this.userDao = userDao;
        }
    }
  2. 配置中使用constructor-arg标签ref属性注入引用类型对象

        <bean id="userDao" class="com.wen.dao.impl.UserDaoImpl"/>
        <bean id="bookService" class="com.wen.service.impl.BookServiceImpl">
            <constructor-arg name="bookDao" ref="bookDao"/>
            <constructor-arg name="userDao" ref="userDao"/>

构造器注入--简单类型(了解)

  1. 在bean中定义引用类型属性并提供可访问的set方法

    public class BookDaoImpl implements BookDao {
        private String databaseName;
        private int connectionNum;
    ​
        public BookDaoImpl(String databaseName, int connectionNum) {
            this.databaseName = databaseName;
            this.connectionNum = connectionNum;
        }
    ​
        public void save() {
            System.out.println("book dao save ..."+databaseName+","+connectionNum);
        }
    }
    ​
  2. 配置中使用constructor-arg标签value属性注入简单类型数据

    <!--    <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl">-->
    <!--        <constructor-arg name="connectionNum" value="100"/>-->
    <!--        <constructor-arg name="databaseName" value="mysql"/>-->
    ​
    <!--    </bean>-->

4.2依赖自动装配

  • Ioc容器根据bean所依赖的资源在容器中自动查找并注入到bean的过程叫自动装配

  • 自动装配方式

    • 按类型

    • 按名称

    • 按构造方法

配置中使用bean标签autowire属性设置自动装配的类型

 <bean id="userDao" class="com.wen.dao.impl.BookDaoImpl"/>
​
    <bean id="bookService" class="com.wen.service.impl.BookServiceImpl" autowire="byType"/>
​

4.3集合注入

        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>pp</value>
                <value>kk</value>
                <value>jj</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>100</value>
                <value>200</value>
                <value>300</value>
                <value>300</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="shanxi"/>
                <entry key="city" value="xin"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">shanxi</prop>
                <prop key="city">xin</prop>
            </props>
        </property>

5.1第三方资源配置管理

导入druid坐标

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.16</version>
    </dependency>

配置数据源对象作为spring管理的bean

    <bean id="dataSource"  class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc//:mysql://localhost:3306/spring_db"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

5.2加载properties配置信息

开启context命名空间

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd

使用context命名空间,加载指定properties文件

        2.使用context空间加载properties文件
-->
    <context:property-placeholder location="jdbc.properties"/>
<!--    3.使用属性站位符${}读取properties中的属性-->
    <bean  class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
​
    <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl">
            <property name="name" value="${}"/>
    </bean>
​

6.1容器

创建

  • ClassPathXmlApplicationContext

  • FileSystemXmlApplicationContext

BeanFactory是Ioc容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载 (lazy-init="true")

ApplicationContext接口是Spring容器的核心接口,初始化bean立即加载

ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能

3.注解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值