Spring

发布于:2024-04-26 ⋅ 阅读:(34) ⋅ 点赞:(0)

一: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的接口

package com.lcyy.dao;

public interface BookDao {
    void save();
}

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

package com.lcyy.pojo;

import com.lcyy.dao.BookDao;

public class BookDaoimpl implements BookDao {
    @Override
    public void save() {
        System.out.println("这是我的第一个spring案例语句");
    }
}

3.在Maven中配置spring

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.31</version>
        </dependency>

4.在resource下配置bean的实例

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

<?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">

    <bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl"></bean>

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

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

import com.lcyy.dao.BookDao;
import com.lcyy.dao.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        //初始IOC化容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("springContext.xml");

        //获取资源BookDao中的
        BookDao bookdao = (BookDao) ctx.getBean("bookdao");
        bookdao.save();
    }
}

 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>在类中书写以下代码

package com.lcyy.Factory;

import com.lcyy.dao.BookDao;
import com.lcyy.pojo.BookDaoimpl;

/**
 * TODO:静态工厂实例化Bean
 */
public class StaticBookFactory {
    public static BookDao getBookDao(){
        System.out.println("静态工厂创建对象");
        return new BookDaoimpl();
    }
}

<3>在springContext.xml配置bean

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

 <1>在Factory包下创建BookdDaoFactory

package com.lcyy.Factory;

import com.lcyy.dao.BookDao;
import com.lcyy.pojo.BookDaoimpl;

/**
 * TODO:实例化工厂
 */
public class BookDaoFactory {
    public BookDao getBookDao(){
        System.out.println("实例化工厂创建对象");
        return new BookDaoimpl();
    }
}

<2> 在springContext.xml配置bean

  <!--实例工厂实现-->
    <bean id="bookDao" class="com.lcyy.Factory.BookDaoFactory"></bean>
    <bean id="userdao" factory-method="getBookDao" factory-bean="bookDao"></bean>
4.bean的生命周期 

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

<2>:代码演示

提供生命周期的控制方法

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 destory(){
        System.out.println("destory...");
    }
}

配置springcontext.xml

<!--init-method:设置bean初始化生命周期回调函数,此处填写init方法名-->
<!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象,此处填写destory方法名-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

 测试类

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

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

六:依赖注入的两种方法

1.setter方法注入

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

package com.lcyy.dao;

public interface BookService {
    void save();
}

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

package com.lcyy.pojo;

import com.lcyy.dao.BookDao;
import com.lcyy.dao.BookService;

public class BookServiceimpl implements BookService {
    private BookDao bookDao;

    @Override
    public void save() {
       this.bookDao.save();
       System.out.println("这是使用set注入的方式");
    }

}

<3> 在springContext.xml配置bean

 <bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl"></bean>
 <!--  setter方法注入 -->  
 <bean id="bookservice" class="com.lcyy.pojo.BookServiceimpl">
        <property name="bookDao" ref="bookdao"/>
    </bean>

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

2.构造方法注入 

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

package com.lcyy.pojo;

import com.lcyy.dao.BookDao;
import com.lcyy.dao.BookService;

public class BookServiceimpl implements BookService {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao){
        System.out.println("这是构造方法注入的方式");
        this.bookDao = bookDao;
    }
}

<2>在springContext.xml配置bean

 <bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl"></bean>
<!--    构造方法注入-->
    <bean id="bookservice" class="com.lcyy.pojo.BookServiceimpl">
        <constructor-arg value="bookDao"/>
    </bean>

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

 七:集合注入

1.数组类型注入

<property name="array">
    <array>
        <value>100</value>
        <value>200</value>
        <value>300</value>
    </array>
</property>

2.list集合注入

<property name="list">
    <list>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>chuanzhihui</value>
    </list>
</property>

3.set集合注入

<property name="set">
    <set>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>boxuegu</value>
    </set>
</property>

4.map集合注入

<property name="map">
    <map>
        <entry key="country" value="china"/>
        <entry key="province" value="henan"/>
        <entry key="city" value="kaifeng"/>
    </map>
</property>

5.properties数据注入

<property name="properties">
    <props>
        <prop key="country">china</prop>
        <prop key="province">henan</prop>
        <prop key="city">kaifeng</prop>
    </props>
</property>

注意:property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签

八:自动装配

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

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

注意:

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

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

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

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

九:总结

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