• Spring


    一:Spring简介

    • Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>90%

    • 学习spring是为了什么:
      • 简化开发,降低企业级开发的复杂性

      • 框架整合,高效整合其他技术,提高企业级应用开发与运行效率

      • 官网:Spring | Home

     二:Spring体系框架图

    其中,SpringFramework是学习spring框架的基础,因此,SpringFramework的体系框架图如下:

     三:Spring核心概念

    1.IOC(Inversion of Control )控制反转

    使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。通俗的讲就是“将new对象的权利交给Spring,我们从Spring中获取对象使用即可”

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

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

    2.DI(Dependency Injection ) 依赖注入

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

     四:spring的简单实现

    1.创建一个Maven项目

    在dao层创建一个BookDao的接口

    1. package com.lcyy.dao;
    2. public interface BookDao {
    3. void save();
    4. }

    2.创建一个pojo包,在pojo包下写实现类

    1. package com.lcyy.pojo;
    2. import com.lcyy.dao.BookDao;
    3. public class BookDaoimpl implements BookDao {
    4. @Override
    5. public void save() {
    6. System.out.println("这是我的第一个spring案例语句");
    7. }
    8. }

    3.在Maven中配置spring

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-contextartifactId>
    4. <version>5.3.31version>
    5. dependency>

    4.在resource下配置bean的实例

    在resource中建立spring的核心配置文件springContext.xml

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl">bean>

        注意:
            bean标签:表示配置bean
            id属性:表示给bean起名字
            class属性:表示给bean定义类型

     5.建立主类App,供测试使用

    1. import com.lcyy.dao.BookDao;
    2. import com.lcyy.dao.BookService;
    3. import org.springframework.context.ApplicationContext;
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;
    5. public class App {
    6. public static void main(String[] args) {
    7. //初始IOC化容器
    8. ApplicationContext ctx = new ClassPathXmlApplicationContext("springContext.xml");
    9. //获取资源BookDao中的
    10. BookDao bookdao = (BookDao) ctx.getBean("bookdao");
    11. bookdao.save();
    12. }
    13. }

     6.运行结果

    可以看出,我们没有new去创建对象,而是去获取ioc容器,交给ioc容器去创建对象,再通过容器去获取对象。

    五:Bean

     1.bean的基础配置

    2.bean的别名配置

     注意:别名配置name属性可以有多个,用空格,分号,逗号隔开

    3.bean的作用域

    scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。比如:request表示保存到request域中 。

    在我们的实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

     4.bean的实例化

    有三种方法可以实例化bean

    1.通过构造器实例化bean

    在第四步的spring的简单实现中,我们就是通过无参构造器实例化了bean

    2.静态工厂实例化bean

    <1>首先我们建立一个Factory的包,在包下建立一个类

    <2>在类中书写以下代码

    1. package com.lcyy.Factory;
    2. import com.lcyy.dao.BookDao;
    3. import com.lcyy.pojo.BookDaoimpl;
    4. /**
    5. * TODO:静态工厂实例化Bean
    6. */
    7. public class StaticBookFactory {
    8. public static BookDao getBookDao(){
    9. System.out.println("静态工厂创建对象");
    10. return new BookDaoimpl();
    11. }
    12. }

    <3>在springContext.xml配置bean

    1. <bean id="bookDao" class="com.lcyy.Factory.StaticBookFactory" factory-method="getBookDao">bean>
    3.实例工厂实例化bean

     <1>在Factory包下创建BookdDaoFactory

    1. package com.lcyy.Factory;
    2. import com.lcyy.dao.BookDao;
    3. import com.lcyy.pojo.BookDaoimpl;
    4. /**
    5. * TODO:实例化工厂
    6. */
    7. public class BookDaoFactory {
    8. public BookDao getBookDao(){
    9. System.out.println("实例化工厂创建对象");
    10. return new BookDaoimpl();
    11. }
    12. }

    <2> 在springContext.xml配置bean

    1. <bean id="bookDao" class="com.lcyy.Factory.BookDaoFactory">bean>
    2. <bean id="userdao" factory-method="getBookDao" factory-bean="bookDao">bean>
    4.bean的生命周期 

    <1>:生命周期:从创建到消亡的整个过程

    <2>:代码演示

    提供生命周期的控制方法

    1. public class BookDaoImpl implements BookDao {
    2. public void save() {
    3. System.out.println("book dao save ...");
    4. }
    5. //表示bean初始化对应的操作
    6. public void init(){
    7. System.out.println("init...");
    8. }
    9. //表示bean销毁前对应的操作
    10. public void destory(){
    11. System.out.println("destory...");
    12. }
    13. }

    配置springcontext.xml

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

     测试类

    1. public class AppForLifeCycle {
    2. public static void main( String[] args ) {
    3. //此处需要使用实现类类型,接口类型没有close方法
    4. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("springContext.xml");
    5. BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    6. bookDao.save();
    7. //关闭容器,执行销毁的方法
    8. ctx.close();
    9. }
    10. }

    注意:此时要手动关闭资源 

    六:依赖注入的两种方法

    1.setter方法注入

    <1>在dao层下创建一个BookService接口

    1. package com.lcyy.dao;
    2. public interface BookService {
    3. void save();
    4. }

    <2>在pojo包下创建一个实现类

    1. package com.lcyy.pojo;
    2. import com.lcyy.dao.BookDao;
    3. import com.lcyy.dao.BookService;
    4. public class BookServiceimpl implements BookService {
    5. private BookDao bookDao;
    6. @Override
    7. public void save() {
    8. this.bookDao.save();
    9. System.out.println("这是使用set注入的方式");
    10. }
    11. }

    <3> 在springContext.xml配置bean

    1. <bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl">bean>
    2. <bean id="bookservice" class="com.lcyy.pojo.BookServiceimpl">
    3. <property name="bookDao" ref="bookdao"/>
    4. bean>

    注意:中的ref 属性对应的是id="bookdao"的实现类

    2.构造方法注入 

    <1>在pojo包下创建一个实现类

    1. package com.lcyy.pojo;
    2. import com.lcyy.dao.BookDao;
    3. import com.lcyy.dao.BookService;
    4. public class BookServiceimpl implements BookService {
    5. private BookDao bookDao;
    6. public void setBookDao(BookDao bookDao){
    7. System.out.println("这是构造方法注入的方式");
    8. this.bookDao = bookDao;
    9. }
    10. }

    <2>在springContext.xml配置bean

    1. <bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl">bean>
    2. <bean id="bookservice" class="com.lcyy.pojo.BookServiceimpl">
    3. <constructor-arg value="bookDao"/>
    4. bean>

    注意: constructor-arg标签下的value对用的是BookServiceimpl类中setBookdDao中的参数

     七:集合注入

    1.数组类型注入

    1. <property name="array">
    2. <array>
    3. <value>100value>
    4. <value>200value>
    5. <value>300value>
    6. array>
    7. property>

    2.list集合注入

    1. <property name="list">
    2. <list>
    3. <value>itcastvalue>
    4. <value>itheimavalue>
    5. <value>boxueguvalue>
    6. <value>chuanzhihuivalue>
    7. list>
    8. property>

    3.set集合注入

    1. <property name="set">
    2. <set>
    3. <value>itcastvalue>
    4. <value>itheimavalue>
    5. <value>boxueguvalue>
    6. <value>boxueguvalue>
    7. set>
    8. property>

    4.map集合注入

    1. <property name="map">
    2. <map>
    3. <entry key="country" value="china"/>
    4. <entry key="province" value="henan"/>
    5. <entry key="city" value="kaifeng"/>
    6. map>
    7. property>

    5.properties数据注入

    1. <property name="properties">
    2. <props>
    3. <prop key="country">chinaprop>
    4. <prop key="province">henanprop>
    5. <prop key="city">kaifengprop>
    6. props>
    7. property>

    注意:property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写标签

    八:自动装配

     依赖自动装配,使用属性autowire

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    2. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

    注意:

    1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作

    2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用

    3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用

    4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

    九:总结

    以上是学习spring的一些基本概念和使用方法,希望对读者能有所帮助,下期我将继续更新有关spring的相关知识。

  • 相关阅读:
    nvm 配置国内镜像
    JavaSE---栈和队列
    比例-积分-微分 (PID) 鲁棒控制及电流反馈以确保 UPS 的稳定性(Matlab代码实现)
    Java数据库连接-JDBC
    Leetcode 01-算法入门与数组-②数组基础
    Pinely Round 2 (Div. 1 + Div. 2) F. Divide, XOR, and Conquer(区间dp)
    Jekyll如何自定义摘要
    Linux文件编程(open read write close函数)
    PolarDB 卷来卷去 云原生低延迟强一致性读 1 (SCC READ 译 )
    计算机毕业设计Java校园易购二手交易平台(源码+系统+mysql数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/2301_76613040/article/details/138194102